从网址列表中下载<very large =“”>页数的最佳方法是什么?</very>

时间:2013-06-06 08:32:17

标签: python multithreading multiprocessing scrapy web-crawler

我在列表中有一个> 100,000个网址(不同的域名),我想下载并保存在数据库中以便进一步处理和修改。

使用scrapy而不是python的多处理/多线程是否明智?如果是,我如何编写独立脚本来执行相同的操作?

另外,请随时提出您想到的其他令人敬畏的方法。

4 个答案:

答案 0 :(得分:2)

如果你非常了解要获取的URL(这里没有涉及抓取),那么Scrapy似乎与此无关。

最简单的想法是使用Requests。但是,查询序列中的每个URL并阻止等待答案都不会有效,因此您可以考虑GRequests异步发送批量请求。

答案 1 :(得分:0)

如果您突然创建高负载,大多数网站所有者会尝试阻止您的抓取工具。

所以即使你有固定的链接列表,你需要控制超时,http答案代码,代理等scrapy或grab

答案 2 :(得分:0)

Scrapy仍然是一种选择。

  1. 速度/性能/效率

      

    Scrapy是用Twisted编写的,这是一种流行的事件驱动网络   Python的框架。因此,它使用非阻塞(也就是说   异步)并发代码。

  2. 数据库流水线

    您提到您希望将数据流水线化到数据库中 - 您可能知道Scrapy具有Item Pipelines功能:

      

    物品被蜘蛛刮掉后,会被发送到物品   管道通过几个执行的组件处理它   顺序。

    因此,每个页面在下载后都可以立即写入数据库。

  3. 代码组织

    Scrapy为您提供了一个漂亮而清晰的项目结构,您可以在逻辑上分离设置,蜘蛛,物品,管道等。即使这样,您的代码也会更清晰,更容易支持和理解。

  4. 编码时间

    Scrapy在幕后为您做了很多工作。这使您专注于实际的代码和逻辑本身,而不是考虑“金属”部分:创建进程,线程等。

  5. 但是,与此同时,Scrapy可能是一个开销。请记住,Scrapy的设计(并且很棒)可以抓取,抓取网页上的数据。如果你只想下载一堆页面而不去研究它们 - 那么是的,grequests是一个不错的选择。

答案 3 :(得分:0)

使用Scrapy的AFAIK,如果URL列表不能容纳在内存中是不可能的。

这可能与minet有关:

minet fetch url_column urls.csv > report.csv