如何在 selenium chromedriver python 中设置带身份验证的代理?

新手上路,请多包涵

我正在创建一个脚本来抓取一个网站以收集一些数据,但问题是他们在请求太多后阻止了我,但使用代理我可以发送比目前更多的请求。我已经将代理与 chrome 选项集成 --proxy-server

options.add_argument('--proxy-server={}'.format('http://ip:port'))

但我使用的是付费代理,因此它需要身份验证,如下图所示,它提供了用户名和密码的警告框

selenium 代理身份验证警告框 然后我尝试将它与用户名和密码一起使用

options.add_argument('--proxy-server={}'.format('http://username:password@ip:port'))

但它似乎也不起作用。我在寻找解决方案并找到了以下解决方案,我将它与 chrome 扩展 代理自动身份验证 一起使用,但没有 chrome 扩展

proxy = {'address': settings.PROXY,
             'username': settings.PROXY_USER,
             'password': settings.PROXY_PASSWORD}

capabilities = dict(DesiredCapabilities.CHROME)
capabilities['proxy'] = {'proxyType': 'MANUAL',
                             'httpProxy': proxy['address'],
                             'ftpProxy': proxy['address'],
                             'sslProxy': proxy['address'],
                             'noProxy': '',
                             'class': "org.openqa.selenium.Proxy",
                             'autodetect': False,
                             'socksUsername': proxy['username'],
                             'socksPassword': proxy['password']}
options.add_extension(os.path.join(settings.DIR, "extension_2_0.crx")) # proxy auth extension

但是以上都没有正常工作它似乎工作因为在上面的代码之后代理身份验证警报消失了并且当我通过谷歌搜索我的 IP 并确认它不工作时检查我的 IP。

请任何可以帮助我在 chromedriver 上验证代理服务器的人。

原文由 itsmnthn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

Selenium Chrome 代理身份验证

使用 Python 使用 Selenium 设置 chromedriver 代理

如果您需要使用带有 python 的代理和带有 chromedriver 的 Selenium 库,您通常使用以下代码(没有任何用户名和密码:

 chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s' % hostname + ":" + port)
driver = webdriver.Chrome(chrome_options=chrome_options)

除非代理需要身份验证,否则它工作正常。如果代理要求您使用用户名和密码登录,它将不起作用。在这种情况下,您必须使用下面解释的更棘手的解决方案。顺便说一下,如果您从代理提供商或服务器将您的服务器 IP 地址列入白名单,它不应该询问代理凭据。

在 Selenium 中使用 Chromedriver 进行 HTTP 代理身份验证

要设置代理身份验证,我们将生成一个特殊文件并使用下面的代码将其动态上传到 chromedriver。此代码使用 chromedriver 配置 selenium 以使用需要使用用户/密码对进行身份验证的 HTTP 代理。

 import os
import zipfile

from selenium import webdriver

PROXY_HOST = '192.168.3.2'  # rotating proxy or host
PROXY_PORT = 8080 # port
PROXY_USER = 'proxy-user' # username
PROXY_PASS = 'proxy-password' # password

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 = """
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']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)

def get_chromedriver(use_proxy=False, user_agent=None):
    path = os.path.dirname(os.path.abspath(__file__))
    chrome_options = webdriver.ChromeOptions()
    if use_proxy:
        pluginfile = 'proxy_auth_plugin.zip'

        with zipfile.ZipFile(pluginfile, 'w') as zp:
            zp.writestr("manifest.json", manifest_json)
            zp.writestr("background.js", background_js)
        chrome_options.add_extension(pluginfile)
    if user_agent:
        chrome_options.add_argument('--user-agent=%s' % user_agent)
    driver = webdriver.Chrome(
        os.path.join(path, 'chromedriver'),
        chrome_options=chrome_options)
    return driver

def main():
    driver = get_chromedriver(use_proxy=True)
    #driver.get('https://www.google.com/search?q=my+ip+address')
    driver.get('https://httpbin.org/ip')

if __name__ == '__main__':
    main()

函数 get_chromedriver 返回可在您的应用程序中使用的已配置 selenium webdriver。此代码已经过测试并且工作正常。

详细了解 Chrome 中的 onAuthRequired 事件。

原文由 itsmnthn 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 硒线

文档中的示例代码:

HTTP 代理

from seleniumwire import webdriver

options = {
    'proxy': {
        'http': 'http://user:pass@192.168.10.100:8888',
        'https': 'https://user:pass@192.168.10.100:8888',
        'no_proxy': 'localhost,127.0.0.1'
    }
}

driver = webdriver.Chrome(seleniumwire_options=options)

袜子代理

from seleniumwire import webdriver

options = {
   'proxy': {
        'http': 'socks5://user:pass@192.168.10.100:8888',
        'https': 'socks5://user:pass@192.168.10.100:8888',
        'no_proxy': 'localhost,127.0.0.1'
    }
}
driver = webdriver.Chrome(seleniumwire_options=options)

安装:

 pip install selenium-wire

原文由 Divakar Hebbar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进