爬虫: asyncio+aiohttp 比 scrapy 还快吗?

2018-02-19 22:46:40 +08:00
 drroot

每天爬 1 百万网页,用 1000 个代理( 50%有效)

获取的是 json 文件,把每个结果输出到同一个 csv 文件里

对于异常或 timeout 的访问,希望自动尝试新代理,最多尝试三次

asyncio+aiohttp 是否比 Scrapy 更快 也更稳定呢?

6069 次点击
所在节点    问与答
14 条回复
gouchaoer
2018-02-19 23:58:25 +08:00
首先 100w 数据量并不大,每个爬虫每 5s 访问一次的话只需要 65 个爬虫进程一天就能爬完 100w,假设我拿 200 个爬虫来爬,那这种程度的单机就能扛住,就阻塞的 requests 就 ok 了。。。so 大部分定制爬虫瓶颈不在 cpu
gouchaoer
2018-02-20 00:01:05 +08:00
你输出到 csv 如何去重?结果需要保存到数据库,并且爬数据的时候去数据库看是否重复
swirling
2018-02-20 10:20:04 +08:00
@gouchaoer 从性能上分析得很好,我从另一个角度说两句. 对于 output 格式的统一处理, 如果你用 scrapy 是可以很容易切换文件或者是 database 的,只需要换 pipline. 对于 timeout 重试这些只需要配置就行了. 部署工具链一套全家桶, 我反正跑了快半年也没挂过. 你用 asyncio 要自己写的东西肯定更多. 除非你觉得你比别人聪明, 不然你出错的概率更大, 也更不稳定.
gouchaoer
2018-02-20 10:32:15 +08:00
@swirling
不是我太聪明,是大家把问题复杂化了,爬东西本身就是个简单的问题,scrapy 封装太厉害了,比如实现 lz 这个更换代理 3 次你 scrapy 怎么搞?去读文档写 hook 么?我手写的直接写逻辑就 ok 了。。。算了,反正你用起来爽就行
drroot
2018-02-20 10:33:27 +08:00
@gouchaoer 每条记录大小在 10KB 左右,所以 100 万网页,需要在 7 小时内下载 10GB 的数据
drroot
2018-02-20 10:36:16 +08:00
@swirling 现在是想先输出成 csv,以后从 csv 导入各种数据库再行处理,也很方便哒
gouchaoer
2018-02-20 10:39:52 +08:00
@drroot 你不考虑爬虫只是考虑代理和带宽的话,用异步或者半协程的确能提高速度,go 和 php 甚至有 fullstack 的协程 httpclient,在低 cpu 下打满带宽,但是一般情况下搞爬虫的精力还在和反爬搏斗,你这种瓶颈在代理 ip 上,直接堆机器吧
drroot
2018-02-20 10:47:20 +08:00
@swirling Scrapy 有没办法把访问每个网址是否成功的状态返回,如果没有成功返回或者 timeout 或者有 exception,就把这个网址放入 pool,下次循环对这个 pool 里没有成功访问的网址重新运行?
swirling
2018-02-20 10:53:59 +08:00
https://github.com/aivarsk/scrapy-proxies
直接撸个 middleware 上去. 如果觉得他不符合需求再自己写.
gouchaoer
2018-02-20 11:18:25 +08:00
🙄看来我干了 2 年全职爬虫还是有积累的
inflationaaron
2018-02-20 23:45:18 +08:00
这个还是看语言,我用 aiohttp + asyncio + uvloop 写的就是没有 Go 的多线程快。如果资源有限的话用手动管理内存可能更好一点?
drroot
2018-02-22 14:46:15 +08:00
@inflationaaron 相比 scrapy 呢?
inflationaaron
2018-02-22 23:29:25 +08:00
@drroot 比 scrapy 简单,而且速度更快。说到底 scrapy 是用 Twisted 的,可以看看 uvloop 的 benchmark:

https://magic.io/blog/uvloop-blazing-fast-python-networking/

性能可以赶上单核 Go 了,但是没有办法利用多核就是硬伤。
rocketman13
2018-08-16 11:16:09 +08:00
你用 asyncio+aiohttp 遇到过什么坑吗?例如没有任何反爬措施的 api 会请求超时,同样的 api 如果用 request 就能随便拿到数据这种。。。。

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

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

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

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

© 2021 V2EX