Как установить прокси с аутентификацией в selenium chromedriver python?

Я создаю скрипт, который сканирует один веб-сайт для сбора некоторых данных, но проблема в том, что они заблокировали меня после слишком большого количества запросов, но с помощью прокси-сервера я могу отправить больше запросов, чем сейчас. Я интегрировал прокси с опцией Chrome --proxy-server

options.add_argument('--proxy-server = {}'.format('http://ip:port'))

но я использую платный прокси-сервер, поэтому он требует аутентификации, и, как показано на снимке экрана ниже, он дает окно предупреждения для имени пользователя и пароля.

Как установить прокси с аутентификацией в selenium chromedriver python? Затем я попытался использовать его с именем пользователя и паролем

options.add_argument('--proxy-server = {}'.format('http://username:password@ip:port'))

Но это тоже не работает. Я искал решение и нашел решение ниже, и я использовал его с расширением Chrome прокси авто авторизация и без расширения 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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
24
0
54 915
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Аутентификация прокси-сервера Selenium Chrome

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

Узнайте больше о событии onAuthRequired в Chrome.

Какой удивительный ответ.

Ian Spitz 24.05.2019 03:17

Прошу прощения, но это не работает в автономном режиме, ошибка: selenium.common.exceptions.WebDriverException: Сообщение: неизвестная ошибка: не удалось дождаться загрузки фоновой страницы расширения: chrome-extension://emndjklbiakacbolpojiogpiccbjieik/_generat‌​ed_background_page .h‌​tml из-за неизвестной ошибки: страница не найдена: chrome-extension://emndjklbiakacbolpojiogpiccbjieik/_generat‌​ed_background_page.h‌​tml

kshnkvn 11.07.2019 01:31

Расширение не поддерживается в режиме Chrome Headless. stackoverflow.com/questions/45372066/…

Chlind 19.09.2019 10:15

Если вы используете Selenium на Mac или Linux, вы можете использовать Xvfb для запуска Chrome в фоновом режиме на виртуальном дисплее, продолжая использовать расширения. Блестящее решение кстати. Работал как шарм!

Kyle 02.11.2020 23:32

есть ли способ без создания файла .zip?

Andrés Quiroz Valdovinos 07.02.2022 05:28

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

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

Попутно в обновлениях решение с использованием расширения не работает (по крайней мере, windows), а mac и linux работают. Я думаю это был chromedriver v2.44 последняя рабочая версия с расширениями

Обновить Новая версия ChromeDriver 77.0.3865.40 делать снова работает с дополнительным прокси.
Virmagnus 22.10.2019 20:44

После нескольких часов копания с той же проблемой, что и у вас, я наткнулся на этот сайт 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()

Что такое proxy_auth_plugin.zip в данном случае?

Matija Žiberna 13.05.2020 13:45

@MatijaŽiberna: расширение Chrome

Trương Quốc Khánh 05.12.2020 08:02

Эй, я пробовал это, и по какой-то причине у меня не было ошибки, но мой IP-адрес совпадает с моим домашним IP-адресом, а не IP-адресом прокси-сервера, есть шанс, что вы, возможно, столкнулись с той же проблемой и могли бы помогите решить?

Oliver Hnat 09.02.2022 12:36

Используйте селеновая проволока.

Пример кода из документации:

options = {
   'proxy': {
        'http': 'socks5://user:[email protected]:8888',
        'https': 'socks5://user:[email protected]:8888',
        'no_proxy': 'localhost,127.0.0.1'
    }
}
driver = webdriver.Chrome(seleniumwire_options=options)

У меня была та же проблема - и нельзя ли совместить функцию селена-провода с функцией без головы из параметров - например, для меня этот код работал - что-то не так с этим?

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/")

Я думаю, что это решение также работает в безголовом режиме.

Я искал тот же ответ, но только для кода Java, поэтому вот мой вариант кода @itsmnthn Python.

