我使用 UnDetected Chromedriver 来绕过 Cloudflare 检测。
我尝试强制它与代理一起使用,但不成功。 第一次尝试(IP 不变):
import undetected_chromedriver as uc
options = uc.ChromeOptions()
...
ip,port,username,password = proxy.split(':') #proxy in format ip:port:username:password
options.add_argument(f'--proxy-server=http://{username}:{password}@{ip}:{port}')
driver = uc.Chrome(executable_path=ChromeDriverManager().install(), options=options)
driver.get('https://2ip.ru/')
第二次尝试(使用硒线):
from seleniumwire import undetected_chromedriver as uc
...
ip,port,username,password = proxy.split(':') #proxy in format ip:port:username:password
wire_options = {
'proxy': {
'http': f'http://{username}:{password}@{ip}:{port}',
'https': f'http://{username}:{password}@{ip}:{port}',
'no_proxy': 'localhost,127.0.0.1' # excludes
}
}
driver = uc.Chrome(executable_path=ChromeDriverManager().install(), options=options,seleniumwire_options=wire_options)
driver.get('https://2ip.ru/')
浏览器尝试连接代理,但我需要手动输入密码和用户名。 如果您向我展示我的错误或提供问题的另一个决定,我将非常感谢。
经过一天的互联网搜索,我发现 Chrome 不支持基本的代理身份验证。感谢 [AbdeLhalimSB][1] 引导我找到[正确的解决方案][2]。但这个和其他类似的解决方案对我不起作用,因为我的浏览器拒绝从 zip 存档加载扩展。因此,我需要更改此代码,以便浏览器可以从文件夹加载扩展程序。
扩展.py:
import os
def proxies(username, password, endpoint, port,path):
try:
os.mkdir(path)
except FileExistsError:
pass
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Proxies",
"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']
);
""" % (endpoint, port, username, password)
with open(path+"\\manifest.json", 'w') as m_file:
m_file.write(manifest_json)
with open(path+"\\background.js", 'w') as b_file:
b_file.write(background_js)
main.py:
from webdriver_manager.chrome import ChromeDriverManager
import undetected_chromedriver as uc
import os
from extension import proxies
options = uc.ChromeOptions()
script_address = os.getcwd()
...
ip,port,username,password = proxy.split(':') #proxy in format ip:port:username:password
proxies(username, password, ip, int(port),script_address+'\\Proxies\\'+ip)
options.add_argument('--load-extension='+script_address+'\\Proxies\\'+ip)
driver = uc.Chrome(executable_path=ChromeDriverManager().install(), options=options)
请注意,此解决方案将在无头模式下工作,但不适用于隐身模式。 [1]:https://stackoverflow.com/users/20112601/abdelhalimsb [2]:如何将代理集成到我的 Selenium 网络抓取工具中以进行真实人物搜索?
SeleniumBase 有一个特殊的未检测到的 chromedriver 模式,可让您通过方法 arg (或在命令行上)设置代理设置。
pip install seleniumbase
,然后在 python
调用中填写代理设置后使用 SB()
运行:
from seleniumbase import SB
with SB(uc=True, pls="none", proxy="USER:PASS@HOST:PORT") as sb:
sb.open("https://nowsecure.nl/#relax")
sb.assert_text("OH YEAH, you passed!", "h1")
sb.post_message("Selenium wasn't detected!")
它将
uc
设置为 True(以启用未检测到的 chromedriver 模式),将 pls
设置为“无”(不同的 pageLoadStrategy 可能会冻结该模式下的代理测试),并设置 proxy
设置(在你填写你想要的)。