Как установить прокси-аутентификацию (пользователя и пароль) с помощью python selenium
Я использую веб-драйвер Firefox в Python 2.7 с Selenium. Моя программа на Python запускает браузер Firefox и посещает различные веб-сайты, когда я запускаю программу. Но мне нужно настроить прокси-сервер с аутентификацией, чтобы при посещении программой любого веб-сайта она проходила через прокси-сервер.
Есть несколько похожих очередей на SO. Но не существует конкретного решения для веб-драйвера Selenium Firefox Python.
6 ответов
Дубликат: Как установить имя пользователя: пароль для АУТЕНТИФИКАЦИИ прокси с помощью Python/Selenium
Селен-провод: https://github.com/wkeeling/selenium-wire
Установить селен-провод
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,dev_server:8080'
}
}
driver = webdriver.Firefox(seleniumwire_options=options)
Предупреждение.
Взгляните в папку кэша selenium-wire. У меня была проблема, потому что она занимала все мое дисковое пространство. Вы должны иногда удалять его в своем скрипте, когда хотите.
В дополнение к запуску Firefox с профилем, в котором сохранены учетные данные. Вы можете сделать это, загрузив расширение, которое пишет в loginTextbox
а также password1Textbox
из chrome://global/content/commonDialog.xul
(альтернативное окно).
Уже есть некоторые расширения, которые сделают эту работу. Например: Close Proxy Authentication
from selenium import webdriver
from base64 import b64encode
proxy = {'host': HOST, 'port': PORT, 'usr': USER, 'pwd': PASSWD}
fp = webdriver.FirefoxProfile()
fp.add_extension('closeproxy.xpi')
fp.set_preference('network.proxy.type', 1)
fp.set_preference('network.proxy.http', proxy['host'])
fp.set_preference('network.proxy.http_port', int(proxy['port']))
# ... ssl, socks, ftp ...
fp.set_preference('network.proxy.no_proxies_on', 'localhost, 127.0.0.1')
credentials = '{usr}:{pwd}'.format(**proxy)
credentials = b64encode(credentials.encode('ascii')).decode('utf-8')
fp.set_preference('extensions.closeproxyauth.authtoken', credentials)
driver = webdriver.Firefox(fp)
Вы можете написать собственное расширение firefox для прокси и запускать из селена. Вам нужно написать 2 файла и запаковать их.
фон.js
var proxy_host = "YOUR_PROXY_HOST";
var proxy_port = YOUR_PROXY_PORT;
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: proxy_host,
port: proxy_port
},
bypassList: []
}
};
function proxyRequest(request_data) {
return {
type: "http",
host: proxy_host,
port: proxy_port
};
}
browser.proxy.settings.set({value: config, scope: "regular"}, function() {;});
function callbackFn(details) {
return {
authCredentials: {
username: "YOUR_USERNAME",
password: "YOUR_PASSWORD"
}
};
}
browser.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
browser.proxy.onRequest.addListener(proxyRequest, {urls: ["<all_urls>"]});
manifest.json
{
"name": "My Firefox Proxy",
"version": "1.0.0b",
"manifest_version": 2,
"permissions": [
"browsingData",
"proxy",
"storage",
"tabs",
"webRequest",
"webRequestBlocking",
"downloads",
"notifications",
"<all_urls>"
],
"background": {
"scripts": ["background.js"]
},
"browser_specific_settings": {
"gecko": {
"id": "myproxy@example.org"
}
}
}
Затем вам нужно запаковать эти файлы в zip-архив в режиме DEFLATED с расширением .xpi в конце, например my_proxy_extension.xpi.
У вас есть два варианта:
- Подпишите ваше расширение Структура файла расширения .xpi для Firefox: описание, содержимое, создание и установка
ИЛИ ЖЕ
Запустить без подписи. Для этого шага:
Откройте флаги firefox в about:config и установите для параметров xpinstall.signatures.required значение false .
ИЛИ ЖЕ
Обновите профиль Firefox в:
Windows : C:\Program Files\Mozilla Firefox\defaults\pref\channel-prefs.js
Linux : /etc/firefox/syspref.js
Добавьте следующую строку в конец файла:
pref("xpinstall.signatures.required",false);
После этих шагов запустите селен и установите это расширение:
from selenium import webdriver
driver = webdriver.Firefox()
driver.install_addon("path/to/my_proxy_extension.xpi")
driver.get("https://yoursite.com")
Существует пример для Firefox + Python, но без аутентификации здесь. Затем вы можете найти другие доступные параметры здесь в исходном коде. Похоже, вам нужно следующее:
socksUsername
socksPassword
Например:
from selenium import webdriver
from selenium.webdriver.common.proxy import *
myProxy = "host:8080"
proxy = Proxy({
'proxyType': ProxyType.MANUAL,
'httpProxy': myProxy, # set this value as desired
'ftpProxy': myProxy, # set this value as desired
'sslProxy': myProxy, # set this value as desired
'noProxy': '' # set this value as desired
'socksUsername': = ''
'socksPassword': = ''
})
driver = webdriver.Firefox(proxy=proxy)
или с настройками:
driverPref = webdriver.FirefoxProfile()
driverPref.set_preference("network.proxy.type", 1)
.
.
.
driverPref.set_preference('network.proxy.socks', proxyHost)
driverPref.set_preference('network.proxy.socks_port', proxyPort)
driverPref.update_preferences()
driver = webdriver.Firefox(firefox_profile=driverPref)
РЕДАКТИРОВАТЬ:
Я посмотрел на это еще раз, и кажется, что невозможно установить детали проверки подлинности в FF, даже вручную. Единственный способ - просто запомнить уже введенные вами данные, которые выполняются двумя параметрами:
signon.autologin.proxy=true
network.websocket.enabled=false
который может быть настроен с set_preference()
метод. Вы также можете вручную просмотреть все параметры FF, перейдя к about:config
,
В дополнение к ответу с расширением.
Вы также можете использовать заполнение форм для динамического изменения учетных данных на вашем прокси. Просто загрузите страницу расширения, заполните форму автоматически и нажмите "Сохранить"!
Мы можем переключиться на окно предупреждения об аутентификации и ввести имя пользователя и пароль вручную.
profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference('network.proxy.ssl_port', int(ProxyPort))
profile.set_preference('network.proxy.ssl', ProxyHost)
profile.set_preference("network.proxy.http", ProxyHost)
profile.set_preference("network.proxy.http_port", int(ProxyPort))
webdriver = webdriver.Firefox(firefox_profile=profile, executable_path=GECKO_DRIVER_PATH)
webdriver.get("https://whatismyipaddress.com/")
try:
alert = webdriver.switch_to_alert()
print("switched to alert window")
alert.send_keys(proxy_username + Keys.TAB + proxy_password)
alert.accept()
webdriver.switch_to.default_content()
except Exception:
print("Error in alert switch")
pass