Не забудьте измените строковые поля класса MainTest на ваш ip, порт, логин, пароль и путь chromeDriver.

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class MainTest {
    private static final String PROXY_HOST = "127.0.0.1";
    private static final String PROXY_PORT = "8080";
    private static final String PROXY_USER = "login";
    private static final String PROXY_PASS = "password";
    private static final String CHROMEDRIVER_PATH = "chromeDriverPath";
    private static final String PROXY_OPTION_TEMPLATE = "--proxy-server=http://%s";

    public static void main(String[] args) throws IOException {
        System.setProperty("webdriver.chrome.driver", CHROMEDRIVER_PATH);
        ChromeOptions options = new ChromeOptions();
        String manifest_json = "{\n" +
                "  \"version\": \"1.0.0\",\n" +
                "  \"manifest_version\": 2,\n" +
                "  \"name\": \"Chrome Proxy\",\n" +
                "  \"permissions\": [\n" +
                "    \"proxy\",\n" +
                "    \"tabs\",\n" +
                "    \"unlimitedStorage\",\n" +
                "    \"storage\",\n" +
                "    \"<all_urls>\",\n" +
                "    \"webRequest\",\n" +
                "    \"webRequestBlocking\"\n" +
                "  ],\n" +
                "  \"background\": {\n" +
                "    \"scripts\": [\"background.js\"]\n" +
                "  },\n" +
                "  \"minimum_chrome_version\":\"22.0.0\"\n" +
                "}";

        String background_js = String.format("var config = {\n" +
                "  mode: \"fixed_servers\",\n" +
                "  rules: {\n" +
                "    singleProxy: {\n" +
                "      scheme: \"http\",\n" +
                "      host: \"%s\",\n" +
                "      port: parseInt(%s)\n" +
                "    },\n" +
                "    bypassList: [\"localhost\"]\n" +
                "  }\n" +
                "};\n" +
                "\n" +
                "chrome.proxy.settings.set({value: config, scope: \"regular\"}, function() {});\n" +
                "\n" +
                "function callbackFn(details) {\n" +
                "return {\n" +
                "authCredentials: {\n" +
                "username: \"%s\",\n" +
                "password: \"%s\"\n" +
                "}\n" +
                "};\n" +
                "}\n" +
                "\n" +
                "chrome.webRequest.onAuthRequired.addListener(\n" +
                "callbackFn,\n" +
                "{urls: [\"<all_urls>\"]},\n" +
                "['blocking']\n" +
                ");", PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS);

        FileOutputStream fos = new FileOutputStream("proxy_auth_plugin.zip");
        ZipOutputStream zipOS = new ZipOutputStream(fos);

        createFile("manifest.json", manifest_json);
        createFile("background.js", background_js);

        File file = new File("proxy_auth_plugin.zip");
        writeToZipFile("manifest.json", zipOS);
        writeToZipFile("background.js", zipOS);
        zipOS.close();
        fos.close();
        options.addExtensions(file);

        WebDriver driver = new ChromeDriver(options);
        try {
            driver.get("https://2ip.ru");
        } finally {
            driver.close();
        }

    }

    public static void writeToZipFile(String path, ZipOutputStream zipStream) throws FileNotFoundException, IOException {
        System.out.println("Writing file : '" + path + "' to zip file");
        File aFile = new File(path);
        FileInputStream fis = new FileInputStream(aFile);
        ZipEntry zipEntry = new ZipEntry(path);
        zipStream.putNextEntry(zipEntry);
        byte[] bytes = new byte[1024];
        int length;
        while ((length = fis.read(bytes)) >= 0) {
            zipStream.write(bytes, 0, length);
        }
        zipStream.closeEntry();
        fis.close();
    }

    public static void createFile(String filename, String text) throws FileNotFoundException {
        try (PrintWriter out = new PrintWriter(filename)) {
            out.println(text);
        }
    }


}

Все еще работает с последним Chrome (95); единственное предостережение, так как он не работает автоматически в режиме инкогнито - но это общая проблема расширения, а не это решение.

Anatoly Yakimchuk 09.11.2021 14:39

Другие вопросы по теме