Как использовать аутентифицированный прокси-сервер в селен-хромедривере?
После долгих поисков я начинаю думать, что это невозможно.
Мне нужно запустить Chrome через селен, используя разные аутентифицированные (не публичные) прокси для каждого запуска.
PROXY_IP = "<some IP address>"
UID = "<the user id>"
PWD = "<the password">
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=%s:%s@%s" % (UID,PWD,PROXY_IP))
driver = webdriver.Chrome(executable_path=".\\driver\\chromedriver.exe",
chrome_options=options)
driver.get("<site URL>")
Chrome запустится и отобразит ошибку:
This webpage is not available
ERR_NO_SUPPORTED_PROXIES
Если я использую публичный прокси-сервер, не требующий аутентификации, как это...
PROXY_IP = "<public proxy IP address>"
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=%s" % PROXY_IP)
driver = webdriver.Chrome(executable_path=".\\driver\\chromedriver.exe",
chrome_options=options)
driver.get("<site URL>")
... он работает нормально и отображает сайт при использовании прокси.
Я также попробовал вариант с http://
перед идентификатором пользователя:
options.add_argument("--proxy-server=http://%s:%s@%s" % (UID,PWD,PROXY_IP))
Тот факт, что я искал повсюду и не нашел решения, заставляет меня поверить, что ничего не может существовать.
Я нашел это, но не могу понять из этого:
прокси аутентификации селен-хромедривер
Не уверен что browswermob-proxy
есть или должен делать или как реализовать и протестировать в Python. Я ненавижу накапливать пластыри, если они не являются абсолютно необходимыми.
9 ответов
Для использования прокси с auth в python selenium вы можете использовать seleniumwire.
Во-первых, установите его с pip install selenium-wire
Затем импортируйте веб-драйвер из селена вместо селена
from seleniumwire import webdriver
options = {
'proxy': {
'http': 'http://username:password@host:port',
'https': 'https://username:password@host:port',
'no_proxy': 'localhost,127.0.0.1' # excludes
}
}
browser = webdriver.Chrome(path_to_driver, seleniumwire_options=options)
Теперь вы можете использовать свой экземпляр браузера точно так же, как селен: browser.get('https://api.ipify.org')
и так далее...
Я проверил большинство решений в Интернете, и ни одно из них не работает с аутентификацией через chrome/firefox. Проверьте эту ссылку: https://github.com/webdriverio/webdriverio/issues/324. Наконец, временным решением является внесение в белый список вашего IP-адреса с прокси-провайдером.
Я не мог найти решение для хрома. Мы не можем добавлять расширения с headless
вариант. Я использую Heroku с Chrome-buildpack. Есть следующие варианты
- использование
xvfb
вместо безголовых опций и установки расширения - Используйте локальный прокси-сервер пересылки, который перенаправляет трафик на проверенный прокси; мы можем использовать Squid, mitProxy или что-то вроде https://github.com/sjitech/proxy-login-automator
Вместо этого обходного пути я переключился на Firefox, где смог заполнить имя пользователя и пароль во всплывающем окне проверки подлинности прокси. Как указано ниже. Следующий код для Ruby с использованием Capybara. Вы должны быть в состоянии сделать что-то подобное на своей платформе
page.driver.browser.switch_to.alert.send_keys('proxy-username' + Selenium::WebDriver::Keys::KEYS[:tab] + 'my-password')
page.driver.browser.switch_to.alert.accept
Это лучшее решение, которое я нашел, и единственное, которое сработало - все остальные ответы на этот вопрос устарели. Он в основном генерирует расширение авторизации для Chrome на лету. Просто используйте функцию, определенную в скрипте следующим образом:
driver = proxy_chrome(host, port, username, password)
driver.get("http://www.icanhazip.com/")
driver.get("https://www.reddit.com/")
print('Terminated without issues.')
Обратите внимание, что это не работает с параметром --headless. Однако в Linux вы можете просто использовать виртуальный фрейм-буфер x для имитации этого. Это так же просто, как в Python:
import xvfbwrapper
x = xvfbwrapper.Xvfb()
x.start()
1º Если вы всегда используете один и тот же IP-адрес, вы можете поговорить с вашим прокси-провайдером, чтобы получить доступ к прокси-серверу с вашим IP-адресом = пользователь или пароль не требуются. По моему опыту это проще.
Если это невозможно, другое решение: pip install undetectable chromedriver и seleniumwire, если у вас их нет
селен-провод 4.5.6 селен 4.1.0 необнаруженный-хромированный драйвер 2.2.1
from seleniumwire.undetected_chromedriver.v2 import Chrome
options = {
'proxy': {
'http': 'http://user:pass@ip:port',
'https': 'https://user:pass@ip:port',
'no_proxy': 'localhost,127.0.0.1'
}
}
driver = Chrome(seleniumwire_options=options)
или вы также можете попробовать другое решение:
import undetected_chromedriver.v2 as uc
IP = XXXX
SOCKS5_PORT = XXXX
HTTPS_PORT = XXXX
options = uc.ChromeOptions()
options.add_argument(f'--proxy-server=socks5://{IP}:{SOCKS5_PORT}')
#you can substitue the last line for this one:
options.add_argument(f'--proxy-server=https://{IP}:{HTTPS_PORT}')
driver = uc.Chrome(executable_path=EXECUTABLE_PATH, options=options)
Попробовав множество решений, которые на самом деле не работали должным образом, мне наконец удалось установить прокси-сервер с проверкой подлинности, используя предложенное расширение из предыдущих ответов. что вам нужно сделать, это ввести эту ссылку:
http://crxextractor.com/ и вставьте этот URL: https://www.crx4chrome.com/crx/1446/
Это позволит вам загрузить расширение в виде файла.crx без его установки. чем я использовал этот код:
proxy = {'address': 'pr.oxylabs.io:7777',
'username': 'USERNAME',
'password': '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 = webdriver.ChromeOptions()
options.add_extension("./extension_2_0_0_0.crx")
driver = webdriver.Chrome(executable_path=CHROME_PATH, desired_capabilities=capabilities, chrome_options=options)
Я много искал. Это то, что у меня работает
PROXY_HOST = 'FILL IN' # rotating proxy or host
PROXY_PORT = 8080 # port
PROXY_USER = 'FILL IN' # username
PROXY_PASS = 'FILL IN' # password
http_proxies = { 'https' : 'http://' + PROXY_USER + ':' + PROXY_PASS + '@' + PROXY_HOST + ':' + str(PROXY_PORT) }
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(self, use_proxy=False):
driver_path = 'FILL IN'
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", libshared.manifest_json)
zp.writestr("background.js", libshared.background_js)
chrome_options.add_extension(pluginfile)
driver = webdriver.Chrome(
executable_path=driver_path,
chrome_options=chrome_options)
return driver
Я старался много времени делать то же самое.
Chrome использует только прокси ОС, где он установлен. Вы можете проверить это, зайдя в настройки-> найти: прокси -> изменить настройки прокси
Поэтому без дополнительных дополнений и настройки этих дополнений вы не сможете этого сделать.
Или вы можете изменить настройки прокси-сервера вашей ОС - это намного проще.
Также вы можете использовать phantomjs - он имеет тот же движок (WebKit), что и chrome. используя что-то вроде этого:
String PROXY = proxyIP + ":" + proxyPort;
String proxyAuth= proxyUser + ":" + proxyPass;
OpenQA.Selenium.Proxy proxy = new OpenQA.Selenium.Proxy();
proxy.HttpProxy = PROXY;
proxy.FtpProxy = PROXY;
proxy.SslProxy = PROXY;
proxy.SocksProxy = PROXY;
var serviceJS = PhantomJSDriverService.CreateDefaultService(phantomPath);
serviceJS.AddArguments("--proxy=" + PROXY, "--proxy-type=http", "--proxy-auth=" + proxyAuth);
Это временное решение может работать в исходном состоянии: Код на Python: Сначала загрузите плагин из магазина плагинов Chrome: Proxy-Auto-Auth_v2.0.crx
options = webdriver.ChromeOptions()
options.add_extension("./Proxy-Auto-Auth_v2.0.crx")) #this will provide you a window to enter user name and proxy
driver = webdriver.Remote(command_executor=selenium_server,desired_capabilities=options.to_capabilities())
or
driver = webdriver.Chrome(chrome_options=options)