Python Selenium 未检测到的 Chromedriver 无法与身份验证代理一起使用

问题描述 投票:0回答:2

我使用 UnDetected Chromedriver 来绕过 Cloudflare 检测。

我尝试强制它与代理一起使用,但不成功。 第一次尝试(IP 不变):

import undetected_chromedriver as uc
options = uc.ChromeOptions()
...
ip,port,username,password = proxy.split(':')   #proxy in format ip:port:username:password
options.add_argument(f'--proxy-server=http://{username}:{password}@{ip}:{port}')
driver = uc.Chrome(executable_path=ChromeDriverManager().install(), options=options)
driver.get('https://2ip.ru/')

第二次尝试(使用硒线):

from seleniumwire import undetected_chromedriver as uc
...
ip,port,username,password = proxy.split(':')   #proxy in format ip:port:username:password
wire_options = {
        'proxy': {
            'http': f'http://{username}:{password}@{ip}:{port}', 
            'https': f'http://{username}:{password}@{ip}:{port}',
            'no_proxy': 'localhost,127.0.0.1' # excludes
        }  
    }
driver = uc.Chrome(executable_path=ChromeDriverManager().install(), options=options,seleniumwire_options=wire_options)
driver.get('https://2ip.ru/')

浏览器尝试连接代理,但我需要手动输入密码和用户名。 如果您向我展示我的错误或提供问题的另一个决定,我将非常感谢。

python google-chrome selenium-webdriver proxy undetected-chromedriver
2个回答
2
投票

经过一天的互联网搜索,我发现 Chrome 不支持基本的代理身份验证。感谢 [AbdeLhalimSB][1] 引导我找到[正确的解决方案][2]。但这个和其他类似的解决方案对我不起作用,因为我的浏览器拒绝从 zip 存档加载扩展。因此,我需要更改此代码,以便浏览器可以从文件夹加载扩展程序。

扩展.py:

import os
def proxies(username, password, endpoint, port,path):
    try:
        os.mkdir(path)
    except FileExistsError:
        pass
    manifest_json = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "Proxies",
        "permissions": [
            "proxy",
            "tabs",
            "unlimitedStorage",
            "storage",
            "<all_urls>",
            "webRequest",
            "webRequestBlocking"
        ],
        "background": {
            "scripts": ["background.js"]
        },
        "minimum_chrome_version":"22.0.0"
    }
    """

    background_js = """
    var config = {
            mode: "fixed_servers",
            rules: {
            singleProxy: {
                scheme: "http",
                host: "%s",
                port: parseInt(%s)
            },
            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']
    );
    """ % (endpoint, port, username, password)

    with open(path+"\\manifest.json", 'w') as m_file:
        m_file.write(manifest_json)
    with open(path+"\\background.js", 'w') as b_file:
        b_file.write(background_js)

main.py:

from webdriver_manager.chrome import ChromeDriverManager
import undetected_chromedriver as uc
import os
from extension import proxies
options = uc.ChromeOptions()
script_address = os.getcwd()
...
ip,port,username,password = proxy.split(':')   #proxy in format ip:port:username:password
proxies(username, password, ip, int(port),script_address+'\\Proxies\\'+ip)
options.add_argument('--load-extension='+script_address+'\\Proxies\\'+ip)
driver = uc.Chrome(executable_path=ChromeDriverManager().install(), options=options)

请注意,此解决方案将在无头模式下工作,但不适用于隐身模式。 [1]:https://stackoverflow.com/users/20112601/abdelhalimsb [2]:如何将代理集成到我的 Selenium 网络抓取工具中以进行真实人物搜索?


0
投票

SeleniumBase 有一个特殊的未检测到的 chromedriver 模式,可让您通过方法 arg (或在命令行上)设置代理设置。

pip install seleniumbase
,然后在
python
调用中填写代理设置后使用
SB()
运行:

from seleniumbase import SB

with SB(uc=True, pls="none", proxy="USER:PASS@HOST:PORT") as sb:
    sb.open("https://nowsecure.nl/#relax")
    sb.assert_text("OH YEAH, you passed!", "h1")
    sb.post_message("Selenium wasn't detected!")

它将

uc
设置为 True(以启用未检测到的 chromedriver 模式),将
pls
设置为“无”(不同的 pageLoadStrategy 可能会冻结该模式下的代理测试),并设置
proxy
设置(在你填写你想要的)。

© www.soinside.com 2019 - 2024. All rights reserved.