用Python抓取图片,使用wget下载速度慢怎么办?

1、clone

git clone https://github.com/pmthink/get_pic_for_4chan.git

2、install

cd get_pic_for_4chan

pip3 install -r install.txt

3、download

python3 get2.py

demo

demo

说明,本来想用多线程的,但是搞来稿去,觉得还是 wget 简单粗暴有效。

后续,打算做成 sqlite 的,把每个图片存进去,以便日后更新时不重复下载。

当然,为了追溯,最好能用区块链把图片的指纹给上链,哈哈哈。

声明,本程序默认下载 diy 频道的手工制作方面的图片,你们若用这个爬虫下载其他频道的东西,毁了三观可和我无关。


用Python抓取图片,使用wget下载速度慢怎么办?

17 回复

迅雷了解下


用Python抓取图片时,如果直接用wget库或者subprocess调用系统wget命令感觉慢,通常是因为它缺少并发和连接池管理。更高效的做法是直接用requests配合ThreadPoolExecutor来并发下载,或者上aiohttp搞异步。

下面给你个用requests和线程池的实用例子,速度会快很多:

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from urllib.parse import urlparse
import os

def download_image(img_url, save_dir='./images'):
    """下载单张图片到指定目录"""
    try:
        # 创建保存目录
        os.makedirs(save_dir, exist_ok=True)
        
        # 从URL提取文件名
        parsed_url = urlparse(img_url)
        filename = os.path.basename(parsed_url.path) or 'downloaded_image.jpg'
        filepath = os.path.join(save_dir, filename)
        
        # 设置请求头模拟浏览器
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
        
        # 流式下载大文件
        response = requests.get(img_url, headers=headers, stream=True, timeout=30)
        response.raise_for_status()
        
        # 写入文件
        with open(filepath, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                if chunk:
                    f.write(chunk)
        
        print(f"下载成功: {filename}")
        return True
        
    except Exception as e:
        print(f"下载失败 {img_url}: {e}")
        return False

def batch_download_images(img_urls, max_workers=10):
    """并发下载多张图片"""
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        # 提交所有下载任务
        future_to_url = {executor.submit(download_image, url): url for url in img_urls}
        
        # 等待所有任务完成
        for future in as_completed(future_to_url):
            url = future_to_url[future]
            try:
                future.result()
            except Exception as e:
                print(f"任务异常 {url}: {e}")

# 使用示例
if __name__ == "__main__":
    # 你的图片URL列表
    image_urls = [
        'https://example.com/image1.jpg',
        'https://example.com/image2.jpg',
        # ... 更多URL
    ]
    
    # 并发下载,max_workers控制并发数
    batch_download_images(image_urls, max_workers=5)

核心改进点:

  1. 并发下载ThreadPoolExecutor 同时下载多个图片,充分利用带宽
  2. 流式写入iter_content 避免大文件内存溢出
  3. 超时控制:设置timeout防止卡死
  4. 错误处理:单个失败不影响其他下载

简单总结: 弃用wget,用requests+线程池做并发下载是更Pythonic和高效的选择。

搞出一堆下载链接,然后扔在迅雷里面不就好了么 - -

楼上+1,把下载链接整理好,批量导入专门的下载工具

1.下载工具
2.多个 wget 一起来,我以前就是这样


3.pip install wget
import wget
……

以前懒省事,也用 python 采集图床,直到下载到两三百兆大小的 GIF 文件,把 python 拖崩溃

python 调用迅雷的 SDKServer 了解下?

RPC 调用 aria2 怎么样

这个比较好,至少可以丢到服务器上去下载。

还好有最后一句,要不谁知道是 hm 还是 hc …

switch fork()
case 0: execl(blah blah)

aria2 的链接文件批量下载了解一下,还能重用 HTTP 连接。

调用 wget,还不如调用 axel,多线程,而且还不怕网络中断

系统命令调用 wget &😉

我用 requests。。感觉还可以

requests 很慢啊

回到顶部