如何使用python同时下载网页?

时间:2015-05-18 09:43:57

标签: python python-2.7

我正在用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打开多个与服务器的连接吗?

3 个答案:

答案 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)

您可以使用多线程进行网络抓取,因为它在链接Threading上使用

OR

您可以查看此link上的线程的简单示例。