This topic created in 4682 days ago, the information mentioned may be changed or developed.
单线程发现太慢了!请教一下应该怎样用多线程抓取网页呢?
我要做的事情是,用python将数字:从1到1000000,依次post到某个页面,然后分析提取有关信息。但是用for 循环似乎不显示,假设我的带宽,cpu比较好的情况下,比如带宽20Mbit,cpu 3ghz,应该怎样写呢?
求高手指点啊。
9 replies • 1970-01-01 08:00:00 +08:00
 |
|
1
macleek Aug 12, 2013
还有个一个问题,如何抓取带有时间戳的图片呢,比如这样一个url http://xxxxcom/GraphServlet?graphId=100020&time=1376306512081
|
 |
|
2
yangg Aug 12, 2013
urls = ['http://url/' % i for i in range(1, 1000000)] pool = multiprocessing.Pool(50) res = pool.map(dosth, urls) # 这里可以取出所有dosth返回的结果数组,不知道这么大的数据,这么写会不会有问题
def dosth(url): # do
|
 |
|
5
yakczh Aug 13, 2013
多线程的话每个线程每抽取一个链接,都是去一个全局的注册器看这个链接是不是已经处理过, 不如按任务开始做好分工, 多进程并发多个抓取队列,这样对资源的争用要少些
|
 |
|
6
binyuJ Aug 13, 2013
短时间对同一个网站弄这么多请求会不会把网站弄挂掉(-_-)ゞ゛或者自己电脑挂掉 为什么不试试直接用 thread、threading
|
 |
|
7
11 Aug 13, 2013
初级的简单的就用 threading 吧。
要是会玩就用 gevent 吧。
|
 |
|
8
likuku Aug 13, 2013
可以用for遍历数列,每一个元素单独开出个子进程,每开一定数量子进程,暂停1~2秒,然后继续遍历开子进程。
参考 subprocess 模块。
|
 |
|
9
likuku Aug 13, 2013
开子进程不会受限于GIL(Python的线程用GIL调度,一个程序进程里的所有线程共享这个进程的资源,你有32核CPU,只开一个进程的话,所有线程也只能用到1个核)。
子进程里带入数组元素作为参数传给子进程启动的独立程序,独立程序读取参数,执行抓取任务。结果输出,可以每个自进程都写入某共享数据库,或者独立开个文件记录。
|