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

Selenium 隐藏浏览器指纹特征的几种方式

文章转载于:https://mp.weixin.qq.com/s/sXRXwMDqekUHfU2SnL-PYg

我们使用 Selenium 对网页进行爬虫时,如果不做任何处理直接进行爬取,会导致很多特征是暴露的
对一些做了反爬的网站,做了特征检测,用来阻止一些恶意爬虫。
本篇文章将介绍几种常用的隐藏浏览器指纹特征的方式

1. 直接爬取

目标对象:aHR0cHM6Ly9xaWthbi5jcXZpcC5jb20vUWlrYW4vU2VhcmNoL0FkdmFuY2U=

我们使用 Selenium 直接爬取目标页面

# selenium 直接爬取from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import timechrome_options = Options(
s = Service(r"chromedriver.exe路径")
driver = webdriver.Chrome(service=s, options=chrome_options)
driver.get(url='URL')
driver.save_screenshot('result.png')# 保存
source = driver.page_source
with open('result.html', 'w') as f:f.write(source)time.sleep(200)

页面明显做了反爬,网页返回直接返回空白内容

在这里插入图片描述

2. CDP

CDP 全称为 Chrome Devtools-Protocol

https://chromedevtools.github.io/devtools-protocol/

通过执行 CDP 命令,可以在网页加载前运行一段代码,进而改变浏览器的指纹特征

比如,window.navigator.webdriver 在 Selenium 直接打开网页时返回结果为 true;而手动打开网页时,该对象值为 undefined

因此,我们可以利用 CDP 命令修改该对象的值,达到隐藏指纹特征的目的

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import timechrome_options = Options()s = Service(r"chromedriver.exe路径")driver = webdriver.Chrome(service=s, options=chrome_options)# 执行cdp命令,修改(window.navigator.webdriver )对象的值
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""
})driver.get(url='URL')driver.save_screenshot('result.png')# 保存
source = driver.page_source
with open('result.html', 'w', encoding='utf-8') as f:f.write(source)time.sleep(200)

需要指出的是,浏览器的指纹特征很多,使用该方法存在一些局限性

3. stealth.min.js

该文件包含了常用的浏览器特征,我们只需要读取该文件,然后执行 CDP 命令即可

下载地址:

https://github.com/berstend/puppeteer-extra/tree/stealth-js

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import timechrome_options = Options()# 无头模式
# chrome_options.add_argument("--headless")# 添加请求头
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36')s = Service(r"chromedriver.exe路径")driver = webdriver.Chrome(service=s, options=chrome_options)# 利用stealth.min.js隐藏浏览器指纹特征
# stealth.min.js下载地址:https://github.com/berstend/puppeteer-extra/tree/stealth-js
with open('./stealth.min.js') as f:driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": f.read()})driver.get(url='URL')
# driver.get(url='https://bot.sannysoft.com/')# 保存图片
driver.save_screenshot('result.png')time.sleep(200)

4. undetected_chromedriver

这是一个防止浏览器指纹特征被识别的依赖库,可以自动下载驱动配置再运行

项目地址:
https://github.com/ultrafunkamsterdam/undetected-chromedriver

使用步骤也很方便
首先,我们安装依赖库

# 安装依赖
pip3 install undetected-chromedriver

然后,通过下面几行代码就能完美隐藏浏览器的指纹特征

from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time
import undetected_chromedriver as ucchrome_options = Options()
# chrome_options.add_argument("--headless")s = Service(r"chromedriver.exe")driver = uc.Chrome(service=s, options=chrome_options)driver.get(url='URL')
# driver.get(url='https://bot.sannysoft.com/')driver.save_screenshot('result.png')
time.sleep(100)

5. 操作已开启的浏览器

最后一种方式上篇文章已经介绍过

如何利用 Selenium 对已打开的浏览器进行爬虫!

我们只需要通过命令行启动一个浏览器

import subprocess# 1、打开浏览器
# 指定端口号为:1234
# 配置用户数据路径:--user-data-dir
cmd = 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe --remote-debugging-port=1234 --user-data-dir="C:\\selenum\\user_data"'subprocess.run(cmd)

然后,利用 Selenium 直接操作上面的浏览器即可模拟正常操作浏览器的行为

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service# 操作上面已经打开的浏览器,进行百度搜索
chrome_options = Options()# 指定已经打开浏览器的地址及端口号
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:1234")# 注意:chrome版本与chromedirver驱动要保持一致
# 下载地址:http://chromedriver.storage.googleapis.com/index.html
s = Service(r"chromedriver.exe")driver = webdriver.Chrome(service=s, options=chrome_options)# 打开目标网站
driver.get(url="URL")time.sleep(200)

相关文章:

Selenium 隐藏浏览器指纹特征的几种方式

文章转载于:https://mp.weixin.qq.com/s/sXRXwMDqekUHfU2SnL-PYg 我们使用 Selenium 对网页进行爬虫时,如果不做任何处理直接进行爬取,会导致很多特征是暴露的 对一些做了反爬的网站,做了特征检测,用来阻止一些恶意爬虫…...

k8s发布nacos-server,nodeport配置注意事项

k8s发布nacos-server注册不上问题 问题描述:分析过程: 问题描述: k8s发布nacos-server做服务公用使用,nodeport暴漏服务给客户端注册, nacos:端口 8848:30601 9848:30701 分析过程&#xff1a…...

伪分布式Spark集群搭建

一、软件环境 软 件 版 本 安 装 包 VMware虚拟机 16 VMware-workstation-full-16.2.2-19200509.exe SSH连接工具 FinalShell Linux OS CentOS7.5 CentOS-7.5-x86_64-DVD-1804.iso JDK 1.8 jdk-8u161-linux-x64.tar.gz Spark 3.2.1 spark-3.2.1-bin-…...

Android 监听卫星导航系统状态及卫星测量数据变化

源码 package com.android.circlescalebar;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.conte…...

鸿蒙培训开发:就业市场的新热点~

金三银四在即,随着春节假期结束,各行各业纷纷复工复产,2024年的春季招聘市场也迎来了火爆的局面。最近发布的《2024年春招市场行情周报(第一期)》显示,尽管整体就业市场仍处于人才饱和状态,但华…...

【C++】string的底层剖析以及模拟实现

一、字符串类的认识 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理&a…...

Unity的PICO项目基础环境搭建笔记(调试与构建应用篇)

文章目录 前言一、为设备开启开发者模式1、开启PICO VR一体机。前往设置>通用>关于本机>软件版本号2、一直点击 软件版本号 ,直到出现 开发者 选项3、进入 开发者模式,打开 USB调试,选择 文件传输 二、实时预览应用场景1、下载PC端的…...

电脑远程桌面选项变成灰色没办法勾选怎么办?

有些人在使用Windows系统自带的远程桌面工具时,会发现系统属性远程桌面选项卡中勾选启用“允许远程连接到此计算机”。 导致此问题出现的原因主要是由于组策略或者注册表设置错误造成的。 修复远程桌面选项变灰的两种方法! 方法一:设置本地组…...

2024.3.14

1.成员函数版本实现算术运算符的重载,全局函数版本实现算术运算符的重载 #include <iostream>using namespace std;class Room {friend const Room operator-(const Room &a,const Room &b); private:string a;int b; public:Room(){}Room(string a,int b):a(a)…...

chatGPT的耳朵!OpenAI的开源语音识别AI:Whisper !

语音识别是通用人工智能的重要一环&#xff01;可以说是AI的耳朵&#xff01; 它可以让机器理解人类的语音&#xff0c;并将其转换为文本或其他形式的输出。 语音识别的应用场景非常广泛&#xff0c;比如智能助理、语音搜索、语音翻译、语音输入等等。 然而&#xff0c;语音…...

C语言冒泡排序

冒泡排序是一种简单的排序算法&#xff0c;通过重复遍历要排序的数列&#xff0c;依次比较两个相邻的元素&#xff0c;如果它们的顺序错误则交换它们。这个过程会重复进行&#xff0c;直到没有相邻的元素需要交换&#xff0c;也就是数列已经排序完成。 冒泡排序的名字来源于其工…...

vue2 elementui 封装一个动态表单复杂组件

封装一个动态表单组件在 Vue 2 和 Element UI 中需要考虑到表单字段的动态添加、删除以及验证等复杂功能。下面是一个简单的例子&#xff0c;展示如何创建一个可以动态添加和删除字段的表单组件。 首先&#xff0c;你需要安装并引入 Element UI&#xff1a; bash 复制 npm in…...

基于智慧灯杆的智慧城市解决方案(2)

功能规划 智慧照明功能 智慧路灯的基本功能仍然是道路照明, 因此对照明功能的智慧化提升是最基本的一项要求。 对道路照明管理进行智慧化提升, 实施智慧照明, 必然将成为智慧城市中道路照明发展的主要方向之一。 智慧照明是集计算机网络技术、 通信技术、 控制技术、 数据…...

「Paraverse平行云」亮相HKSTP OPENHOUSE活动

&#x1f680;11月7日&#xff0c;「Paraverse平行云」参展香港科学园HKSTP一年一度的Open House活动&#xff01; ✨ 众多专家、同行与我们驻足深入交流&#xff0c;探索实时云渲染解决方案LarkXR在在数字人、数字孪生、建筑信息模型&#xff08;BIM&#xff09;、3D建模、建筑…...

CubeMX使用教程(5)——定时器PWM输出

本篇我们将利用CubeMX产生频率固定、占空比可调的两路PWM信号输出 例如PA6引脚输出100Hz的PWM&#xff1b;PA7引脚输出500Hz的PWM&#xff0c;双路同时输出 我们还是利用上一章定时器中断的工程进行学习&#xff0c;这样比较方便 首先打开CubeMX对PA6、PA7进行GPIO配置 注&a…...

superset连接Apache Spark SQL(hive)过程中的各种报错解决

superset连接数据库官方文档&#xff1a;Installing Database Drivers | Superset 我们用的是Apache Spark SQL&#xff0c;所以首先需要安装下pyhive #命令既下载了pyhive也下载了它所依赖的其他安装包 pip install pyhive#多个命令也可下载 pip install sasl pip install th…...

Pulsar IO实战

一、引言 今天跟着 官方文档 基于docker玩一把Pulsar IO吧 二、概要 在用户能够轻松的将消息队列跟其他系统(数据库、其他消息系统)一起使用时&#xff0c;消息队列的作用才是最强大的。而Pulsar IO connectors可以让你很轻松的创建、部署以及管理这些跟外部系统的连接&#…...

Linux/Ubuntu/Debian基本命令:文本操作

Linux系统真的超级好用&#xff0c;免费&#xff0c;有很多开源且功能强大的软件。尤其是Ubuntu&#xff0c;真的可以拯救十年前的老电脑。 下面是用于在命令行界面&#xff08;Terminal&#xff09;中进行文本操作的键盘快捷键&#xff0c; 这些快捷方式对于高效的文本编辑非常…...

Self-supervised Contextual Keyword and Keyphrase Retrieval with Self-Labelling

文章目录 题目摘要方法数据集实验 题目 通过自我标记进行自我监督的上下文关键字和关键词短语检索 论文地址&#xff1a;https://www.preprints.org/manuscript/201908.0073/v1 项目地址&#xff1a;https://github.com/naister/Keyword-OpenSource-Data 摘要 在本文中&#x…...

新 树莓派4B 温湿度监测 基于debian12的树莓派OS

前言 本文旨在完成通过外接温湿度传感器至树莓派使得树莓派不断记录并存储温湿度数据 这个领域有很多文章&#xff0c;但是部分文章已经缺乏了时效性&#xff0c;在最新系统不适用&#xff0c;本文目前适用 硬件 硬件连接 温湿度传感器常选用DHT11和DHT22&#xff0c;淘宝…...

如何构建企业级自动化预约系统:架构设计与工程实践

如何构建企业级自动化预约系统&#xff1a;架构设计与工程实践 【免费下载链接】campus-imaotai i茅台app自动预约&#xff0c;每日自动预约&#xff0c;支持docker一键部署&#xff08;本项目不提供成品&#xff0c;使用的是已淘汰的算法&#xff09; 项目地址: https://git…...

对比直接使用厂商API体验Taotoken在路由与容灾方面的优势

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用厂商API体验Taotoken在路由与容灾方面的优势 在开发基于大模型的应用时&#xff0c;开发者通常会面临一个选择&#x…...

初次使用Taotoken,从注册到发出第一个API请求的全流程耗时记录

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初次使用Taotoken&#xff0c;从注册到发出第一个API请求的全流程耗时记录 1. 场景与目标 本文旨在记录一名新用户从零开始&#…...

【流体】基于matlab对沼气厂管道系统进行流体动力学设计和成本优化(最小化总年化成本TAC)【含Matlab源码 15560期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…...

Taotoken 模型广场选型与切换对于项目原型开发效率的影响

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken 模型广场选型与切换对于项目原型开发效率的影响 在项目原型开发阶段&#xff0c;团队的核心目标是快速验证想法、测试功能…...

如何在3分钟内将视频压缩90%?免费开源神器CompressO完全指南

如何在3分钟内将视频压缩90%&#xff1f;免费开源神器CompressO完全指南 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compr…...

Gemini深度研究模式全解析(2024最新版API+多模态检索内参):谷歌内部技术白皮书级拆解

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Gemini深度研究模式的核心定位与演进脉络 Gemini深度研究模式并非单纯的功能叠加&#xff0c;而是Google面向复杂知识工作场景构建的推理范式跃迁。它将多跳检索、跨模态证据聚合与可验证推理链生成深度融合&…...

DeepSeek训练数据准备实战手册(含GitHub可复现Pipeline):覆盖去重、毒性过滤、领域配比、版权脱敏、质量打分五大核心模块

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek训练数据准备概述 DeepSeek系列大语言模型的训练质量高度依赖于原始数据的规模、多样性与清洗精度。数据准备并非简单拼接语料&#xff0c;而是一个涵盖采集、去重、过滤、格式标准化与安全对齐的系统…...

028、原理图ERC检查与常见错误排查

028 原理图ERC检查与常见错误排查 一次让我通宵的“悬空引脚”教训 几年前做一款工业控制板,原理图画完,自我感觉良好,直接丢给Layout工程师。结果板子回来,上电就烧了一路电源。查了两天,最后发现是一个运放的反馈引脚在原理图上画了线,但网络标号写错了——那个引脚实…...

VisualGGPK2终极指南:轻松管理《流放之路》游戏资源的完整教程

VisualGGPK2终极指南&#xff1a;轻松管理《流放之路》游戏资源的完整教程 【免费下载链接】VisualGGPK2 Library for Content.ggpk of PathOfExile (Rewrite of libggpk) 项目地址: https://gitcode.com/gh_mirrors/vi/VisualGGPK2 VisualGGPK2是一款专为《流放之路》(…...