如果你用过 Selenium 来爬取网页,可能会发现,很多网站会识别出你是在用爬虫,直接给你弹出验证码,甚至直接封你的 IP。为什么会这样?因为你的浏览器“长得不像正常用户”!
网站会通过“浏览器指纹”来判断你是不是个正常的访问者,发现你有问题就把你拦住。那么,什么是浏览器指纹?为什么它能识别你?又该怎么把自己的 Selenium 伪装成一个真正的用户呢?
今天这篇文章,就用大白话带你彻底搞懂 浏览器指纹 + Selenium 反检测,确保你的爬虫安全运行!
简单来说,浏览器指纹就是网站用来识别你的“身份信息”。即使你不登录网站,它仍然可以通过一些 隐形的参数 来判断你是谁、用的是什么设备、是不是一个正常的访问者。
比方说,你走进一个超市,店员不认识你,但如果你每天穿同一件衣服、走同样的路线、买一样的东西,他可能就能猜出来:“这个人我见过,他昨天也来了!”
网站的检测方式和这个类似,它们会通过 User-Agent、显卡信息、WebRTC、Canvas 指纹、浏览器插件 等信息来判断你是不是个正常用户。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 不被发现,我们需要“化个妆”,把它伪装成一个真正的用户。这就像是在超市里换件衣服、变个发型,让店员认不出来你。
User-Agent 就像是你的“身份证”,网站通过它来判断你用的是什么浏览器。如果你不修改它,网站一看就是 Selenium 默认的参数,直接把你拒之门外。
修改 User-Agent 很简单,Selenium 允许我们在启动浏览器的时候修改它:
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
变成 FalseSelenium 会在浏览器里加一个 navigator.webdriver=True
的标签,网站一看到这个,就知道你是机器人。所以,我们要想办法把它改掉:
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
这样,网站再去检查 navigator.webdriver
的时候,它就不会返回 True
了。
网站会用 WebGL(网页绘图)来检查你的显卡信息。Selenium 渲染出来的 WebGL 可能跟普通用户的结果不一样,导致被检测。
我们可以用 JavaScript 来改写 WebGL 的参数,让它伪装成一台正常的电脑:
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,那就前功尽弃了。
解决方案是用 JavaScript 禁用 WebRTC:
driver.execute_script("""
Object.defineProperty(navigator, 'connection', { get: () => undefined });
Object.defineProperty(navigator, 'mozRTCPeerConnection', { get: () => undefined });
Object.defineProperty(navigator, 'webkitRTCPeerConnection', { get: () => undefined });
""")
这样,网站就没法通过 WebRTC 获取你的真实 IP 了。
很多网站不仅会看你的指纹,还会观察你的鼠标、键盘行为。如果它发现你的鼠标一点都不动,或者你的点击行为很机械,那就会怀疑你是机器人。
我们可以用 Selenium 模拟一些人类行为,比如随机移动鼠标、滚动页面:
from selenium.webdriver.common.action_chains import ActionChains
import time
action = ActionChains(driver)
action.move_by_offset(100, 200).perform()
time.sleep(1) # 停顿一秒,模拟真实用户
如果你不想一步步修改,可以直接用这个完整代码,包含所有反检测技巧:
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 删除。