0


selenium + chrome 设置需要用户认证的代理

selenium + chrome 设置代理

设置不需要认证的代理

option = webdriver.ChromeOptions()
option.add_argument(f"--proxy-server=http://{proxy['ip']}:{proxy['port']}")
option.add_argument('headless')# 设置无头模式# # 在Chrome类中,executable_path参数已被弃用,所以使用 Service指定执行路径
s = Service(executable_path='chromedriver.exe')## # 打开chrome浏览器

driver = webdriver.Chrome(service=s, options=option)
driver.get("http://httpbin.org/ip")print(driver.page_source)

设置需要认证的代理

首先,复制下面代码,这是大佬写的加载谷歌插件的代码,不需要修改

defcreate_proxyauth_extension(proxy_host, proxy_port,
                               proxy_username, proxy_password,
                               scheme='http', plugin_path=None):"""Proxy Auth Extension

    args:
        proxy_host (str): domain or ip address, ie proxy.domain.com
        proxy_port (int): port
        proxy_username (str): auth username
        proxy_password (str): auth password
    kwargs:
        scheme (str): proxy scheme, default http
        plugin_path (str): absolute path of the extension

    return str -> plugin_path
    """import string
    import zipfile

    if plugin_path isNone:
        plugin_path =r'C:\Users\11058\Desktop\chromedriver_win32\vimm_chrome_proxyauth_plugin.zip'

    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":"22.0.0"
    }
    """

    background_js = string.Template("""
    var config = {
            mode: "fixed_servers",
            rules: {
              singleProxy: {
                scheme: "${scheme}",
                host: "${host}",
                port: parseInt(${port})
              },
              bypassList: ["foobar.com"]
            }
          };

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

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

    chrome.webRequest.onAuthRequired.addListener(
                callbackFn,
                {urls: ["<all_urls>"]},
                ['blocking']
    );
    """).substitute(
        host=proxy_host,
        port=proxy_port,
        username=proxy_username,
        password=proxy_password,
        scheme=scheme,)with zipfile.ZipFile(plugin_path,'w')as zp:
        zp.writestr("manifest.json", manifest_json)
        zp.writestr("background.js", background_js)return plugin_path

在使用的时候,只需要调用这个方法,然后加载到谷歌里即可,如下

proxyauth_plugin_path = create_proxyauth_extension(
            proxy_host=proxy['ip'],
            proxy_port=proxy['port'],
            proxy_username="",
            proxy_password="")

option = webdriver.ChromeOptions()# option.add_argument('--headless')

option.add_argument("--start-maximized")

option.add_extension(proxyauth_plugin_path)## # 在Chrome类中,executable_path参数已被弃用,所以使用 Service指定执行路径
s = Service(executable_path='chromedriver.exe')## # 打开chrome浏览器

driver = webdriver.Chrome(service=s, options=option)

driver.get("http://httpbin.org/ip")

这里说一下,谷歌的无头模式(headless)不支持extension,所以,使用了认证的代理,就无法使用无头模式,暂时无法解决。网上找到有利用虚拟桌面解决的。我是用回头selenium版本,用PhantomJS解决的,至于以后selenium和谷歌是否会修复这个问题,待定。

另外推荐一个宝藏库:undetected_chromedriver.

经常用selenium的小伙伴肯定知道,selenium在反爬严重的网站相当于裸奔,最经典的就是window.navigator.webdriver ,网站可以获取这个的返回值来判断你是不是爬虫,
普通红浏览器
而selenium如果你在控制台输入window.navigator.webdriver ,返回的是true,
如果上网找,找到的大多是 js注入,比如这种

网站只需要添加一个javascript验证即可,此时也是使用大佬的办法,伪装

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source":"""
                        Object.defineProperty(navigator, 'webdriver', {
                          get: () => undefined
                        })
                      """})

Page.addScriptToEvaluateOnNewDocument 这是新版谷歌浏览器的内测功能,即在打开浏览器,访问任何网站之前执行js代码 ,source的value部分,则是对应的javascript代码,可以看到,把window.navigator.webdriver 输出成了undefined,此时,则可以避开网站监测。

但要么很繁琐,要么打开一个标签就得执行以下js。今天推荐一个免去这么烦恼的库,undetected_chromedriver ,这个库也是基于selenium的,所以使用上和普通的selenium几乎没有不同,模块里封装了该有的js,也就是说,网站常用的比如window.navigator.webdriver 检测,根本检测不出来,上述代码,根本不需要你来操心,模块里全部替你解决,demo如下

import undetected_chromedriver as uc
option = uc.ChromeOptions()
driver = uc.Chrome(executable_path=executable_path, options=option)
driver.get(url)
driver.quit()

看吧,和selenium一模一样,还解决了辣么多烦恼。人生苦短,我用uc

补充:uc有一个问题,无法设置需要验证的代理,目前还没找到解决办法

标签: chrome selenium 前端

本文转载自: https://blog.csdn.net/weixin_45621200/article/details/128838839
版权归原作者 不吃天鹅肉 所有, 如有侵权,请联系我们删除。

“selenium + chrome 设置需要用户认证的代理”的评论:

还没有评论