当类似人类的鼠标移动在 Web 抓取中很重要时?
当我们处理网站的网络抓取项目时,我们可能会遇到安装了反机器人保护软件的情况。根据网站运营的行业,这可能是常见情况,也可能不是:根据我在 200+ 时尚电子商务网站的经验,我在其中抓取价格和产品等公共组件,我可以说其中大约 20% 具有某种机器人保护。如果您的目标是有预算在这些解决方案上花费的大玩家,而鲜为人知的网站通常更愿意关注购买过程的安全性,则尤其如此。
如果没有反机器人保护,可能 Scrapy spider 可以完成这项工作,您不必关心鼠标移动,因为服务器端没有人关心它。
即使您看到有一个反机器人要求您提供合理的设备指纹来绕过,在许多情况下这就足够了,您无需担心移动。一些反机器人解决方案更喜欢主要依赖有关浏览器和设备配置的信号,而不是跟踪浏览器发送的每个事件,例如鼠标移动,至少当它们设置为较低的“侵略性”级别时是这样。
其他反僵尸软件,如 Datadome,当设置为高级别安全性时,对爬虫的行为非常敏感,所有偏离轨道的东西都会被标记为可疑,并可能导致阻止,即使有人正在浏览。在 Hermes.com 网站上自己尝试一下,根据我的经验,这是我遇到的保护最严密的网站之一。输入一个随机的产品类别并开始快速浏览所有产品,在新选项卡中打开图片和链接:几分钟后您将被阻止。
这是因为您没有像真正有兴趣购买的人那样浏览网站,这是所谓的“行为分析”的结果,可以在 Datadome 页面上找到该声明。
Datadome 不仅会分析您向目标网站发出的请求的顺序,还会分析您的抓取工具如何从一个页面过渡到另一个页面:它是否通过直接链接访问,甚至在内部页面中?是用鼠标四处点击吗?如果是这样,鼠标如何在页面上移动?
标准的 Playwright 鼠标移动
Playwright 由于是用于应用程序测试的浏览器自动化工具,因此没有模拟类似人类的鼠标移动的本机功能。它的核心功能是为在 Web 应用程序上创建和执行测试而构建的:它提供了一组函数,用于在 Playwright 浏览器实例内移动鼠标,但移动非常不自然。
在为付费订阅者保留的 GitHub 存储库中,您将找到一个简单的程序 (draw_play.py),它以 Playwright 在两点之间移动的方式在两点之间划一条线:快速和笔直。
很难相信这是人类在两点之间生成的鼠标移动。每次我们告诉 Plawright 点击屏幕上的某个点时,它会立即沿着一条直线转到该点。
高级反机器人侦听 mousemove 事件,正如您可以想象的那样,当鼠标在页面上移动时触发该事件。 正如我们从 W3C 标准文档中阅读的那样:
移动指针设备时的事件频率取决于具体实现、设备和平台,但 对于持续的指针设备移动,应该触发多个连续事件,而不是针对鼠标的每个实例触发一个事件。
mousemove
这意味着平均而言,我们手动浏览的每个页面都会触发数百个事件,而如果我们的抓取工具从一个选择器跳到另一个选择器,它将生成很少的事件。此外,如果我们强制 Playwright 移动鼠标,这些移动将太快太直,无法与类似人类的移动兼容。
python_ghost_cursor 鼠标移动实现
我们过去已经讨论过贝塞尔曲线:它们是一种以编程方式绘制曲线的方法。多个 Python 包使用它们来模拟与网页的类似人类的交互,并对鼠标的速度进行一些调整。
Ghost_cursor 是一个 JS 库,它实现了用于计算鼠标在两点之间的轨迹的贝塞尔曲线,还添加了菲特定律的实现来计算其速度。
来自维基百科:
单个菲茨定律任务期间的移动可以分为两个阶段:
初始移动。快速但不精确地朝向目标移动
final movement。更慢但更精确的移动以捕获目标
第一阶段由到目标的距离定义。在这个阶段,距离可以快速闭合,但仍然不精确。第二个动作试图执行一个缓慢而受控的精确动作,以真正击中目标。任务持续时间根据难度线性缩放。但是,由于不同的任务可能具有相同的难度,因此距离对整体任务完成时间的影响大于目标大小。
基本上,鼠标开始移动得更快,然后在接近目标按钮或选择器时减慢速度,从而模拟人类行为。这足以绕过反机器人吗?
浏览 Hermes 网站
在所有这些理论之后,让我们回到受 Datadome 保护的 Hermes 网站的初始示例。
如前所述,它是最难绕过的网站之一,我们想看看我们今天学到的东西是否可以帮助欺骗它的反机器人。
我写了两个小脚本,一个是 Playwright 没有 Ghost 光标,另一个是 Playwright。他们都希望打开网站的主页并迭代其下拉菜单,而不会被阻止。
没有 Ghost 光标❌的 Playwright
使用 Brave 浏览器打开与 Playwright 的会话,但没有 Ghost 光标,我们可以加载主页,但我们什至无法单击菜单。我不知道我的脚本是否有任何问题,但由于我无法打开汉堡菜单,因此找不到用于迭代类别的选择器,并且爬虫返回错误。
您可以在存储库上为付费订阅者test_play.py的文件中找到完整代码。如果您是其中之一但没有访问权限,请在 pier@thewebscraping.club 写信给我 并提供您的 GitHub 用户名,因为我需要手动发送给您。
带有 Ghost 光标✅的 Playwright
让我们将 ghost-cursor 包添加到程序中,并创建一个光标以在页面上移动鼠标并单击选择器。
cursor = create_cursor(page)
page.goto('https://www.hermes.com')
selector = page.locator('xpath=//button[@id="collection-button"]')
selector.wait_for()
cursor.click(selector)使用这个简单的附加组件,我们可以迭代整个菜单而不会被阻塞。您可以在 程序test_ghost.py的同一存储库中找到完整的程序。
这似乎是进行我们的抓取项目的好方法。当然,这只是成功抓取网站的一小块拼图:您需要拥有良好的设备指纹、高质量的 IP 地址,并设计爬虫以模仿人类用户想要浏览网站时所遵循的路径。
感谢您阅读本期杂志,下周四再见一篇“The Lab”文章,下周日再见我们的新课程“Web Scraping from 0 to hero”课程。



Comments
Post a Comment