从URL列表下载<very large>页面的最佳方式是什么?

2024-04-25 18:52:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个列表中有超过100000个url(不同的域),我想下载并保存在数据库中,以便进一步处理和修补。在

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

另外,你可以随意提出一些你想到的很棒的方法。在


Tags: 方法脚本数据库url列表scrapy
3条回答

刮痧还是个选择。在

  1. 速度/性能/效率

    Scrapy is written with Twisted, a popular event-driven networking framework for Python. Thus, it’s implemented using a non-blocking (aka asynchronous) code for concurrency.

  2. 数据库流水线

    您提到希望将数据通过管道传输到数据库中—正如您所知,Scrapy具有Item Pipelines功能:

    After an item has been scraped by a spider, it is sent to the Item Pipeline which process it through several components that are executed sequentially.

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

  3. 代码组织

    Scrapy为你提供了一个很好的清晰的项目结构,在那里你有设置,蜘蛛,项目,管道等逻辑分离。即便如此,你的代码也会更清晰、更易于支持和理解。

  4. 编码时间到了

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

但是,同时,发痒可能是一个开销。请记住,Scrapy的设计初衷是爬网,从网页中抓取数据。如果您只想下载一堆页面而不查看它们,那么是的,grequests是一个不错的选择。在

如果你突然造成高负载,大多数网站所有者会试图阻止你的爬虫。在

因此,即使你有固定的链接列表,你也需要在scray或grab上控制超时、http应答代码、代理等

如果您非常清楚要获取的URL,Scrapy在这里似乎不相关(这里不涉及爬行)。在

想到的最简单的方法是使用^{}。但是,在一个序列中查询每个URL并在块中等待答案并不是很有效,因此可以考虑使用^{}异步发送多个请求。在

相关问题 更多 >