Как установить прокси с аутентификацией в Селен Chromeriver Python? - PullRequest
0 голосов
/ 09 апреля 2019

Я создаю сценарий, который сканирует один веб-сайт для сбора некоторых данных, но проблема в том, что они заблокировали меня после слишком большого количества запросов, но с помощью прокси я могу отправить больше запросов, чем в настоящее время я делаю. Я включил прокси с хромированной опцией --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 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.

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Аутентификация Selenium Chrome Proxy

Настройка прокси для chromedriver с помощью Selenium с использованием Python

Если вам нужно использовать прокси с Python и библиотеку Selenium с chromedriver, вы обычно используете следующий код (без имени пользователя и пароля:

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

Работает нормально, если прокси не требует аутентификации. если прокси-сервер требует, чтобы вы вошли в систему с именем пользователя и паролем, он не будет работать. В этом случае вам придется использовать более хитрое решение, которое объясняется ниже. Кстати, если вы заносите в белый список IP-адрес своего сервера у провайдера прокси или сервера, он не должен запрашивать учетные данные прокси.

HTTP-аутентификация прокси с помощью Chromedriver в Selenium

Для настройки прокси-аутентификации мы сгенерируем специальный файл и динамически загрузим его в chromedriver, используя следующий код ниже. Этот код настраивает селен с помощью 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 возвращает настроенный веб-драйвер селена, который вы можете использовать в своем приложении. Этот код протестирован и работает просто отлично.

Подробнее о onAuthRequired событии в Chrome.

0 голосов
/ 10 июня 2019

Между прочим, в обновлениях решение, использующее расширение, не работает (по крайней мере, Windows), в то время как Mac и Linux работают.Я думаю, что это был chromedriver v2.44 последняя рабочая версия с расширениями

0 голосов
/ 29 мая 2019

Вот быстрое, креативное решение, которое не требует изменения параметров селена или загрузки файла в 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()

ПРИМЕЧАНИЕ. Для любого серьезного проекта или набора тестов я бы рекомендовал выбрать более надежное решение. Однако, если вы только экспериментируете и вам требуется быстрое и эффективное решение, это вариант.

...