网页抓取设计 - 最佳实践
web scraping design - best practice
我过去实施过一些网络抓取项目 - 从小型到中型(大约 100.000 个抓取页面)。通常我的起点是一个索引页面,它链接到几个包含我想要抓取的细节的页面。最后,大部分时间我的项目都成功了。但我总觉得我可以改进工作流程(特别是关于减少我对被抓取的网站造成的流量的挑战 [并与该主题相关:被禁止的风险 :D])。
这就是为什么我想知道您的网络抓取工具设计(针对中小型项目)的(最佳实践)方法。
通常我会这样构建我的网络抓取项目:
我确定了一个起点,其中包含我要从中抓取数据的 urls。起点具有相当可预测的结构,这使得抓取变得容易
我瞥了一眼我想抓取的端点并找出一些函数来抓取和处理数据
我收集所有我想从起点抓取的urls(端点)并将它们存储在列表中(有时起点是几页...例如如果显示搜索结果,一页只显示 20 个结果...但这些页面的结构几乎相同)
我开始抓取 url_list 并抓取我感兴趣的数据。
为了抓取数据,我运行一些函数以我需要的格式构建和存储数据
成功抓取数据后,我将 url 标记为“已抓取”(如果我 运行 出现错误、超时或类似情况,我不会必须从头开始,但可以从进程停止的地方继续)
我结合了我需要的所有数据并完成了项目
现在我想知道修改此工作流程并在抓取时停止 extracting/processing 数据是否是个好主意。相反,我会收集原始 data/the 网站,将 url 标记为已爬网并继续爬网。下载所有网站后(或者 - 如果它是一个更大的项目 - 在更大的任务之间)我会 运行 函数来处理和存储原始数据。
这种方法的好处是:
- 如果我 运行 陷入基于意外结构的错误,我将不必重新抓取之前的所有页面。我只需要更改我的代码并 运行 它在存储的原始数据上(这将最大限度地减少我造成的流量)
- 随着网站不断变化,我将拥有一个可重现的数据池
缺点是:
- 特别是如果项目规模扩大,这种方法可能需要太多 space
不知道你的目标,很难说,但我认为就调试而言这是个好主意。
例如,如果你的爬虫的唯一目的是记录一些产品的价格,但你的爬虫突然无法获取该数据,那么是的——杀死爬虫是有意义的。
但是假设目标不仅仅是价格,而是页面上的各种属性,而由于网站更改等原因,抓取工具只是无法获取一个属性。如果是这样,并且抓取其他数据属性仍然有价值,那么我会继续抓取,但记录错误。另一个考虑因素是故障率。 Web 抓取非常挑剔 - 有时网页加载不同或不完整,有时网站会发生变化。刮板是否 100% 失效?或者也许它只是失败了 5% 的时间?
在出现错误时保存 html 转储肯定有助于调试 xpath 失败等问题。您可以通过更仔细的错误处理来最大程度地减少 space 消耗的数量。例如,保存包含 html 转储的文件,如果此 特定 错误尚不存在,例如 xpath 未能 return a值或类型不匹配等
回复:被封禁。我建议使用抓取框架。例如,在 python 中有处理请求流的 Scrapy。此外,存在代理服务以避免被禁止。至少在美国,网络抓取已被明确视为合法。所有公司都负责网络抓取流量。你不会用 10 万次擦除来破坏服务。想想沃尔玛每天在亚马逊上进行的数百万次刮擦,反之亦然。
我过去实施过一些网络抓取项目 - 从小型到中型(大约 100.000 个抓取页面)。通常我的起点是一个索引页面,它链接到几个包含我想要抓取的细节的页面。最后,大部分时间我的项目都成功了。但我总觉得我可以改进工作流程(特别是关于减少我对被抓取的网站造成的流量的挑战 [并与该主题相关:被禁止的风险 :D])。
这就是为什么我想知道您的网络抓取工具设计(针对中小型项目)的(最佳实践)方法。
通常我会这样构建我的网络抓取项目:
我确定了一个起点,其中包含我要从中抓取数据的 urls。起点具有相当可预测的结构,这使得抓取变得容易
我瞥了一眼我想抓取的端点并找出一些函数来抓取和处理数据
我收集所有我想从起点抓取的urls(端点)并将它们存储在列表中(有时起点是几页...例如如果显示搜索结果,一页只显示 20 个结果...但这些页面的结构几乎相同)
我开始抓取 url_list 并抓取我感兴趣的数据。
为了抓取数据,我运行一些函数以我需要的格式构建和存储数据
成功抓取数据后,我将 url 标记为“已抓取”(如果我 运行 出现错误、超时或类似情况,我不会必须从头开始,但可以从进程停止的地方继续)
我结合了我需要的所有数据并完成了项目
现在我想知道修改此工作流程并在抓取时停止 extracting/processing 数据是否是个好主意。相反,我会收集原始 data/the 网站,将 url 标记为已爬网并继续爬网。下载所有网站后(或者 - 如果它是一个更大的项目 - 在更大的任务之间)我会 运行 函数来处理和存储原始数据。
这种方法的好处是:
- 如果我 运行 陷入基于意外结构的错误,我将不必重新抓取之前的所有页面。我只需要更改我的代码并 运行 它在存储的原始数据上(这将最大限度地减少我造成的流量)
- 随着网站不断变化,我将拥有一个可重现的数据池
缺点是:
- 特别是如果项目规模扩大,这种方法可能需要太多 space
不知道你的目标,很难说,但我认为就调试而言这是个好主意。
例如,如果你的爬虫的唯一目的是记录一些产品的价格,但你的爬虫突然无法获取该数据,那么是的——杀死爬虫是有意义的。
但是假设目标不仅仅是价格,而是页面上的各种属性,而由于网站更改等原因,抓取工具只是无法获取一个属性。如果是这样,并且抓取其他数据属性仍然有价值,那么我会继续抓取,但记录错误。另一个考虑因素是故障率。 Web 抓取非常挑剔 - 有时网页加载不同或不完整,有时网站会发生变化。刮板是否 100% 失效?或者也许它只是失败了 5% 的时间?
在出现错误时保存 html 转储肯定有助于调试 xpath 失败等问题。您可以通过更仔细的错误处理来最大程度地减少 space 消耗的数量。例如,保存包含 html 转储的文件,如果此 特定 错误尚不存在,例如 xpath 未能 return a值或类型不匹配等
回复:被封禁。我建议使用抓取框架。例如,在 python 中有处理请求流的 Scrapy。此外,存在代理服务以避免被禁止。至少在美国,网络抓取已被明确视为合法。所有公司都负责网络抓取流量。你不会用 10 万次擦除来破坏服务。想想沃尔玛每天在亚马逊上进行的数百万次刮擦,反之亦然。