我正在创建一个脚本,爬网一个网站,收集一些数据,但问题是,他们阻止了我后,太多的请求,但使用代理,我可以发送更多的请求比目前我做的.我已将proxy与chrome option --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 extension proxy auto auth一起使用,而不使用chrome extension

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

但上述两项都没有正常工作,这似乎是因为在上面的代码之后,代理身份验证alert 消失了,当我通过谷歌搜索what is my IP判断我的IP并确认它不工作时.

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

推荐答案

Selenium Chrome Proxy Authentication

Setting chromedriver proxy with Selenium using Python

如果您需要在python中使用代理,在chromedriver中使用Selenium库,则通常使用以下代码(无任何用户名和密码):

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

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

HTTP Proxy Authentication with Chromedriver in Selenium

为了设置代理身份验证,我们将生成一个特殊文件,并使用下面的代码将其动态上传到chromedriver.此代码将selenium与chromedriver配置为使用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个事件.

Python-3.x相关问答推荐

我在创建Pandas DataFrame时感到困惑

PythonPandas -通过知道位置(Loc)而不是索引来删除行

将strid()映射到Pandas DataFrame中的字符串不会更改NaN条目,但仍然声称它们不同?

为什么在Python中使用RANDINT函数时会出现此TypeError?

按长度和字母数字对Pandas 数据帧列进行排序

根据第一个字典的值序列对第二个字典进行排序

PANDAS中当前数据帧的匹配与更新

无法使用xpath关闭selenium中的弹出窗口

继承自 Counter 与 dict 的类实例的 Deepcopy

如何提高 snowpark 程序的性能?

通过在不重新索引的情况下采用最高概率的百分比,有效地转换 0/1 列表中的概率列表

为什么不能用格式字符串 '-' 绘制点?

缺失时推断的数据类可选字段

导入在不同目录中定义的函数

为什么 Multiprocessing 的 Lock 不会阻止其他进程使用对象?

Dask 多阶段资源设置导致 Failed to Serialize 错误

如何将数据框中的每一行转换为具有属性的 node ?

ImportError:没有名为资源的模块

当默认 pip 为 pip2 时,升级 pip3 的正确格式是什么?

字典理解中的操作顺序