我正在创建一个脚本,用于爬网一个网站以收集一些数据,但是问题是,在请求过多后,它们阻止了我,但是使用代理,我可以发送的请求要多于当前的请求。我将代理与chrome选项--proxy-server
options.add_argument('--proxy-server={}'.format('http://ip:port'))
但是我使用的是付费代理,因此需要身份验证,如下面的屏幕截图所示,它提供了用户名和密码的警报框
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上对代理服务器进行身份验证的人。
答案 0 :(得分:3)
文档中的示例代码:
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/")
我认为这个解决方案也适用于无头模式。