其他版本
之前写多线程/多进程爬虫一直没有用到第三方库,后来看了 gevent 的文档,觉得可以来试试。觉得还是拿妹子爬虫来试可能比较好一点,毕竟兴趣是最好的老师...
主要是使用了 gevent 的 Pool 模块,是一个 greenlets
池(协程)。然后使用标准库 queue 作队列。
关于 queue 官方的介绍如下
The queue module implements multi-producer, multi-consumer queues. It is especially useful in threaded programming when information must be exchanged safely between multiple threads.
queue 是线程安全的,也就是不存在同时读写同一个 item 的情况。在 queue 的基础上,我新增了重试限制功能,避免无限次对一个 item 进行重试。
(机器配置 i7 7700 HQ + 16G RAM)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
82 chenjia+ 20 0 864420 102984 10172 S 3.3 0.6 0:08.90 python
可以看到,实际占用的资源是非常少的,效率是极高的。并且网速也就基本是接近满速的。
图片地址数据保存在了 data.txt
,共 17w+ 张照片,图片的数据是我从 mmjpg 和 mzitu 里提取出来的。
$ wc -l data.txt
178075 data.txt
$ git clone https://github.com/chenjiandongx/photo-gevent.git
$ cd photo-gevent
$ pip install -r requirements.txt # 安装依赖
$ python core.py
图片名是经过 hash 过的唯一值(重名的概率基本为 0),所以在任意时间 Ctrl+C
暂停项目后都可以随时启动继续下载,会自动跳过重名图片。大大的提高效率。
最终成果
朦胧美
MIT ©chenjiandongx