前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Python Selenium 隐藏浏览器指纹特征

Python Selenium 隐藏浏览器指纹特征

原创
作者头像
繁依Fanyi
发布2025-01-31 21:40:45
发布2025-01-31 21:40:45
14300
代码可运行
举报
运行总次数:0
代码可运行

前言

如果你用过 Selenium 来爬取网页,可能会发现,很多网站会识别出你是在用爬虫,直接给你弹出验证码,甚至直接封你的 IP。为什么会这样?因为你的浏览器“长得不像正常用户”!

网站会通过“浏览器指纹”来判断你是不是个正常的访问者,发现你有问题就把你拦住。那么,什么是浏览器指纹?为什么它能识别你?又该怎么把自己的 Selenium 伪装成一个真正的用户呢?

今天这篇文章,就用大白话带你彻底搞懂 浏览器指纹 + Selenium 反检测,确保你的爬虫安全运行!


浏览器指纹到底是什么?

简单来说,浏览器指纹就是网站用来识别你的“身份信息”。即使你不登录网站,它仍然可以通过一些 隐形的参数 来判断你是谁、用的是什么设备、是不是一个正常的访问者。

比方说,你走进一个超市,店员不认识你,但如果你每天穿同一件衣服、走同样的路线、买一样的东西,他可能就能猜出来:“这个人我见过,他昨天也来了!”

网站的检测方式和这个类似,它们会通过 User-Agent、显卡信息、WebRTC、Canvas 指纹、浏览器插件 等信息来判断你是不是个正常用户。Selenium 默认的设置很容易暴露,所以网站会很容易发现你是个机器人。


Selenium 为什么会被识破?

你可能会好奇,Selenium 不就是个浏览器吗?怎么一上来就被发现了?其实,网站是通过几个关键点来识别你的。

首先,Selenium 自带的 "webdriver" 标签,会在 JavaScript 里暴露出来。如果你在 Chrome 的开发者工具里输入 navigator.webdriver,它会返回 True,网站一看到这个,就知道你是个爬虫了。

其次,你的 User-Agent 可能暴露了你。浏览器的 User-Agent 是告诉网站你在用什么浏览器、什么操作系统的。Selenium 里的默认 User-Agent 和正常用户的不同,网站一看就能发现。

还有,Canvas 和 WebGL 这些指纹参数,能暴露你的显卡信息。正常用户的绘图指纹是固定的,但 Selenium 绘制出来的图形会有些不同,网站就能检测到。

最后,WebRTC 可能会泄露你的真实 IP。很多爬虫会用代理,但 WebRTC 这个东西能绕过代理,直接暴露你的本地 IP,网站发现你的 IP 是假的,就会怀疑你。


如何让 Selenium 伪装成正常用户?

要让 Selenium 不被发现,我们需要“化个妆”,把它伪装成一个真正的用户。这就像是在超市里换件衣服、变个发型,让店员认不出来你。

第一步:修改 User-Agent

User-Agent 就像是你的“身份证”,网站通过它来判断你用的是什么浏览器。如果你不修改它,网站一看就是 Selenium 默认的参数,直接把你拒之门外。

修改 User-Agent 很简单,Selenium 允许我们在启动浏览器的时候修改它:

代码语言:python
代码运行次数:0
复制
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.177 Safari/537.36")

driver = webdriver.Chrome(options=options)
driver.get("https://www.whatismybrowser.com/")  # 这个网站可以检测你的 User-Agent

这个 options.add_argument("user-agent=xxx") 就是用来更改 User-Agent 的,现在你的浏览器看起来就像个正常的 Chrome 了。


第二步:让 navigator.webdriver 变成 False

Selenium 会在浏览器里加一个 navigator.webdriver=True 的标签,网站一看到这个,就知道你是机器人。所以,我们要想办法把它改掉:

代码语言:python
代码运行次数:0
复制
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

