【问题标题】:Python,multi-threads,fetch webpages,download webpagesPython,多线程,抓取网页,下载网页
【发布时间】:2010-01-25 19:37:43
【问题描述】:

我想在一个站点中批量下载网页。我的“urls.txt”文件中有 5000000 个 url 链接。大约300M。如何让多线程链接这些网址并下载这些网页?或者如何批量下载这些网页?

我的想法:

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

还是扭曲?

有没有好的解决办法?

【问题讨论】:

  • 你想自己编程吗?您可以使用wget 轻松做到这一点。

标签: python web-scraping twisted


【解决方案1】:

如果这不是更大程序的一部分,那么 notnoop 使用一些现有工具来完成此任务的想法是一个非常好的想法。如果调用 wget 的 shell 循环解决了您的问题,那将比涉及更多自定义软件开发的任何事情容易得多。

但是,如果您需要将这些资源作为更大程序的一部分来获取,那么使用 shell 执行此操作可能并不理想。在这种情况下,我强烈推荐 Twisted,它可以轻松地并行处理多个请求。

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

【讨论】:

    【解决方案2】:

    一次下载 500 万个网页肯定不是一个好主意,因为你会用尽很多东西,包括网络带宽和操作系统的文件描述符。我会分批去100-1000个。您可以使用 urllib.urlopen 获取套接字,然后在多个线程上读取()。您也许可以使用 select.select。如果是这样,那么继续下载所有 1000 个,并将 select 返回的每个文件句柄分配给 10 个工作线程。如果选择不起作用,则将您的批次限制为 100 次下载,并且每次下载使用一个线程。当然,您不应该启动超过 100 个线程,因为您的操作系统可能会崩溃或至少运行有点慢。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        wget 脚本可能是最简单的,但如果您正在寻找 python-twisted 爬行解决方案,请查看scrapy

        【讨论】:

          猜你喜欢
          • 2012-03-28
          • 1970-01-01
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 2020-06-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多