Python,多线程,获取网页,下载网页
我想要批量下载一个网站的网页。我在'urls.txt'文件里有5000000个网址链接,文件大约有300M。请问怎么用多线程来链接这些网址并下载这些网页呢?或者说,怎么才能批量下载这些网页呢?
我的想法是:
with open('urls.txt','r') as f:
for el in f:
##fetch these urls
或者是用twisted?
有没有什么好的解决方案呢?
4 个回答
1
一次性下载500万个网页可不是个好主意,因为这样会让很多东西都达到极限,比如你的网络带宽和操作系统的文件描述符。我建议你分批下载,每次下载100到1000个网页。你可以用urllib.urlopen来获取一个连接,然后在多个线程中读取数据。如果可以的话,可以使用select.select这个方法。这样的话,你就可以一次性下载1000个网页,并把select返回的每个文件处理分配给大约10个工作线程。如果select不行,那就把每次下载限制在100个网页,每个网页用一个线程来下载。总之,你最好不要启动超过100个线程,因为这样可能会让你的操作系统崩溃,或者至少让它变得很慢。
1
首先,解析你的文件,把里面的链接放到一个队列里。然后,启动5到10个工作线程,让它们从队列中取出链接并进行下载。使用队列会让这个过程变得更简单。
3
如果这不是一个更大程序的一部分,那么notnoop提到的用现有工具来解决这个问题的想法其实挺不错的。如果用一个shell循环来调用wget就能解决你的问题,那比起开发更多自定义软件要简单得多。
不过,如果你需要把这些资源作为更大程序的一部分来获取,那么用shell可能就不太合适了。在这种情况下,我强烈推荐使用Twisted,这样可以很方便地同时发起多个请求。
几年前我写过一个关于如何做到这一点的例子。你可以看看这个链接:http://jcalderone.livejournal.com/24285.html。