某网站防 Selenium 爬取的方案和解决方案

2023-03-15
#python #selenium

前言

最近在爬取某网站的使用 selenium 模拟登录,发现手动登录一切正常,但是一旦使用 selenium,最后提交事件无法被触发,导致无法登录,显然 selenium 被检测出来了。所以猜测可能是 selenuim 的某种特性被检测出来,然后导致爬虫被 ban 了。

解决方法

定位问题

从网上检索不少资料,在 How Javascript is Used to Block Web Scrapers? 中发现一个 navigator.webdriver 的属性,在常规浏览器下这个值都是 False,而在自动化下浏览器这个值为 True
illustration of natural vs automated browser

猜测有可能是这个原因,接下来就是修改在 selenium 这个值为 False

方案

核心代码如下:

  # ...
  driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      })
    """
  })

经过测试完美模拟登录成功。

参考链接

  1. How Javascript is Used to Block Web Scrapers? In-Depth Guide
  2. Selenium webdriver: Modifying navigator.webdriver flag to prevent selenium detection
  3. (最新版)如何正确移除Selenium中的 window.navigator.webdriver