【问题标题】:web scraping design - best practice网页抓取设计 - 最佳实践
【发布时间】:2021-02-24 15:48:41
【问题描述】:

我过去已经实施了一些网络抓取项目 - 从小型到中型(大约 100.000 个抓取页面)。通常我的起点是一个索引页面,它链接到几个页面,其中包含我想要抓取的详细信息。最后,我的项目大部分时间都在工作。但我总觉得我可以改进工作流程(尤其是关于减少我对被抓取网站造成的流量的挑战[并与该主题相关:被禁止的风险:D])。

这就是为什么我想知道您的(最佳实践)网络爬虫设计方法(针对中小型项目)。

我通常像这样构建我的网络抓取项目:

  1. 我确定了一个起点,其中包含我想要从中抓取数据的 url。起点有一个相当可预测的结构,这使得它很容易刮

  2. 我瞥了一眼我想抓取的端点并找出一些函数来抓取和处理数据

  3. 我收集了我想从起点抓取的所有 url(端点)并将它们存储在一个列表中(有时起点是几页......例如,如果显示搜索结果并且一页只显示 20 个结果...但这些页面的结构几乎相同)

  4. 我开始爬取 url_list 并抓取我感兴趣的数据。

  5. 为了抓取数据,我运行了一些函数以我需要的格式构建和存储数据

  6. 成功抓取数据后,我将 url 标记为“已抓取”(如果遇到错误、超时或类似情况,我不必从头开始,但可以从进程停止的地方继续)

  7. 我结合了我需要的所有数据并完成了项目

现在我想知道修改此工作流程并在抓取时停止提取/处理数据是否是个好主意。相反,我会收集原始数据/网站,将 url 标记为已爬网并继续爬网。当所有网站都下载完毕(或者 - 如果它是一个更大的项目 - 在更大的任务之间),我会运行函数来处理和存储原始数据。

这种方法的好处是:

  • 如果我遇到基于意外结构的错误,我将不必重新抓取之前的所有页面。我只需要更改我的代码并在存储的原始数据上运行它(这样可以最大限度地减少我造成的流量)
  • 随着网站不断变化,我将拥有一个可重复的数据池

缺点是:

  • 特别是如果项目规模扩大,这种方法可能需要太多空间

【问题讨论】:

    标签: web-scraping web-crawler workflow raw-data


    【解决方案1】:

    不知道你的目标,很难说,但我认为就调试而言这是个好主意。

    例如,如果您的抓取工具的唯一目的是记录某个产品的价格,但您的抓取工具突然无法获取该数据,那么是的 - 杀死抓取工具是有意义的。

    但是,假设目标不仅仅是价格,而是页面上的各种属性,并且由于网站更改等原因,抓取工具无法获取某个属性。如果是这种情况,并且抓取其他数据属性仍然有价值,那么我将继续抓取,但记录错误。另一个考虑因素是失败率。网页抓取非常挑剔 - 有时网页加载不同或不完整,有时网站会发生变化。刮刀是否 100% 失效?或者它只是失败了 5% 的时间?

    在出错时保存 html 转储肯定有助于调试 xpath 失败等问题。您可以最大限度地减少更仔细的错误处理所消耗的空间量。例如,如果此特定错误(例如 xpath 未能返回值或类型不匹配等)不存在,则保存包含 html 转储的文件。 p>

    Re: 被封号了。我建议使用抓取框架。例如,在 python 中有处理请求流的 Scrapy。此外,存在代理服务以避免被禁止。至少在美国,网络抓取已被明确认为是合法的。所有公司都负责网络抓取流量。你不会用 100k 次刮擦来破坏服务。想想沃尔玛每天在亚马逊上发生的数百万次刮擦,反之亦然。

    【讨论】:

    • 感谢您的见解……尤其是错误处理部分听起来很有趣。到目前为止,错误处理部分仅限于整个页面,而不是网页上的元素:)
    猜你喜欢
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2010-12-16
    • 2018-09-12
    • 2013-07-31
    • 2010-09-05
    相关资源
    最近更新 更多