网页抓取最佳实践:成功网页抓取指南
我们准备了一些在收集数据时会很有用的技巧和窍门。
众所周知,网站会使用各种反爬取技术(如速率限制或 IP 地址禁令)来防范机器人。这些和其他障碍可能会决定您能否成功收集所需的数据。但有时,您所需要的只是同等的知识和一些技巧,以避免在此过程中遇到挑战。
从 IP 地址和用户代理轮换到处理重定向和改进数字指纹,即使是抓取大神也会寻找有效的指南。我们整理了 最佳网页抓取实践 帮助您解决 IP 拦截、请求限制,甚至网站结构变化等技术问题。继续阅读本指南,并掌握要遵循的网页抓取最佳实践。
网站如何检测网络爬虫?
如果你观察一下人们的浏览方式,就会发现这种模式很混乱。相反,机器人是可以预测的——单调乏味,而且比实际用户快得多。这是一个明显的迹象,因为网站可以通过跟踪你的 IP 地址来监控流量——你在特定时间范围内发出的连接请求的数量和模式。任何异常活动都会引起警觉。
但这还不是全部。网站还可以使用各种指纹识别方法识别您的设备和软件特征。例如,他们可以通过网络爬虫在 HTTP 请求标头中发送的标识符(如 cookie 或用户代理)来识别网络爬虫。最先进的指纹识别技术甚至可以跟踪页面上的鼠标移动,以确定用户是否是机器人。
网页抓取面临的挑战
网页抓取最佳实践
1. 考虑网站的指南
2. 礼貌地刮擦
大多数网页抓取工具可以同时运行数百个请求。问题是,小型网站没有足够的资源来处理如此大的负载。因此,如果你过于频繁地访问它们,可能会意外导致服务器崩溃。
为了避免这种情况,您应该适应目标的能力:在请求之间增加延迟,在非高峰时段收集数据,并且不要成为负担。这样做会让每个人的体验更好。
3. 发现 API 端点
4. 更换你的 IP 地址
5. 了解何时使用无头浏览器
6. 改善浏览器的指纹
从 Web 浏览器发出的请求包含一组标头,这些标头会显示您的偏好和软件信息。其中一个标头(用户代理字符串)尤其重要:如果该标头缺失或格式错误,目标将拒绝为您的 Web 抓取工具提供服务。这适用于大多数 HTTP 客户端(如 Requests),它们会发送自己的用户代理标头。别忘了更改它!
此外,由于网站监控来自同一浏览器的请求,因此始终使用相同的用户代理字符串可能不是一个好主意。解决方法是轮换您的用户代理。您应该收集最新 Web 浏览器的用户代理并循环遍历它们。
除了 User-agent 之外,还有更多标头需要考虑。例如,有些网站需要 Cookie,如果您添加 referer 标头,您将有更大的机会在其他网站上取得成功。
7. 维护你的网页爬虫
当您购买预制的抓取工具时,您订阅的服务会负责维护。但是,定制软件需要您(或您的同事)不断监督。主要有两个原因:1)它是一堆工具的拼凑,2)网站开发人员经常对网站进行结构更改。
首先,自建的抓取工具由不同的组件组成。因此,迟早会有一个或多个元素出现故障,您需要修复该问题,这是很现实的。例如,您的代理服务器可能会出现故障,或者网络抓取工具可能会遇到它不知道如何处理的情况。
其次,网站管理员经常进行结构更改,这可能会影响抓取工具的功能。这可能包括新的保护方法或简单地重新排列 HTML 结构以破坏您的解析代码。随着时间的推移,您需要在旧结构之上添加新功能并运行测试以查看抓取工具是否可用。此外,请密切关注缺失或修改的字段名称等更改。这将防止您损失数据质量。
8. 行为自然
人类和机器人行为之间的主要区别在于,人类行动缓慢且难以预测,而机器人则速度非常快并且被编程为特定的爬行模式。
为了看起来更像人类,您应该通过更改请求之间的时间间隔或点击网站上的特定元素来降低抓取率。如果您使用的是无头浏览器,您还可以添加鼠标移动等随机活动。不可预测的操作将使服务器更难将您识别为机器人。
改进抓取机器人的其他技巧
在您的抓取工具全部设置并运行之后,还有更多方法可以改进您的脚本。
缓存 HTTP 请求。 价格汇总等任务需要抓取多个页面,这意味着您必须浏览许多网站 URL。这就是 爬行 开始发挥作用——您构建一个爬取逻辑来从多个页面中提取特定数据。但是,当您想知道爬虫已经访问过哪些页面,或者您稍后需要重新访问这些页面以获取更多数据时,该过程会变得有点负担。通过将响应存储到数据库,您将避免将来请求相同的页面。
使用规范的 URL。 一些网站有多个 URL 指向相同的内容。通常当它们同时包含桌面版和移动版时会发生这种情况:例如 www.instagram.com 和 https://m.instagram.com。规范 URL 或规范标签是一个 HTML 片段,用于定义重复(或近似重复)的主要版本。rel=”canonical” 元素可帮助开发人员检测和避免重复页面。Scrapy 等框架默认处理相同的 URL。
处理重定向。 HTML 重定向或转发是一种将用户从一个 URL 重定向到另一个 URL 的方法。HTML 重定向会使抓取工具感到困惑并导致速度变慢。基于 Python 的抓取库(如 Requests)通常默认遵循重定向,但提供不遵循重定向的选项。Web 抓取框架(如 Scrapy)具有重定向中间件来处理它们。