从 url 列表中下载 <very large> 页面的最佳方法是啥?

Posted

技术标签:

【中文标题】从 url 列表中下载 <very large> 页面的最佳方法是啥?【英文标题】:What is the best way to download <very large> number of pages from a list of urls?从 url 列表中下载 <very large> 页面的最佳方法是什么? 【发布时间】:2013-06-02 04:15:15 【问题描述】:

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

使用 scrapy 代替 python 的多处理/多线程是否明智?如果是,我该如何编写一个独立的脚本来做同样的事情?

此外,您可以随意提出其他您想到的很棒的方法。

【问题讨论】:

【参考方案1】:

AFAIK,使用 Scrapy,如果 URL 列表不适合内存,则不可能。

这应该可以用minet:

minet fetch url_column urls.csv > report.csv

【讨论】:

【参考方案2】:

Scrapy 仍然是一种选择。

    速度/性能/效率

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

    数据库流水线

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

    一个项目被蜘蛛抓取后,它被发送到项目 通过执行的几个组件处理它的管道 顺序。

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

    代码组织

    Scrapy 为您提供了一个漂亮而清晰的项目结构,您可以将设置、蜘蛛、项目、管道等在逻辑上分开。即便如此,您的代码也会更清晰、更易于支持和理解。

    编码时间

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

但是,与此同时,Scrapy 可能是一种开销。请记住,Scrapy 旨在(并且擅长)从网页中抓取、抓取数据。如果您只想下载一堆页面而不查看它们 - 那么是的,grequests 是一个不错的选择。

【讨论】:

我曾使用过scrapy,并且知道其中的好处。我更感兴趣的是如何编写一个将scrapy用作库而不是受scrapy框架的项目结构约束的程序? 当然,无论如何都想指出这一点。您不必创建该项目结构来创建和运行您的蜘蛛。例如。 ***.com/questions/13437402/….【参考方案3】:

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

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

【讨论】:

【参考方案4】:

如果您非常了解要获取的 URL,则 Scrapy 似乎与此处无关(此处不涉及抓取)。

想到的最简单的方法是使用Requests。但是,依次查询每个 URL 并阻止等待答案的效率并不高,因此您可以考虑 GRequests 异步发送批量请求。

【讨论】:

它就是其中之一,在你遇到它们之后,你无法想象没有它们。非常感谢您向我介绍 Grequests。

以上是关于从 url 列表中下载 <very large> 页面的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

:Introduction to Very Large Databases 读书笔记

高效更新 VERY LARGE PostgreSQL 数据库表

VGGnet论文总结(VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION)

VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION(VGG网络)-论文阅读笔记

Deployment of very large databases (10TB to PB range) with Automatic Storage Management (ASM) [ID 36

从多维列表中提取列表