我正在用Python编写Web抓取应用程序。我正在抓取的网站包含www.someurl.com/getPage?id=x
形式的网址,其中x
是标识网页的数字。现在,我正在使用urlretrieve
以下是我的脚本的基本形式:
for i in range(1,1001):
urlretrieve('http://someurl.com/getPage?id='+str(i) , str(i)+".html)
现在,我的问题 - 可以同时下载页面吗?因为,我在这里阻止脚本并等待页面下载。我可以要求Python打开多个与服务器的连接吗?
答案 0 :(得分:4)
在Python 2中同时进行一些谷歌搜索:
from multiprocessing.pool import ThreadPool
from urllib import urlretrieve
def loadpage(x):
urlretrieve('http://google.com/search?q={}'.format(x), '{}.html'.format(x))
p = ThreadPool(10) # the max number of webpages to get at once
p.map(loadpage, range(50))
您可以轻松使用Pool而不是ThreadPool。这将使它在多个进程/ CPU核心上运行。但由于这是IO绑定,我认为线程提供的并发性就足够了。
答案 1 :(得分:2)
不,你不能要求python打开多个连接,你必须使用框架来执行此操作或编写自己的线程应用程序。
twisted是一个同时下载多个页面的框架。
{{3}}是一个线程框架,它确实处理多个协议。使用scrapy很简单,但如果你坚持自己构建东西,这可能是你想要使用的东西。
答案 2 :(得分:2)