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

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

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

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

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

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

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

10971 次点击
所在节点    程序员
51 条回复
NxnXgpuPSfsIT
2018-01-04 14:37:40 +08:00
@Nick2VIPUser 可以试试 Trip, 替换 requests 比较方便,github.com/littlecodersh/trip
急用的话可以直接 gevent 碰碰运气。
qsnow6
2018-01-04 14:55:13 +08:00
给个参考值,scrapy 单进程可以达到 7200 pages/min
lhx2008
2018-01-04 15:02:50 +08:00
每天 6-8 万就是每秒才爬 1 个,开了 10 个线程的话就是平均一个线程 10s 爬一条,这也太不理想了吧,每个线程 1s 爬一条,一天就 80 万了
bazingaterry
2018-01-04 15:06:43 +08:00
上 scrapy,而且掏錢買代理池吧
2ME
2018-01-04 15:07:31 +08:00
你服务器如果不是小水管的话 你爬的是大文本吗? 大文本的话主要是 IO 影响效率 和线程关系并不大 还有你 1 条记录需要爬取几个页面 以及你的 IP 池质量如何 如果是 1 个页面并且爬取目标不是大文本,ip 池质量优异的话 这个速度可能慢了点 如果你为了对抗反爬虫 sleep 的时间比较久还是正常的
Zzzzzzzzz
2018-01-04 15:09:10 +08:00
铺节点+队列+代理池, 问题是你得考虑下目标站能不能扛住你的 CC
windfarer
2018-01-04 15:10:35 +08:00
百万级又不多,单机 scrapy 都够用了吧,主要代理要好
Nick2VIPUser
2018-01-04 16:35:56 +08:00
@zhchyu999
这个为什么会被吐槽呀?公司有自己的代理池,但是数量较少;目标站点反爬策略比较敏感,所以使用付费的代理 IP 池,每次请求都会使用不同的 IP。
Nick2VIPUser
2018-01-04 16:37:43 +08:00
@qsnow6 不知道是不是线程一多了网络堵塞导致的采集速度过慢。
Nick2VIPUser
2018-01-04 16:39:18 +08:00
@luodaoyi
代理 /断点续爬 /去重都做了,非阻塞的意思就是用协程或是异步?我去看看您发的链接 谢谢
Nick2VIPUser
2018-01-04 16:58:54 +08:00
@qsnow6
@lhx2008
@bazingaterry
这个网站产生的详情页面的 url 和 cookie 有效期都很短,
针对同一个 cookie 在短时间内高频率(大概是小于 1 次 /1s )的访问会立即失效
大概是用来区分是否是机器人

其实为什么每秒才爬一个,是因为对于 10 个线程每个线程都做了延时。每个线程获得一个新的 cookie 后每次请求都会间隔 3 秒,否则就会大量的报异常。这样的话,整体来说最优的情况每秒也只发出了 3 个请求,还没算上`去重入库解析异常处理`的时间。

现在思路也比较清晰,就是提高并发量,尝试加了线程和进程,并没有效果。
所以在研究把异步网络加上来。
Nick2VIPUser
2018-01-04 17:14:34 +08:00
@2ME 除了 sleep,还设置了 Connect time out 和 Read time out ( Proxy Connect time out 异常较少),同时也发现 Read time out 频繁发生,是否是从代理 ip 读取数据的时候超时,也就意味代理发送请求失败或者回传给本地失败?
2ME
2018-01-04 17:44:33 +08:00
@Nick2VIPUser 那就是你代理 ip 质量太差了 加钱数据可及 readtimeout 频繁 每天抓 6-8 万很正常了
2ME
2018-01-04 17:48:00 +08:00
@Nick2VIPUser 你 debug 一下基本就会发现绝大多数时间都浪费在超时了 即使是小水管都够呛能跑满带宽
gouchaoer
2018-01-04 17:54:08 +08:00
第一代理 ip 不够
gouchaoer
2018-01-04 17:54:43 +08:00
第一次看到爬虫自己是瓶颈的,大家都是怕爬坏了别人
Nick2VIPUser
2018-01-04 18:07:54 +08:00
@Zzzzzzzzz
@windfarer
目前还没有用 scrapy,并发太高,怕抓回来一堆异常。也在慢慢的加并发量,尽量不给网站造成太大压力。
Nick2VIPUser
2018-01-04 18:09:32 +08:00
@2ME 有道理,我增加额外的 ip 代理测试一下,感谢!
Nick2VIPUser
2018-01-04 18:11:23 +08:00
@gouchaoer 硬性条件没有提升起来呀,如果不考虑其他要花钱 /额外设备的条件,固定一台主机固定带宽,如果要增加速度还有什么办法?
qsnow6
2018-01-04 18:35:42 +08:00
加钱买多点代理就行了

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

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

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

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

© 2021 V2EX