繁体   English   中英

抓取大型网站的最佳方法是什么?

[英]What is the best approach to scrape a big website?

你好,我正在开发一个网页抓取工具,我正在一个特定的网站上使用,这个网站有很多 URL,可能超过 1.000.000,为了抓取和获取信息,我有以下架构。

一组用于存储访问过的站点,另一组用于存储未访问过的站点。

为了抓取网站,我使用了限制为 2000 个线程的多线程。

这种架构存在内存大小问题,永远无法完成,因为程序超过了 URL 的内存

在将 URL 放入未访问的集合之前,我首先检查该站点是否已被访问,如果该站点被访问,则我将永远不会存储在未访问的站点中。

为此,我使用 python,我认为可能更好的方法是将所有站点存储在数据库中,但我担心这会很慢

我可以通过将访问过的 URL 集存储在 SQLite 等数据库中来解决部分问题,但问题是未访问过的 URL 集太大,超出了所有内存

关于如何使用另一种工具、语言、架构等改进这一点的任何想法?

谢谢

起初,我从不使用 Python 抓取页面。 我的首选语言是 c#。 但是python应该不错,或者更好。

好的,您检测到的第一件事很重要。 仅对您的记忆进行操作是行不通的。 实施一种在硬盘上工作的方法很重要。 如果您只想处理内存,请考虑页面的大小。

在我看来,您已经获得了最好的(或好的)网络抓取/抓取架构。 您需要某种列表,它代表您已经访问过的 url,以及另一个列表,您可以在其中存储找到的新 url。 只有两个列表是最简单的方法。 因为这意味着,您没有在爬行中实施某种策略。 如果你不是在寻找类似的东西,好吧。 但是想一想,因为这可以优化内存的使用。 因此,您应该寻找诸如深而宽的爬行之类的东西。 或者递归爬取。 将每个分支表示为自己的列表或数组的维度。

此外,将您未访问过的 url 也存储在数据库中有什么问题? 因为你只需要在每个线程上。 如果您将它放入 db 的问题是事实,它可能需要一些时间来浏览它,那么您应该考虑为页面的每个部分使用多个表。

这意味着,您可以为 url 中的每个子字符串使用一个表:

www.example.com/

www.example.com/contact/

www.example.com/download/

www.example.com/content/

www.example.com/support/

www.example.com/news/

因此,如果您的 url 是:“wwww.example.com/download/sweeetcats/”,那么您应该将其放入 wwww.example.com/download/ 的表中。 当您有一组网址时,您必须首先查看正确的表格。 之后,您可以在表格中滑动。

最后,我只有一个问题。 为什么不使用已经支持这些功能的库或框架? 我认为应该有一些可用于 python 的东西。

2000 个线程太多了。 即使是 1 也可能太多了。 您的抓取工具可能会被视为 DOS(拒绝服务)附件,并且您的 IP 地址将被阻止。

即使您被允许进入,2000 个线程也太多了。 你会在某个地方遇到瓶颈,如果你有一些理智的线程,那个阻塞点可能会导致比你能做到的更慢。 建议尝试 10. 一种看待它的方式——每个线程将在获取 URL(网络密集型)和处理它(cpu 密集型)之间翻转。 因此,CPU 数量的 2 倍是另一个可能的限制。

您需要一个隐藏的数据库。 这将让您置顶并重新启动该过程。 更重要的是,它可以让你修正错误,并释放一个新的履带,而不必扔掉所有的信息。

数据库不会是慢的部分。 主要步骤:

  • 选择一个页面(并将其锁定在数据库中以避免冗余)。
  • 获取页面(这可能是最慢的部分)
  • 解析页面(或者这可能是最慢的)
  • 将结果存储在数据库中
  • 重复直到没有更多的页面——这可能永远不会,因为这些页面会从你下面变出来。

(我多年前就这样做了。我有一台 0.5GB 的小机器。在分析了大约 100 万个页面后我退出了。还有大约 100 万个页面等待扫描。而且,是的,我被指控进行了 DOS 攻击。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM