undetected_chromedriver解决网页被检测

这篇具有很好参考价值的文章主要介绍了undetected_chromedriver解决网页被检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题分析

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

undetected_chromedriver解决网页被检测

二、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浏览器版本升级。文章来源地址https://www.toymoban.com/news/detail-490495.html

五、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()

到了这里,关于undetected_chromedriver解决网页被检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • chromedriver安装成功,运行报错,解决办法

    2.1、下载路径: ChromeDriver - WebDriver for Chrome - Downloads   2.2、选择下载对应的版本号的文件 浏览器版本号是108,这里选中107或者108版本的ChromeDriver都可以; 2.3、选择对应系统的文件;   2.4、下载完成后配置: 把文件移动到/usr/local/bin/目录里: 在终端执行:sudo mv Downloads/chr

    2024年02月13日
    浏览(28)
  • 解决python+selenuim运行时隐藏ChromeDriver窗口

    1、修改配置文件: ** 2.1:打开python目录 :D:pythonLibsite-packagesseleniumwebdrivercommon下的service.py文件。 2.2:导包:在改文件上面导入:from subprocess import CREATE_NO_WINDOW 2.3:修改字段。找到start函数。如果没 creationflags 这个字段就新增;如果有这个字段看该字段的值是不是我们导

    2024年02月11日
    浏览(29)
  • 关于chromedriver.exe一系列问题的解决办法

    最新 chromedriver.exe下载地址:https://googlechromelabs.github.io/chrome-for-testing/#stable 下载最新版本的 chromedriver.exe 将其解压在 python.exe 同目录下,以及Chrome 的路径下 例如: C:Program FilesGoogleChromeApplication 我用的是虚拟环境下的 python.exe,将 chromedriver.exe 放在此路径下即可 D:Anacond

    2024年02月11日
    浏览(32)
  • 解决selenium错误,升级chromedriver到121.0.6167.140

    selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version xxx Current browser version is 121.0.6167.140 with binary path chromedriver 121.0.6167.140下载地址 其他版本下载地址  120.0.6099.109-(r1217362)文件下载地址 webdriver 120.0.6099.71-(r1217362).zip下载

    2024年02月20日
    浏览(24)
  • 解决:selenium.common.exceptions.WebDriverException: Message: ‘chromedriver‘ execu

    运行爬虫代码出现上面的bug bug详细信息如下  解决方法 如下 1.先打开chrome 输入 “chrome://version/”来查看chrome版本 如图我的是96   2.然后访问此网站  http://chromedriver.storage.googleapis.com/index.html   然后选择合适版本的driver   我这边是windows版本的系统所以下载  win32版本的压缩

    2024年02月16日
    浏览(35)
  • 解决 Docker + selenium + chromedriver + chrome 会出现僵尸进程的问题

    在docker里,使用selenium爬虫,  webdriver quit 后,会产生很多僵尸进程。 docker run  - it  - v / home / blackip :/ home / blackips /    selenium : 1.0   python3 linux_black_ip . py top 查看僵尸进程: ps -ef | grep defunct 查看僵尸进程: 僵尸进程的父进程是python3。 看了下chrome运行时的状况,发现开始

    2023年04月24日
    浏览(28)
  • Python|(解决)苹果mac电脑无法打开“chromedriver”,因为无法验证开发者,要怎么解决?

    前言 我们工作上,很多朋友都是使用的Windows系统电脑,但还是有部分朋友使用的是苹果mac电脑,Windows系统电脑这里不细说,今天好好说下使用苹果mac电脑遇到关于使用selenium的问题。废话不多说,跟着小编直接进入正题。 解决 苹果mac电脑无法打开‘chromedriver’,因为无法验

    2024年02月04日
    浏览(41)
  • 找不到和chrome浏览器版本不同的chromedriver的解决方法

    某一天我很久没有chromedriver之后,发现我的google版本是下图这样 打开这个网站下载新版本的chromedriver,我发现没有103.0.5060.114。虽然我不知道为什么没有但是问题总是要解决啊! chromedriver下载地址:http://chromedriver.storage.googleapis.com/index.html 于是我下载了103.0.5060.134版本的chrom

    2024年02月11日
    浏览(38)
  • Mac系统搭建selenium环境报:无法打开“chromedriver”,因为无法验证开发者 解决办法

    1.安装selenium 打开terminal,使用以下命令安装selenium: pip install -U selenium 2.下载Chromedriver chromedriver 应与chrome版本匹配!!! 在Chrome中输入:chrome://version/ 查看Chrome的版本号信息 然后去地址: https://registry.npmmirror.com/binary.html?path=chromedriver/ 找到和自己Chrome浏览器版本匹配的Chrome dri

    2024年02月06日
    浏览(56)
  • 谷歌浏览器使用selenium的驱动chromedriver 116~118版本,解决版本不匹配问

    谷歌浏览器使用selenium的驱动chromedriver 116~118版本,解决版本不匹配问 获取不到 chromedriver 高版本吗? https://googlechromelabs.github.io/chrome-for-testing/#stable

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包