【发布时间】:2021-02-24 15:48:41
【问题描述】:
我过去已经实施了一些网络抓取项目 - 从小型到中型(大约 100.000 个抓取页面)。通常我的起点是一个索引页面,它链接到几个页面,其中包含我想要抓取的详细信息。最后,我的项目大部分时间都在工作。但我总觉得我可以改进工作流程(尤其是关于减少我对被抓取网站造成的流量的挑战[并与该主题相关:被禁止的风险:D])。
这就是为什么我想知道您的(最佳实践)网络爬虫设计方法(针对中小型项目)。
我通常像这样构建我的网络抓取项目:
-
我确定了一个起点,其中包含我想要从中抓取数据的 url。起点有一个相当可预测的结构,这使得它很容易刮
-
我瞥了一眼我想抓取的端点并找出一些函数来抓取和处理数据
-
我收集了我想从起点抓取的所有 url(端点)并将它们存储在一个列表中(有时起点是几页......例如,如果显示搜索结果并且一页只显示 20 个结果...但这些页面的结构几乎相同)
-
我开始爬取 url_list 并抓取我感兴趣的数据。
-
为了抓取数据,我运行了一些函数以我需要的格式构建和存储数据
-
成功抓取数据后,我将 url 标记为“已抓取”(如果遇到错误、超时或类似情况,我不必从头开始,但可以从进程停止的地方继续)
-
我结合了我需要的所有数据并完成了项目
现在我想知道修改此工作流程并在抓取时停止提取/处理数据是否是个好主意。相反,我会收集原始数据/网站,将 url 标记为已爬网并继续爬网。当所有网站都下载完毕(或者 - 如果它是一个更大的项目 - 在更大的任务之间),我会运行函数来处理和存储原始数据。
这种方法的好处是:
- 如果我遇到基于意外结构的错误,我将不必重新抓取之前的所有页面。我只需要更改我的代码并在存储的原始数据上运行它(这样可以最大限度地减少我造成的流量)
- 随着网站不断变化,我将拥有一个可重复的数据池
缺点是:
- 特别是如果项目规模扩大,这种方法可能需要太多空间
【问题讨论】:
标签: web-scraping web-crawler workflow raw-data