这样,网站再去检查 navigator.webdriver 的时候,它就不会返回 True 了。


第三步:解决 WebGL 指纹问题

网站会用 WebGL(网页绘图)来检查你的显卡信息。Selenium 渲染出来的 WebGL 可能跟普通用户的结果不一样,导致被检测。

我们可以用 JavaScript 来改写 WebGL 的参数,让它伪装成一台正常的电脑:

代码语言:python
代码运行次数:0
复制
driver.execute_script("""
    var getContext = HTMLCanvasElement.prototype.getContext;
    HTMLCanvasElement.prototype.getContext = function(type, attrs) {
        var ctx = getContext.apply(this, arguments);
        if (type === 'webgl' || type === 'experimental-webgl') {
            var getParameter = ctx.getParameter;
            ctx.getParameter = function(parameter) {
                if (parameter === 37446) {  // 这个参数是显卡信息
                    return "Intel(R) HD Graphics 630";  // 伪装成一张普通的显卡
                }
                return getParameter(parameter);
            };
        }
        return ctx;
    };
""")

第四步:阻止 WebRTC 泄露 IP

WebRTC 是个双刃剑,它可以让你的浏览器进行点对点通信,但同时也会暴露你的真实 IP。如果你用的是代理,但 WebRTC 还是暴露了你的本地 IP,那就前功尽弃了。

解决方案是用 JavaScript 禁用 WebRTC:

代码语言:python
代码运行次数:0
复制
driver.execute_script("""
    Object.defineProperty(navigator, 'connection', { get: () => undefined });
    Object.defineProperty(navigator, 'mozRTCPeerConnection', { get: () => undefined });
    Object.defineProperty(navigator, 'webkitRTCPeerConnection', { get: () => undefined });
""")

这样,网站就没法通过 WebRTC 获取你的真实 IP 了。


第五步:让 Selenium 的行为更像真实用户

很多网站不仅会看你的指纹,还会观察你的鼠标、键盘行为。如果它发现你的鼠标一点都不动,或者你的点击行为很机械,那就会怀疑你是机器人。

我们可以用 Selenium 模拟一些人类行为,比如随机移动鼠标、滚动页面:

代码语言:python
代码运行次数:0
复制
from selenium.webdriver.common.action_chains import ActionChains
import time

action = ActionChains(driver)
action.move_by_offset(100, 200).perform()
time.sleep(1)  # 停顿一秒,模拟真实用户

完整代码:一键伪装 Selenium

如果你不想一步步修改,可以直接用这个完整代码,包含所有反检测技巧:

代码语言:python
代码运行次数:0
复制
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.177 Safari/537.36")
options.add_argument("--disable-webrtc")

driver = webdriver.Chrome(options=options)

driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

driver.execute_script("""
    var getContext = HTMLCanvasElement.prototype.getContext;
    HTMLCanvasElement.prototype.getContext = function(type, attrs) {
        var ctx = getContext.apply(this, arguments);
        if (type === 'webgl' || type === 'experimental-webgl') {
            var getParameter = ctx.getParameter;
            ctx.getParameter = function(parameter) {
                if (parameter === 37446) {
                    return "Intel(R) HD Graphics 630";
                }
                return getParameter(parameter);
            };
        }
        return ctx;
    };
""")

driver.get("https://bot.sannysoft.com/")

这样,你的 Selenium 伪装就完成了!网站再也不会轻易识别出你是个机器人了。希望这篇文章对你有所帮助! 🚀

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 浏览器指纹到底是什么?
  • Selenium 为什么会被识破?
  • 如何让 Selenium 伪装成正常用户?
    • 第一步:修改 User-Agent
    • 第二步:让 navigator.webdriver 变成 False
    • 第三步:解决 WebGL 指纹问题
    • 第四步:阻止 WebRTC 泄露 IP
    • 第五步:让 Selenium 的行为更像真实用户
  • 完整代码:一键伪装 Selenium
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档