Selenium 无头浏览器被知乎限制访问的解决方案

问题出现

我尝试使用如下代码爬取知乎的有关内容,出现知乎安全验证界面:

python 复制代码
def init_driver():
    options = Options()
    options.add_argument("--headless")
    options.add_argument('--disable-gpu')
    driver = webdriver.Chrome(options=options)
    return driver

if __name__ == '__main__':
    driver = init_driver()
    driver.get("https://www.zhihu.com/question/610796576/answer/3110013198")

尝试的无效方案

添加启动参数

在网上的许多文章中,反复提到了如下三行代码,然而我将他们加入代码后没有什么效果:

python 复制代码
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option('excludeSwitches', ['enable-outomation'])
options.add_experimental_option("useAutomationExtension", False)

JavaScript特殊全局变量

有一些文章提到,通过 WebDriver 启动的网页会存在一些特殊的 JS 变量,这些变量可能会被网站的 JS 识别,例如navigator.webdriver。我尝试在init_webdriver底部加入如下代码,也没有生效。

python 复制代码
    driver = webdriver.Chrome(options=options)
    script = '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
'''
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
                           {"source": script})
    return driver

也有文章提到,类似的特征变量有二十多个,幸好我知难而退放弃了去一个一个找出来的想法(要是)

其余方案

也看到有知乎网友提出与浏览器指纹有关,声称自己修改特征变量的名称后重新编译 WebDriver 成功解决问题,但是我没有尝试这一方案,不然的话一周后也不一定能有这一篇文章的发布

最终成功的方案

偶然想起查资料的过程中,有人提到在默认情况下,headless 模式打开的浏览器会使用一个包含 headless 关键字的特殊 UA,那么知乎是否是通过这一最简单的方式进行的识别呢?为验证这一猜想,我先将 headless 选项禁用,发现脚本可以正常访问知乎。

那么问题的解决就变得十分简单了,只需要自行指定 UA 即可。最终的init_driver函数:

python 复制代码
def init_driver():
    options = Options()
    options.add_argument("--headless")
    options.add_argument('--disable-gpu')
    options.add_argument(
        '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    )
    driver = webdriver.Chrome(options=options)
    return driver

一些思考

知乎还是我见过的所有网站中反爬策略比较高级的,从未有人能成功解开他的接口数据加密(有点过于绝对,但至少没公开过),2023年4月以后我更是没见过任何可用的 API 问世。然而仅这一次无头浏览器的限制来看,UA 还是一个比较基简单的策略,基本到现在我们可能已经不会关注这一原始的反爬方式了。以后测试的时候还是要做到滴水不漏,不然又要像我一样耽误一大圈兜兜转转,最后用一行如此简单的代码解决......

对,另外已登录的账号不受这一限制,但是不建议大家冒险(小心封号啊

相关推荐
2601_967987371 天前
Python在自动化测试中有哪些应用?
python自动化测试·selenium·appium·pytest·性能测试
东舟技术1 天前
从人工目检到AI视觉:智能座舱瞬态故障的自动化捕获与溯源
功能测试·测试工具·自动化
小猿A2 天前
【2026最新】Apifox下载、配置、实战教程(附官网安装包)
测试工具
泽众云测试3 天前
泽众软件与广州华南检验检测中心签约,PerformanceRunner性能测试工具助力第三方测评机构性能检测能力升级
软件测试·测试工具·性能测试
@zulnger3 天前
Charles抓包工具
测试工具
ck0135793 天前
视频添加水印的实践:文字叠加、透明 PNG 与时间区间设置
图像处理·测试工具·音视频·视频
EVE จุ๊บ4 天前
playwright和selenium的区别是什么
selenium·测试工具
Meta Luo6 天前
页面改版后自动化用例大量失败,应该怎么维护?
运维·功能测试·测试工具·自动化
释槐鸟~6 天前
还不知道RIDE工具怎么装吗
测试工具·自动化
有技巧搬砖7 天前
为什么锂电池组的电池老化测试很重要?
测试工具·锂电池·电池老化