去年双十一期间,我接了一个需求:从一个拥有百万级商品图片的电商网站上,批量下载所有高清图片用于算法训练。刚开始写了个简单的单线程爬虫,每秒钟只能下载3-5张图片,按照这个速度,下载完所有图片需要整整一个星期。后来我改用了多线程技术,特别是Python标准库中的concurrent.futures模块,下载速度直接提升了20倍以上。原本需要一周的任务,现在只需要大半天就能完成。这就是并发爬虫的魅力。在这篇文章里,我会把整个实战经验详细地分享出来,包括我踩过的坑、优化的思路、以及完整可运行的代码。文章会很长,但保证每一个知识点都是我用代码一行行验证过的。一、为什么图片下载场景特别适合多线程?1.1 从I/O密集型任务说起CPU密集型和I/O密集型是两个完全不同的概念。图片下载属于典型的I/O密集型任务,原因很简单:当你发送一个HTTP请求去获取一张图片时,从发出请求到收到完整的图片数据,绝大部分时间网络都在“空转”——你的CPU实际上处于等待状态。以一张500KB的图片为例:网络传输时间:大约200-500毫秒(取决于网速和服务器响应)CPU处理时间:几乎可以忽略不计(只是把字节流保存到文件)在单线程模式下,这200-500毫秒的等待时间就被白白浪费了。如果我们开10个线程,在第一个线程等待网络响应的时候,第二个线程可以发起新的请求,以此类推。这样一来,单位时间内下载的图片数量就接近线性增长。1.2 一次真实的速度对比实验我做了一个对比测试,下载500张图片(每张大约300