当前位置: 首页 > news >正文

【Python】保持Selenium稳定爬取的方法(防检测策略)

selenium 防检测策略的方法汇总:

  1. 合理设置延迟:请求间添加随机延迟 (2-10秒)

  2. 限制爬取频率:控制每小时/每天的请求量

  3. 轮换用户代理:准备至少10个不同的User-Agent

  4. 使用住宅代理:优先选择高质量的住宅代理IP

  5. 处理验证码:集成2Captcha或Anti-Captcha服务

  6. 定期更新工具:保持selenium和浏览器驱动最新版本

1. 基础防检测配置

from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsdef get_stealth_driver():options = Options()# 基本防检测设置options.add_argument("--disable-blink-features=AutomationControlled")options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option("useAutomationExtension", False)# 禁用自动化控制标志options.add_argument("--disable-infobars")options.add_argument("--disable-dev-shm-usage")options.add_argument("--no-sandbox")# 随机用户代理user_agents = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64)...","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)..."]import randomoptions.add_argument(f"user-agent={random.choice(user_agents)}")driver = webdriver.Chrome(options=options)# 修改navigator.webdriver属性driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})return driver

2. 高级防检测技术

2.1 使用 undetected-chromedriver

import undetected_chromedriver as ucdef get_undetected_driver():options = uc.ChromeOptions()# 配置选项options.add_argument("--disable-popup-blocking")options.add_argument("--disable-notifications")# 随机窗口大小import randomwidth = random.randint(1000, 1400)height = random.randint(700, 900)options.add_argument(f"--window-size={width},{height}")driver = uc.Chrome(options=options,version_main=114,  # 匹配你的Chrome版本headless=False,use_subprocess=True)return driver

2.2 模拟人类行为模式

from selenium.webdriver.common.action_chains import ActionChains
import time
import randomdef human_like_behavior(driver, element=None):"""模拟人类操作行为"""actions = ActionChains(driver)# 随机鼠标移动if element:actions.move_to_element(element)else:x = random.randint(0, 500)y = random.randint(0, 500)actions.move_by_offset(x, y)# 随机延迟time.sleep(random.uniform(0.5, 2.5))# 随机滚动scroll_amount = random.randint(200, 800)driver.execute_script(f"window.scrollBy(0, {scroll_amount})")time.sleep(random.uniform(0.3, 1.8))actions.perform()

3. 完整防检测爬取流程

def stealth_scrape(url):try:# 使用undetected-chromedriverdriver = get_undetected_driver()# 访问目标URLdriver.get(url)# 随机等待time.sleep(random.uniform(2, 5))# 模拟人类浏览行为human_like_behavior(driver)# 执行实际爬取操作# 示例:获取页面标题title = driver.titleprint(f"成功获取页面标题: {title}")# 更多爬取逻辑...except Exception as e:print(f"爬取过程中发生错误: {str(e)}")finally:driver.quit()
# 使用示例
stealth_scrape("https://example.com")

4. 额外防护措施

4.1 代理IP轮换

proxies = ["123.45.67.89:8080","98.76.54.32:3128"
] #换成自己的def get_proxy_driver():options = uc.ChromeOptions()proxy = random.choice(proxies)options.add_argument(f"--proxy-server=http://{proxy}")return uc.Chrome(options=options)

4.2 指纹混淆

def modify_fingerprint(driver):# 修改屏幕分辨率driver.execute_script("Object.defineProperty(screen, 'width', {get: () => 1920});""Object.defineProperty(screen, 'height', {get: () => 1080});")# 修改时区driver.execute_cdp_cmd("Emulation.setTimezoneOverride",{"timezoneId": "America/New_York"})# 修改WebGL指纹driver.execute_script("const getParameter = WebGLRenderingContext.prototype.getParameter;""WebGLRenderingContext.prototype.getParameter = function(parameter) {""  if (parameter === 37445) { return 'NVIDIA Corporation'; }""  return getParameter.call(this, parameter);""};")

5. 检测与验证

def test_stealth(driver):test_urls = ["https://bot.sannysoft.com","https://arh.antoinevastel.com/bots/areyouheadless"]for url in test_urls:driver.get(url)time.sleep(3)driver.save_screenshot(f"stealth_test_{url.split('/')[-1]}.png")print(f"测试结果已保存: stealth_test_{url.split('/')[-1]}.png")

相关文章:

  • 点云从入门到精通技术详解100篇-基于二次误差和高斯混合模型的点云配准算法
  • Java学习手册:时间戳、时区等相关概念
  • 项目笔记2:post请求是什么,还有什么请求
  • 应力腐蚀环功能及指标
  • 【AI平台】n8n入门2:第一个工作流,调用本地大模型
  • 【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来
  • 虚拟滚动;懒加载;高并发组件
  • Java与Kotlin在Android开发中的全面对比分析
  • Python Cookbook-6.8 避免属性读写的冗余代码
  • TCP粘包拆包全攻略:Netty实战解决高并发通信难题
  • AKM旭化成微电子全新推出能量收集IC“AP4413系列”
  • iOS/Android 使用 C++ 跨平台模块时的内存与生命周期管理
  • kvm网卡发现的采集信息脚本COLT_CMDB_KVM_NETDISC.sh
  • ViewPager FragmentPagerAdapter在系统杀死应用后重建时UI不刷新的问题
  • 河北省大数据应用创新大赛样题
  • 大模型——快速部署和使用 Deep Research Web UI
  • SOLID 原则在单片机环境下的 C 语言实现示例,结合嵌入式开发常见场景进行详细说明
  • [吾爱出品] 【键鼠自动化工具】支持识别窗口、识图、发送文本、按键组合等
  • 基于AI应用创业IDEA:使用百度搜索开放平台的MCP广场智能推荐MCPServices服务
  • java使用CMU sphinx语音识别
  • 外交部:欢迎外国朋友“五一”来中国
  • 国家发改委:是否进口美国饲料粮、油料不会影响我国粮食供应
  • 张译、惠英红分获第二十届中国电影华表奖优秀男、女演员奖
  • 游戏论|迟来的忍者与武士:从《刺客信条:影》论多元话语的争议
  • 居民被脱落的外墙瓦砖砸中致十级伤残,小区物业赔付16万元
  • 弘扬 “上海精神”,上合组织政党论坛聚焦政党责任与使命