DrissionPage防检测
DrissionPage 是一款基于 Python 的全能型网页自动化工具,创新性地将浏览器自动化与直接 HTTP 请求两大模式完美融合。它不仅具备 Selenium 的动态页面处理能力,还拥有 requests 的高效特性,堪称爬虫开发者的瑞士军刀。
随着反爬技术的不断更新,爬虫程序被检测出来的概率也越来越高,因此绕过反爬检查的手段也越来越多,本文以主要解决DrissionPage检查问题,从而绕过网站检测。
注:使用本代码所产生的一切后果与作者无关!!!
from DrissionPage import ChromiumPage
# 初始化浏览器配置
co = ChromiumOptions()
# 创建页面实例
page = ChromiumPage(co)
page.get('https://www.baidu.com/')
page.refresh()
page.wait(2)
这是一段简单的自动化代码,目的是前往百度;代码无任何伪装,因此有被检测出自动化程序的风险。因此,我们添加伪装代码。
1、反检测方法一
# 初始化浏览器配置
co = ChromiumOptions()
co.incognito() # 匿名模式
# 关键:使用改进的无头模式配置,避免被检测
co.set_argument("--headless=new") # 使用新的无头模式(Chrome 112+)
co.set_argument("--disable-blink-features=AutomationControlled") # 禁用自动化特征
co.set_argument("--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")
# 模拟真实浏览器窗口特征
co.set_argument("--window-size=1920,1080")
co.set_argument("--no-sandbox")
co.set_argument("--disable-dev-shm-usage")
co.set_argument("--disable-gpu")
co.set_argument("--enable-webgl")
co.set_argument("--ignore-gpu-blocklist")
co.set_argument("--enable-automation=false") # 伪装非自动化
co.set_argument("--remote-debugging-port=9222") # 模拟开发者工具
通过添加相应的参数信息,模拟真实的浏览器,从而绕过目标网站的检测,保证自动化程序的正常运行。
2、反检测方法二
page_instance = ChromiumPage(co)
page_instance.listen.start('functionId=getPaimaiRealTimeData')
page_instance.get(start_url)
# 增强版反检测JS,重点绕过无头模式特征检测
page_instance.run_js("""// 1. 补充无头模式缺失的window属性if (!window.chrome) {window.chrome = {app: { isInstalled: false },webstore: {},runtime: { PlatformOs: { WIN: 'win' }, enable: () => {}, lastError: null }};}// 2. 修复无头模式下的navigator特征Object.defineProperty(navigator, 'webdriver', { get: () => undefined });Object.defineProperty(navigator, 'plugins', { get: () => [{ name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' },{ name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai' }] });Object.defineProperty(navigator, 'languages', { get: () => ['zh-CN', 'zh', 'en-US'] });Object.defineProperty(navigator, 'maxTouchPoints', { get: () => 5 }); // 模拟触摸屏// 3. 修复屏幕和设备特征Object.defineProperty(screen, 'availTop', { get: () => 0 });Object.defineProperty(screen, 'availLeft', { get: () => 0 });Object.defineProperty(screen, 'colorDepth', { get: () => 24 });Object.defineProperty(screen, 'pixelDepth', { get: () => 24 });// 4. 移除自动化痕迹delete window.__webdriver_evaluate;delete window.__driver_evaluate;// 5. 模拟真实浏览器的API实现window.matchMedia = window.matchMedia || function() {return { matches: false, addListener: () => {}, removeListener: () => {} };};""")
通过添加JS功能代码,绕过检查,这种方式一般更加强大,比起方法一,此方式被检测出来的概率更低。
3、完整代码
通常建议两种方式结合在一起使用,毕竟有备无患。
# 初始化浏览器配置
co = ChromiumOptions()
co.incognito() # 匿名模式
# 关键:使用改进的无头模式配置,避免被检测
co.set_argument("--headless=new") # 使用新的无头模式(Chrome 112+)
co.set_argument("--disable-blink-features=AutomationControlled") # 禁用自动化特征
co.set_argument("--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")
# 模拟真实浏览器窗口特征
co.set_argument("--window-size=1920,1080")
co.set_argument("--no-sandbox")
co.set_argument("--disable-dev-shm-usage")
co.set_argument("--disable-gpu")
co.set_argument("--enable-webgl")
co.set_argument("--ignore-gpu-blocklist")
co.set_argument("--enable-automation=false") # 伪装非自动化
co.set_argument("--remote-debugging-port=9222") # 模拟开发者工具
# 创建页面实例
page_instance = ChromiumPage(co)
page_instance.listen.start('functionId=getPaimaiRealTimeData')
# 模拟自动化跳转百度
page_instance.get(https://www.baidu.com/)
# 增强版反检测JS,重点绕过无头模式特征检测
page_instance.run_js("""// 1. 补充无头模式缺失的window属性if (!window.chrome) {window.chrome = {app: { isInstalled: false },webstore: {},runtime: { PlatformOs: { WIN: 'win' }, enable: () => {}, lastError: null }};}// 2. 修复无头模式下的navigator特征Object.defineProperty(navigator, 'webdriver', { get: () => undefined });Object.defineProperty(navigator, 'plugins', { get: () => [{ name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' },{ name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai' }] });Object.defineProperty(navigator, 'languages', { get: () => ['zh-CN', 'zh', 'en-US'] });Object.defineProperty(navigator, 'maxTouchPoints', { get: () => 5 }); // 模拟触摸屏// 3. 修复屏幕和设备特征Object.defineProperty(screen, 'availTop', { get: () => 0 });Object.defineProperty(screen, 'availLeft', { get: () => 0 });Object.defineProperty(screen, 'colorDepth', { get: () => 24 });Object.defineProperty(screen, 'pixelDepth', { get: () => 24 });// 4. 移除自动化痕迹delete window.__webdriver_evaluate;delete window.__driver_evaluate;// 5. 模拟真实浏览器的API实现window.matchMedia = window.matchMedia || function() {return { matches: false, addListener: () => {}, removeListener: () => {} };};""")
防止检测的方式有很多,本文仅介绍这两种,更多方式请自行查找。
注:使用本文代码应在不违反法律的前提下进行。