求高手指点怎样用pyhon多线程抓取网页?

2013-08-12 19:43:57 +08:00
 macleek
单线程发现太慢了!请教一下应该怎样用多线程抓取网页呢?
我要做的事情是,用python将数字:从1到1000000,依次post到某个页面,然后分析提取有关信息。但是用for 循环似乎不显示,假设我的带宽,cpu比较好的情况下,比如带宽20Mbit,cpu 3ghz,应该怎样写呢?
求高手指点啊。
4229 次点击
所在节点    Python
9 条回复
macleek
2013-08-12 19:46:41 +08:00
还有个一个问题,如何抓取带有时间戳的图片呢,比如这样一个url http://xxxxcom/GraphServlet?graphId=100020&time=1376306512081
yangg
2013-08-12 19:49:28 +08:00
urls = ['http://url/' % i for i in range(1, 1000000)]
pool = multiprocessing.Pool(50)
res = pool.map(dosth, urls) # 这里可以取出所有dosth返回的结果数组,不知道这么大的数据,这么写会不会有问题

def dosth(url):
# do
mdjhny
2013-08-13 16:52:08 +08:00
只需要维护两个队列,做好出错处理就行,这里有一个简陋的
http://mdjhny.github.io/a-producer-and-consumer-multithread-spider.html
sivacohan
2013-08-13 17:04:45 +08:00
gevent
yakczh
2013-08-13 17:26:42 +08:00
多线程的话每个线程每抽取一个链接,都是去一个全局的注册器看这个链接是不是已经处理过, 不如按任务开始做好分工, 多进程并发多个抓取队列,这样对资源的争用要少些
binyuJ
2013-08-13 21:19:01 +08:00
短时间对同一个网站弄这么多请求会不会把网站弄挂掉(-_-)ゞ゛或者自己电脑挂掉
为什么不试试直接用 thread、threading
11
2013-08-13 21:23:10 +08:00
初级的简单的就用 threading 吧。

要是会玩就用 gevent 吧。
likuku
2013-08-13 23:37:51 +08:00
可以用for遍历数列,每一个元素单独开出个子进程,每开一定数量子进程,暂停1~2秒,然后继续遍历开子进程。

参考 subprocess 模块。
likuku
2013-08-13 23:41:43 +08:00
开子进程不会受限于GIL(Python的线程用GIL调度,一个程序进程里的所有线程共享这个进程的资源,你有32核CPU,只开一个进程的话,所有线程也只能用到1个核)。

子进程里带入数组元素作为参数传给子进程启动的独立程序,独立程序读取参数,执行抓取任务。结果输出,可以每个自进程都写入某共享数据库,或者独立开个文件记录。

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

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

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

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

© 2021 V2EX