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

时间:2019-04-08 21:38:48

标签: python-3.x selenium proxy selenium-chromedriver

我正在创建一个脚本,用于爬网一个网站以收集一些数据,但是问题是,在请求过多后,它们阻止了我,但是使用代理,我可以发送的请求要多于当前的请求。我将代理与chrome选项--proxy-server

集成在一起

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

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

selenium proxy authentication alert box 然后我尝试将其与用户名和密码一起使用

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

但是它似乎也不起作用。我一直在寻找解决方案,并且在解决方案下面找到了解决方案,并将其与chrome扩展名proxy auto auth一起使用,而没有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上对代理服务器进行身份验证的人。

6 个答案:

答案 0 :(得分:3)

使用selenium-wire

文档中的示例代码:

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)

答案 1 :(得分:2)

经过数小时的反复研究,发现您遇到了同样的问题,然后才发现该网站https://botproxy.net/docs/how-to/setting-chromedriver-proxy-auth-with-selenium-using-python/。我进行了测试,并为我完美地工作。

import os
import zipfile

from selenium import webdriver

PROXY_HOST = 'x.botproxy.net'  # rotating proxy
PROXY_PORT = 8080
PROXY_USER = 'proxy-user'
PROXY_PASS = 'proxy-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()

答案 2 :(得分:1)

Selenium Chrome代理身份验证

使用Python使用Selenium设置chromedriver代理

如果您需要将代理与python和Selenium库与chromedriver一起使用,通常可以使用以下代码(不带任何用户名和密码:

(0, 2)
(1, 1)
(2, 0)

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

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

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

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

函数get_chromedriver返回可以在应用程序中使用的已配置硒Web驱动程序。此代码已经过测试,可以正常工作。

答案 3 :(得分:0)

这是一种快速,创造性的解决方案,不需要修改硒的选项或将文件上传到chromedriver。它利用pyautogui(可以使用任何模拟按键的python软件包)输入代理身份验证详细信息。它还使用线程处理chrome身份验证弹出窗口,否则该窗口将暂停脚本。

import time
from threading import Thread
import pyautogui
from selenium.webdriver.chrome.options import Options
from selenium import webdriver

hostname = "HOST_NAME"
port = "PORT"
proxy_username = "USERNAME"
proxy_password = "PASSWORD"

chrome_options = Options()
chrome_options.add_argument('--proxy-server={}'.format(hostname + ":" + port))
driver = webdriver.Chrome(options=chrome_options)


def enter_proxy_auth(proxy_username, proxy_password):
    time.sleep(1)
    pyautogui.typewrite(proxy_username)
    pyautogui.press('tab')
    pyautogui.typewrite(proxy_password)
    pyautogui.press('enter')


def open_a_page(driver, url):
    driver.get(url)


Thread(target=open_a_page, args=(driver, "http://www.example.com/")).start()
Thread(target=enter_proxy_auth, args=(proxy_username, proxy_password)).start()

注意:对于任何严肃的项目或测试套件,我建议选择更强大的解决方案。但是,如果您只是尝试并且需要快速有效的解决方案,则可以选择这种方法。

答案 4 :(得分:0)

一路走来,在更新中,使用扩展名的解决方案不起作用(至少适用于Windows),而mac和linux则无效。 我认为这是chromedriver v2.44的最新扩展版本

答案 5 :(得分:0)

我遇到了同样的问题 - 是否可以将 selenium-wire 功能与选项中的无头功能结合起来 - 对我来说,例如这段代码正在运行 - 有什么问题吗?

from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
import os, sys, time
from dotenv import load_dotenv, find_dotenv

path = os.path.abspath (os.path.dirname (sys.argv[0]))
cd = '/chromedriver.exe'
load_dotenv(find_dotenv()) 
PROXY_CHEAP_USER = os.environ.get("PROXY_CHEAP_USER")
PROXY_CHEAP_PW= os.environ.get("PROXY_CHEAP_PW")
PROXY_HOST = 'proxyhost.com'  # rotating proxy or host
PROXY_PORT = port # port
PROXY_USER = PROXY_CHEAP_USER # username
PROXY_PASS = PROXY_CHEAP_PW # password

options = Options()
options.add_argument('--headless')
options.add_argument("--window-size=1920x1080")
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')

options_seleniumWire = {
    'proxy': {
        'https': f'https://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}',
    }
}
 
driver = webdriver.Chrome (path + cd, options=options, seleniumwire_options=options_seleniumWire)
driver.get("https://ifconfig.co/")

我认为这个解决方案也适用于无头模式。