解决反爬虫机制的最全面方案
本方案均来自互联网开源方案,爬虫请遵守网站的robots.txt协议,请勿非法爬虫!
目录
WebDriver 反爬虫原理
WebDriver 反爬虫技术是网站用于检测和阻止自动化浏览器(如 Selenium, Puppeteer)的技术,其核心原理是通过检测浏览器环境的特征来判断是否为真实用户操作。
爬虫检测网站:https://bot.sannysoft.com/
核心检测原理
1. WebDriver 特征检测
-
navigator.webdriver属性:-
在自动化控制的浏览器中,该属性值为
true -
正常浏览器中该属性为
undefined或false
-
2. 浏览器插件检测
-
检测特定插件:
-
WebDriver 通常包含特定插件,如
ChromeDriver
-
3. 浏览器参数检测
-
检测命令行参数:
-
自动化浏览器通常带有特定参数:
-
--enable-automation -
--headless -
--disable-blink-features=AutomationControlled
-
-
解决方案
默认使用selenium自动化请求该网站,webDriver检测不通过:

1. 使用undetected_chromedriver库
安装库:pip install undetected_chromedriver
undetected_chromedriver 是一个用于绕过浏览器自动化检测的Python库。使用Selenium 启动 Chrome 浏览器时避免被检测为自动化脚本,在避免反爬机制的场景下非常有用。
执行以下代码,通过 webdriver 属性检测通过:
import undetected_chromedriver as uc
driver = uc.Chrome()
driver.get("https://bot.sannysoft.com/")
2. 网页加载前运行开源 js 代码
js文件下载:https://github.com/berstend/puppeteer-extra/blob/stealth-js/stealth.min.js
stealth.min.js:该文件包含了常用的浏览器特征,我们只需要在python中读取此文件即可。
执行以下代码,通过 webdriver 属性检测通过:
from selenium import webdriver
driver = webdriver.Chrome()
with open('./js/stealth.min.js', encoding='utf-8') as f:
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': f.read()})
# 在页面刚加载的时候执行JavaScript语句
url = 'https://bot.sannysoft.com/'
driver.get(url)

User-Agent 反爬虫原理
User-Agent反爬虫是一种常见的反爬措施,通过识别HTTP请求中的User-Agent字段来判断请求是否来自真实用户或爬虫程序。
User-Agent字段的作用:User-Agent是HTTP请求头的一部分,用于标识客户端类型、操作系统、浏览器版本等信息。正常用户通过浏览器访问时,User-Agent会包含浏览器和系统的详细标识;而爬虫程序可能使用默认或简单的User-Agent。
反爬机制的实现方式:服务器端会维护一个已知爬虫User-Agent的黑名单或模式。当请求的User-Agent匹配黑名单或不符合正常浏览器的特征时,服务器可能拒绝访问、返回错误页面或要求验证。
常见检测特征
1. 缺省及黑名单User-Agent
如缺省ua:Python-urllib/3.10;
动态更新的黑名单:部分网站会不断更新爬虫特征库,需要定期更新User-Agent。
2. 包含bot、spider、crawl等关键词
3. 缺少浏览器版本或系统信息
4. 请求频率过高且User-Agent单一
解决方案
1. 使用真实浏览器User-Agent
从主流浏览器中获取真实User-Agent字符串。
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
2. 轮换多个User-Agent
准备一个User-Agent池,在请求间随机切换不同浏览器和版本的标识。
user_agent_pool = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E5239e Safari/602.1',
# ... 其他User-Agent字符串
]
# 从User-Agent池中随机选择一个User-Agent
user_agent = random.choice(user_agent_pool)
# 设置请求头
headers = {
'User-Agent': user_agent
}
3. 配合其他请求头
同时设置Accept、Accept-Language等头部,模拟完整浏览器行为。
headers = {
'User-Agent': 'Mozilla/5.0...',
'Accept': 'text/html...',
'Accept-Language': 'en-US,en;q=0.9'
}
4. 降低请求频率
控制访问间隔,避免触发频率限制。可设置随机延迟。
import time
import random
time.sleep(random.uniform(1, 3))
5. 设置IP代理池
ip代理池就是一个集合,存放着多个可用的代理IP地址。每次爬虫请求时,可以从这个池子里轮换使用不同的IP地址。比如你的爬虫请求目标服务器时,不是直接用主机的IP,而是从代理池中选一个代理IP,这样在目标网站看来,似乎是“不同用户”发起的请求,从而避免“请求过多被限制”。
import random
# 假设我们手头上有一些免费的代理IP列表
proxy_pool = [
"http://192.168.0.1:8080",
"http://192.168.0.2:8080",
"http://192.168.0.3:8080",
]
# 从池中随机挑选一个
proxy = random.choice(proxy_pool)
print(f"使用代理: {proxy}")
❤如果文章对您有帮助,您的点赞就是我最大的动力❤
更多推荐

所有评论(0)