2010-01-25 33 views
5

我想在一个站点批量下载网页。我的'urls.txt'文件中有500万个网址链接。大约300M。如何让多线程链接这些网址并下载这些网页?或如何批量下载这些网页?Python,多线程,获取网页,下载网页

我的想法:

with open('urls.txt','r') as f: 
    for el in f: 
     ##fetch these urls 

或扭曲?

有没有很好的解决方案呢?

+2

你想自己动手编程?你可以用'wget'轻松做到这一点。 – notnoop

回答

1

一次下载5M网页绝对不是一个好主意,因为你会最大限度地减少很多事情,包括网络带宽和操作系统的文件描述符。我会分批进行100-1000次。你可以使用urllib.urlopen来获取套接字,然后在几个线程上读取()。您可能可以使用select.select。如果是这样,那么请立即下载全部1000个文件,并将每个选择返回的文件句柄分配给10个工作线程。如果select不起作用,那么将您的批次限制为100次下载,并且每次下载使用一个线程。当然你不应该启动超过100个线程,因为你的操作系统可能会爆炸或至少会有点慢。

3

如果这不是一个更大的程序的一部分,那么notnoop的使用一些现有的工具来完成这个想法是一个很好的。如果一个调用wget的shell循环解决了你的问题,那么比任何涉及更多定制软件开发的东西都要容易得多。但是,如果您需要将这些资源作为较大程序的一部分获取,那么使用shell执行操作可能并不理想。在这种情况下,我强烈建议Twisted,这可以使并行执行多个请求变得容易。

几年前,我写了一个如何做到这一点的例子。看看http://jcalderone.livejournal.com/24285.html

+0

谢谢:)太棒了! – bell007

1

首先解析您的文件并将网址推入队列,然后生成5-10个工作线程将网址从队列中拉出并下载。队列是你的朋友。

+0

谢谢! “队友是你的朋友。” :) – bell007

0

一个wget的脚本可能是最简单的,但如果你正在寻找一个蟒蛇绞爬行的解决方案,看看scrapy