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

webdriver 反爬虫 (selenium反爬虫) 绕过

1. webdriver 反爬虫原理

爬虫程序可以借助渲染工具从动态网页中获取数据。
在这个过程中,“借助”其实是通过对应的浏览器驱动(即WebDriver)向浏览器发出指令的行为。因此,开发者可以根据客户端是否包含浏览器驱动这一特征来区分正常用户和爬虫程序。

webdriver 属性是我们最常听到的,通过 webdriver 驱动浏览器就会包含这一属性,因此可用来辨别爬虫程序(可检测的属性远不止这一种)。
WebDriver 检测的结果有3种,分别是true、false、undefined 。当我们使用的渲染工具有webdriver 属性时,navigator.webdriver 的返回值就是 true 。反之则会返回 false 或 undefine 。
由于 Selenium 通过 WebDriver 驱动浏览器,客户端的webdriver 属性存在,所以无法获得目标数据。注:Puppeteer 根据 DevTools 协议控制 Chrome 浏览器或 Chromium 浏览器,但 Puppeteer 也存在webdriver 属性。

执行以下代码,会导致 webdriver 属性检测不通过,如下图:

from selenium.webdriver import Chrome

driver = Chrome()
url = 'https://bot.sannysoft.com/'
driver.get(url)

2. webdriver 识别绕过:方法 1

undetected_chromedriver 是一个防止浏览器指纹特征被识别的依赖库,使用 undetected_chromedriver.Chrome() 新建浏览器窗口,从而修改浏览器指纹特征。
注:可以使用 “pip install undetected-chromedriver” 安装这个 py 库。

执行以下代码,可通过 webdriver 属性检测,如下图:

import undetected_chromedriver as uc

driver = uc.Chrome()
url = 'https://bot.sannysoft.com/'
driver.get(url)

3. webdriver 识别绕过:方法 2

原理:通过执行 driver.execute_cdp_cmd 命令,可以在网页加载前运行 js 代码,从而改变浏览器的指纹特征

因为 webdriver 属性置空 js 代码有更改,同时最好修改不止一个属性,因此直接使用开源分享的 js 代码比较方便。
js 文件网址:https://github.com/berstend/puppeteer-extra/blob/stealth-js/stealth.min.js
stealth.min.js 这个文件包含了常用的浏览器特征,我们只需要读取文件,然后执行即可。

执行以下代码,可通过 webdriver 属性检测,如下图:

from selenium.webdriver import Chrome

driver = Chrome()
with open('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)


http://www.kler.cn/a/444772.html

相关文章:

  • 嵌入式硬件面试题
  • aioice里面candidate固定UDP端口测试
  • golang断言
  • Word使用分隔符实现页面部分分栏
  • 操作系统文件管理
  • App自动化之dom结构和元素定位方式(包含滑动列表定位)
  • pnpm开发环境搭建
  • Knowledge Graph Prompting for Multi-Document Question Answering
  • 青少年编程与数学 02-004 Go语言Web编程 11课题、认证、授权与安全
  • Python中所有子图标签Legend显示详解
  • CSS 网页布局
  • 视频直播点播平台EasyDSS与无人机技术的森林防火融合应用
  • Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)
  • 1小时放弃Rust(2): 两数之和
  • 曲面的共形变换
  • HTML5(二)——canvas元素
  • 【设计与实现】基于springboot的房屋租赁系统
  • vue项目中使用ag-grid
  • springboot 配置Kafka 关闭自启动连接
  • 大数据-255 离线数仓 - Atlas 数据仓库元数据管理 数据血缘关系 元数据
  • 如何更好的对WebSocket的理解?应用场景?
  • 【自动化部署】Ansible Playbook 基础应用
  • 百度面试手撕 go context channel部分学习
  • 自动呼入机器人如何实现自动化学习?
  • 代码随想录-笔记-其七
  • 【C语言程序设计——选择结构程序设计】求阶跃函数的值(头歌实践教学平台习题)【合集】