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

2018-01-04 11:55:55 +08:00
 Nick2VIPUser

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

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

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

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

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

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

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

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

多线程跑的话,一般情况下 10-12 左右是最快的,更增加更多的线程速度反而会下降。
liupanhi
2018-01-04 14:29:23 +08:00
@wzwwzw 长见识了,这么多好东西!

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

https://www.v2ex.com/t/419951

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

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

© 2021 V2EX