Python,多线程,获取网页,下载网页

5 投票
4 回答
1292 浏览
提问于 2025-04-15 18:27

我想要批量下载一个网站的网页。我在'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

撰写回答