(请教)如何提高爬虫的效率/采集速度

2018 年 1 月 4 日
 Nick2VIPUser

最近做了一个爬虫任务,大概需要采集百万级的页面。 使用如下技术:

python3
requests
xpath(解析)
多线程(threading)
代理 ip 池(95%有效,10 次 /1s 最多)
redis(请求队列, 去重)
mysql(储存)

同时做好容错处理(重连)/反爬机制应对。 经过几次测试:控制

 [线程数量] 
 [进程数量] 
 [重连等待时间] 
 [报错等待时间] 

得出一组每分钟采集最多数量的方案。 似乎遇到了瓶颈,此时不知道如何去优化采集速度。 没有想到的等会补充。。。 请教有经验的大神指点一下思路!谢谢各位了!!!

11861 次点击
所在节点    程序员
51 条回复
ilovebaicai
2018 年 1 月 4 日
Scrpy+redis 是一个选择。![scrapy-redis]( https://github.com/rmax/scrapy-redis)
ilovebaicai
2018 年 1 月 4 日
抱歉,手抖,少打了个 a。
wzwwzw
2018 年 1 月 4 日
如果不用 scrapy 的话,就用
- aiohttp
- asyncio
- aiosocks
- Pool
毕竟爬虫大部分时间都是在等待请求,所以异步应该会快很多。

数量多的话还是推荐 scrapy ,分布式 scrapy-redis .
exiaohao
2018 年 1 月 4 日
把采集任务丢给 celery 处理
dhcn
2018 年 1 月 4 日
pyspider,帮你完成包括人物分发在内的大多数技术基础设施工作
so1n
2018 年 1 月 4 日
可以改用进程+协程
zhchyu999
2018 年 1 月 4 日
难道没人吐槽“代理 ip 池(95%有效,10 次 /1s 最多)”这个么
BiggerLonger
2018 年 1 月 4 日
grequests
harker
2018 年 1 月 4 日
当前方案有问题么?百万级应该还能应付吧
Nick2VIPUser
2018 年 1 月 4 日
@ilovebaicai
@wzwwzw
非常感谢,我尝试分别用 scrapy 和 async/await 做一下测试,然后再对比一下效率!
qsnow6
2018 年 1 月 4 日
百万级应该没啥问题啊,大部分时间都是在网络耗时上面。
不过,切换线程是有开销的,如果想进一步提升性能的话,建议用异步 or 协程。
asuraa
2018 年 1 月 4 日
百万级别重要的我觉得是

1. 代理
2. 断点续传
3. 非阻塞多线程
asuraa
2018 年 1 月 4 日
Nick2VIPUser
2018 年 1 月 4 日
@exiaohao
@so1n
实际上我才使用十几个线程并发,cpu 资源远远够用,感觉可能是并发请求量或者是带宽的问题。
Nick2VIPUser
2018 年 1 月 4 日
@dhcn
这个框架没用使用过,会考虑了解一下特性以作比较!谢谢!
Nick2VIPUser
2018 年 1 月 4 日
@BiggerLonger
requests 换为 frequests 的话代码可能会变动比较大吧?刚刚只是粗略的看了一下 frequests 的 demo。
Nick2VIPUser
2018 年 1 月 4 日
@qsnow6
谢谢您,主要想提升采集速度,测试过 10/15/20 个线程的采集速度,结果发现 10 个线程的采集速度是最快的,非常困惑。这里每次请求都使用不同的经过测试的代理 IP,不知道是不是带宽限制导致。
MontagePa
2018 年 1 月 4 日
celery 这个,然后你再多线程,考虑好去重就行。
qsnow6
2018 年 1 月 4 日
@Nick2VIPUser 不是带宽限制,应该是切换线程的问题;

多线程跑的话,一般情况下 10-12 左右是最快的,更增加更多的线程速度反而会下降。
liupanhi
2018 年 1 月 4 日
@wzwwzw 长见识了,这么多好东西!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/419951

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX