undetected_chromedriver解决网页被检测

一、问题分析

selenium打开浏览器模仿人工操作是诸多爬虫工作者最万能的网页数据获取方式,但是在做自动化爬虫时,经常被检测到是selenium驱动。比如前段时间selenium打开维普高级搜索时得到的页面是空白页,懂车帝对selenium反爬也很厉害。

image-20230529142325435

二、Selenium为何会被检测

主要原因是selenium打开的浏览器指纹和人工操作打开的浏览器指纹是不同的,比如最熟知的window.navigator.webdriver关键字,在selenium打开的浏览器打印返回结果为true,而正常浏览器打印结果返回为undefined,我们可以在(https://bot.sannysoft.com/)网站比较各关键字。

三、Selenium防检测方法

1. 修改window.navigator.webdriver关键字返回结果

from selenium import webdriver
options = webdriver.ChromeOptions()

# 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
            Object.defineProperty(navigator, 'webdriver', {
              get: () => undefined
            })
            """
        })

但是因为浏览器指纹很多,这种方法的局限性是显而易见的。

2. 使用stealth.min.js文件防止selenium被检测

import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36')
driver = Chrome('./chromedriver', options=chrome_options)

with open('/Users/kingname/test_pyppeteer/stealth.min.js') as f:
    js = f.read()

driver.execute_cdp_cmd("Page.add`在这里插入代码片`ScriptToEvaluateOnNewDocument", {
  "source": js
})

stealth.min.js文件来源于puppeteer,有开发者给 puppeteer 写了一套插件,叫做puppeteer-extra。其中,就有一个插件叫做puppeteer-extra-plugin-stealth专门用来让 puppeteer 隐藏模拟浏览器的指纹特征。

python开发者就需要把其中的隐藏特征的脚本提取出来,做成一个 js 文件。然后让 Selenium 或者 Pyppeteer 在打开任意网页之前,先运行一下这个 js 文件里面的内容。

puppeteer-extra-plugin-stealth的作者还写了另外一个工具,叫做extract-stealth-evasions。这个东西就是用来生成stealth.min.js文件的。

三、使用undetected_chromedriver

undetected_chromedriver 可以防止浏览器特征被识别,并且可以根据浏览器版本自动下载驱动。不需要自己去下载对应版本的chromedriver。

import undetected_chromedriver as uc
driver = uc.Chrome()
driver.get('目标网址')

四、undetected_chromedriver自定义功能

import undetected_chromedriver as uc
 
#specify chromedriver version to download and patch
#this did not work correctly until 1.2.1
uc.TARGET_VERSION = 78    
 
# or specify your own chromedriver binary to patch
undetected_chromedriver.install(
    executable_path='c:/users/user1/chromedriver.exe',
)
from selenium.webdriver import Chrome, ChromeOptions
opts = ChromeOptions()
opts.add_argument(f'--proxy-server=socks5://127.0.0.1:9050')
driver = Chrome(options=opts)
driver.get('目标网址')

有时候会报chrome的版本不匹配,undetected_chromedriver可以根据浏览器版本自动下载驱动,自然不存在版本不匹配问题,最终发现是undetected_chromedriver只支持chrome96及以上的版本,需将chrome浏览器版本升级。

五、undetected-chromedriver 代理插件

import os
import shutil
import tempfile

import undetected_chromedriver as webdriver


class ProxyExtension:
    manifest_json = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "Chrome Proxy",
        "permissions": [
            "proxy",
            "tabs",
            "unlimitedStorage",
            "storage",
            "<all_urls>",
            "webRequest",
            "webRequestBlocking"
        ],
        "background": {"scripts": ["background.js"]},
        "minimum_chrome_version": "76.0.0"
    }
    """

    background_js = """
    var config = {
        mode: "fixed_servers",
        rules: {
            singleProxy: {
                scheme: "http",
                host: "%s",
                port: %d
            },
            bypassList: ["localhost"]
        }
    };

    chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

    function callbackFn(details) {
        return {
            authCredentials: {
                username: "%s",
                password: "%s"
            }
        };
    }

    chrome.webRequest.onAuthRequired.addListener(
        callbackFn,
        { urls: ["<all_urls>"] },
        ['blocking']
    );
    """

    def __init__(self, host, port, user, password):
        self._dir = os.path.normpath(tempfile.mkdtemp())

        manifest_file = os.path.join(self._dir, "manifest.json")
        with open(manifest_file, mode="w") as f:
            f.write(self.manifest_json)

        background_js = self.background_js % (host, port, user, password)
        background_file = os.path.join(self._dir, "background.js")
        with open(background_file, mode="w") as f:
            f.write(background_js)

    @property
    def directory(self):
        return self._dir

    def __del__(self):
        shutil.rmtree(self._dir)


if __name__ == "__main__":
    proxy = ("64.32.16.8", 8080, "username", "password")  # your proxy with auth, this one is obviously fake
    proxy_extension = ProxyExtension(*proxy)

    options = webdriver.ChromeOptions()
    options.add_argument(f"--load-extension={proxy_extension.directory}")
    driver = webdriver.Chrome(options=options)

    driver.get("Just a moment...")
    driver.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31185.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

武职302303笔记-day02

这里写自定义目录标题 知识回归使用网页三剑客&#xff1a;HTML5CSS3&#xff08;lass,sass&#xff09;JavaScript(TypeScript&#xff09;-VueVite/reactwebpack开发环境 利用最前沿前端开发技术实现网站开发VueVitepnpm构建项目验证环境安装Vue脚手架Vite&#xff08;行业最…

NLP——Summarization

文章目录 Extractive summarisationSingle-documentcontent selectionTFIDF MethodLog Likelihood Ratio Method对数似然比Sentence Centrality Method 句子中心法 RST Parsing Multi-documentContent selectionMaximum Marginal Relevance 最大边际相关性Information Ordering…

STM32F4_触摸屏

目录 1. 触摸屏原理 2. 电阻式触摸屏检测原理 3. 电容式触摸屏检测原理 4. 硬件配置 4.1 XPT2046驱动芯片 4.2 硬件设计 5. 代码详解 5.1 main.c 5.2 AT24C02.c 5.3 AT24C02.h 5.4 C_Touch_I2C.c 5.5 C_Touch_I2C.h 5.6 Touch.c 5.7 Touch.h 5.8 FT5206.c 5.9 …

【Linux】timerfd——定时器

文章目录 前言认识 timerfdAPI timerfdAPI clock 官方示例简单使用epoll实现 前言 在 Linux 系统编程中&#xff0c;使用 timerfd 实现定时器功能是一种更加可靠、高效、灵活的方式。本文是对 timerfd 的简单使用&#xff0c;不涉及太过深入知识&#xff0c;熟练掌握几个常用 …

DOCker安装(一)

DOCker的安装 1、简介 Docker使用客户端-服务器(C/S)架构模式&#xff0c;使用远程API来管理和创建Docker容器。 Docker容器通过Docker镜像来创建。 容器之间互不干扰 容器与镜像的关系类似于面向对象编程中的对象与类。 对象->容器 镜像->类 通过镜像来创建容器 …

从Web2.0走向Web3.0还有多远?

Web2.0时代给互联网带来了巨大的变革&#xff0c;让用户成为内容的创造者和共享者。然而&#xff0c;随着技术的不断发展和创新&#xff0c;我们正在逐渐迈向Web3.0时代&#xff0c;这将是一个更加去中心化、透明和安全的数字世界。那么&#xff0c;从Web2.0走向Web3.0还有多远…

PHP基础知识解析:探索PHP编程的核心概念和技巧

目录 PHP简介 什么是PHP 网站基本概念 网站 静态网站特点 动态网站特点 服务器概念 IP 域名 DNS 端口 PHP基础知识 PHP语法 PHP注释 PHP语句分隔符 变量 变量基本概念 变量的使用 命名的命名规则&#xff1a; 预定义变量&#xff1a; 可变变量 变量传值 …

Pytest中断言的重要性

目录 前言 pytest断言 增加断言详细信息 异常断言 .type .value .traceback pytest常用断言 前言 在pytest中&#xff0c;断言是非常重要的一部分。断言可以帮助我们验证代码的正确性&#xff0c;检查函数返回的值是否符合要求&#xff0c;以及判断程序中预期行为是否发生。如…

Idea Mybatis插件:提高CRUD效率

mybatis-sql-viewer插件主要提供能力&#xff1a;将mybatis xml转成真实SQL语句、参数mock、SQL规范检查、SQL索引检查、SQL运行、SQL压测及Mybatis SQL语句扫描。 1. 简介 虽然写了很久的CRUD&#xff0c;但是依旧觉得写好CRUD是一件非常难且麻烦的事情&#xff0c;以下的情…

南京阿里云代理商:阿里云服务器的可扩展性和弹性如何?是否支持按需付费?

南京阿里云代理商&#xff1a;阿里云服务器的可扩展性和弹性如何&#xff1f;是否支持按需付费&#xff1f;   一、阿里云服务器的可扩展性   阿里云作为业界知名的云服务提供商&#xff0c;其服务器具有极强的可扩展性。可扩展性主要体现在以下几方面&#xff1a;   1. …

C++哈希表

目录 介绍哈希概念哈希冲突哈希函数解决哈希冲突 闭散列介绍线性探测二次探测负载因子 实现哈希表结构哈希函数元素查找插入元素删除元素 开散列介绍实现哈希表结构元素查找插入元素删除元素析构函数 介绍 哈希概念 了解过搜索二叉树与红黑树后&#xff0c;它们的结构特点主要…

测试用例excel转word(Office word篇)

场景 我们在项目中&#xff0c;默认情况下是用我们的Excel用例模版输出测试用例。但是有的项目中&#xff0c;会要求在Word版本的测试计划或者测试报告中&#xff0c;写明测试用例。而我们的测试用例&#xff0c;有的项目有上千条&#xff0c;这个时候如果从Excel往Word中复制…

Cortext-M3系统:异常(3)

1、异常 异常响应系统是再M3内核水平上的&#xff0c;支持众多的系统异常和外部中断。1-15为系统异常&#xff0c;大于16为外部中断。除了个别异常的优先级被定死外&#xff0c;其它异常的优先级都是可编程的。优先级数值越小&#xff0c;优先级越高。CM3支持中断嵌套&#xff…

MyBatis面试题

什么是 MyBatis&#xff1f; MyBatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生…

机器学习——识别足球和橄榄球

一、选题的背景 橄榄球起源于足球&#xff0c;二者即相似又有所区别。计算机技术发展至今&#xff0c;AI技术也有了极大的进步&#xff0c;通过机器学习不断的训练&#xff0c;AI对于足球和橄榄球的识别能力可以帮助人们对足球和橄榄球的分辨。机器学习是一种智能技术&#xff…

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;超文本传输协议。超文本&#xf…

GEE:将地形山体阴影和类别概率信息结合起来,绘制概率山体阴影(Probability Hillshade)图

作者:CSDN @ _养乐多_ 本文将介绍使用哨兵数据将地形山体阴影和类别概率信息结合起来,绘制概率山体阴影图的代码。 “Probability Hillshade”(概率山体阴影)是指使用Dynamic World数据集中最可能的类别概率信息创建的一种可视化效果。它结合了地形山体阴影和类别概率信息…

【pytorch】新的windows电脑从头搭建pytorch深度学习环境(完整版+附安装包)

文章目录 新的windows电脑搭建pytorch深度学习环境电脑环境的配置显卡驱动cudacudnn pytorch开发软件的安装minicondavscode pytorch环境的安装conda安装python环境安装pytorch和torchvision 附录1&#xff1a;部分torch、torchvision、torchaudio版本对应关系附录2&#xff1a…

iOS App 上架流程图文教学

在上架App 之前必须先准备好开发者帐号&#xff0c;但申请开发者帐号因法兰克早在之前已经申请好了&#xff0c;故就跳过此步骤&#xff0c;直接从产生凭证到上传App开始讲起。首先&#xff0c;要将自己辛苦写好的App 送审的话&#xff0c;则要依序做完下列几件事情即可。 在开…

常见面试题之框架篇

1.Spring框架中的单例bean是线程安全的吗&#xff1f; 不是线程安全的&#xff0c;是这样的。 当多用户同时请求一个服务时&#xff0c;容器会给每一个请求分配一个线程&#xff0c;这是多个线程会并发执行该请求对应的业务逻辑&#xff08;成员方法&#xff09;&#xff0c;…