【问题标题】:Writing a Faster Python Spider编写更快的 Python 蜘蛛
【发布时间】:2009-12-05 22:28:40
【问题描述】:

我正在用 Python 编写一个蜘蛛来抓取一个网站。麻烦的是,我需要检查大约 250 万页,所以我真的可以使用一些帮助来优化速度。

我需要做的是检查页面是否有一定数量,如果找到则记录该页面的链接。蜘蛛很简单,它只需要对很多页面进行排序。

我对 Python 完全陌生,但之前使用过 Java 和 C++。我还没有开始编写它,所以任何关于要包含的库或框架的建议都会很棒。任何优化提示也非常感谢。

【问题讨论】:

  • 加快处理速度的最佳选择是提高连接速度。那将是您的瓶颈,而不是 Python 速度。

标签: python web-crawler


【解决方案1】:

您可以像 Google 一样使用 MapReduce,通过 Hadoop(特别是 Python:12)、DiscoHappy

传统的思路,是用标准的Python写你的程序,如果你觉得太慢,profile it,优化具体的慢点。您可以通过使用 C/C++ 扩展甚至 ctypes 降级到 C 来加快这些慢点。

如果您只爬取一个站点,请考虑使用wget -r (an example)。

【讨论】:

  • wget 只支持获取 html 吗?我不想成为更多的人,然后我必须这样做。
  • 是的,wget 上的-A 标志让您指定接受的扩展名,-R 让我们指定拒绝的扩展名。所以你可以做类似wget -R.gif,.jpg,.png -r example.com
  • 使用 C++/C# 的 wget 会比 Python 中的等价物更快(如果是多线程的)吗?
  • 程序中最慢的部分将是网络连接。每个连接至少需要 100 毫秒,从 Python 切换到 C/C++ 只会减少几毫秒。在宏伟的计划中,Python 将同样快。
  • wget +1 - 如果您在自己的服务器上检查自己的网站,wget 实际上可能更快
【解决方案2】:

您将结果存储在哪里?您可以使用PiCloud 的云库在服务器集群中轻松并行抓取。

【讨论】:

  • 我只有一个带有小型 Raid 阵列的工作站,以及几个志愿者的计算机。我只打算存储一些有相关搜索词的页面,应该是
  • 存储的数据越少越好。如果你发现自己需要更多的计算能力(并行性会大大加快你的工作速度),一定要试试 PiCloud。
【解决方案3】:

由于您是 Python 新手,我认为以下内容可能对您有所帮助:)

  • 如果您正在编写正则表达式来搜索页面中的特定模式,请尽可能编译您的正则表达式并重用编译后的对象
  • BeautifulSoup 是一个 html/xml 解析器,可能对您的项目有些用处。

【讨论】:

  • 修正了您帖子的一些格式,希望您不要介意 :) 欢迎来到 SO!
【解决方案4】:

用数百万个请求来爬取某人的网站并不是很有礼貌。您可以向网站管理员索取该网站的存档吗?一旦你有了它,这就是一个简单的文本搜索问题。

【讨论】:

  • 网站不是英文的,我也不会说要问的语言。此外,它是一个非常高流量的图片网站(另一个我不能问的原因),我只需要每个页面的 html,所以希望我不会消耗他们的服务器。我只打算蜘蛛每个页面一次,并且永远不会回来更新。
【解决方案5】:

您在爬取时会浪费大量时间等待网络请求,因此您肯定希望并行发出请求。我可能会将结果数据保存到磁盘,然后让第二个过程循环搜索该术语的文件。如果您需要额外的性能,该阶段可以很容易地分布在多台机器上。

【讨论】:

    【解决方案6】:

    亚当所说的。我这样做一次是为了绘制 Xanga 的网络。我让它更快的方法是拥有一个包含我必须查找的所有用户名的线程安全集。然后我有 5 个左右的线程同时发出请求并处理它们。您将花费更多时间等待 DL 页面,而不是处理任何文本(很可能),因此只需找到增加您同时获得的请求数量的方法即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多