如何用Gevent更快速的异步爬取内容

2012-09-14 00:03:56 +08:00
 cabinw
其实也不一定要用gevent,不过用了gevent之后效果的确不错

情况是这样,从IMDB id tt0000000 到 tt9999999遍历访问一遍豆瓣的电影信息,并保存电影信息。如果只是用线程,然后gevent.joinall(threads),效果好像不是很明显,有什么更好的办法么?

初学gevent,还处于不会的状态
8952 次点击
所在节点    Python
35 条回复
Livid
2012-09-14 00:05:14 +08:00
Celery or RQ is better for such scenario.
cabinw
2012-09-14 00:06:12 +08:00
@Livid 3x~
phuslu
2012-09-14 00:08:49 +08:00
gevent.pool.spawn + httplib2
Brutal
2012-09-14 00:25:11 +08:00
queue 然后 q.get()
reus
2012-09-14 00:33:21 +08:00
requests + multiprocessing.Pool
cabinw
2012-09-14 00:42:04 +08:00
@phuslu @Brutal @reus 感谢给出的各种方案,我都去了解下
btwo
2012-09-14 10:38:07 +08:00
有测试结果了也请贴出来,一起学习下!
muxi
2012-09-14 10:50:49 +08:00
muxi
2012-09-14 10:51:50 +08:00
muxi
2012-09-14 10:54:45 +08:00
cabinw
2012-09-14 11:04:10 +08:00
@btwo
cabinw
2012-09-14 11:04:23 +08:00
@muxi 如此详细,大赞!
sinreal
2012-09-14 12:48:26 +08:00
额,豆瓣好像限制单个ip访问频率的。楼主可以考虑多个ip慢慢去抓。
cabinw
2012-09-14 12:50:55 +08:00
@sinreal 我测试用单ip抓了12万数据貌似还没出现问题,不过这的确会是个问题啊
14kscn
2012-09-14 13:25:06 +08:00
我比较好奇的是 v2ex 可以贴 code 了?
eric_q
2012-09-14 13:32:18 +08:00
如果爬得过快消耗太多资源,可能会被手动封禁
cabinw
2012-09-14 13:45:12 +08:00
@eric_q 诶,那真是大问题了
clowwindy
2012-09-14 20:41:09 +08:00
爬虫的瓶颈不在抓取,在被爬的网站上……一般要爬单个网站的大量数据,要么直接找对方要,要么动用大量 IP……

抓取的性能不是问题,如果爬完全不同的网站,之前用 tornado 那个 async_http_client 写了一个爬虫,开 5 个进程一边爬一边往 HBase 里插,可以达到 2000 QPS。
fanzeyi
2012-09-14 20:45:57 +08:00
如果楼主可以生成出爬的页面的链接到一个数组里,可以直接用 grequests<https://crate.io/packages/grequests/> 非常好用的异步 URL Fetching 库.

后端是 Gevent ..可以写上 callback 参数 =v=
chendahui007
2012-11-18 15:12:46 +08:00
@cabinw 可以看看你写的爬豆瓣电影那个么?

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

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

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

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

© 2021 V2EX