Я создаю скрипт, который сканирует один веб-сайт для сбора некоторых данных, но проблема в том, что они заблокировали меня после слишком большого количества запросов, но с помощью прокси-сервера я могу отправить больше запросов, чем сейчас. Я интегрировал прокси с опцией Chrome --proxy-server
options.add_argument('--proxy-server = {}'.format('http://ip:port'))
но я использую платный прокси-сервер, поэтому он требует аутентификации, и, как показано на снимке экрана ниже, он дает окно предупреждения для имени пользователя и пароля.
Затем я попытался использовать его с именем пользователя и паролем
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.
Аутентификация прокси-сервера 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.
Прошу прощения, но это не работает в автономном режиме, ошибка: selenium.common.exceptions.WebDriverException: Сообщение: неизвестная ошибка: не удалось дождаться загрузки фоновой страницы расширения: chrome-extension://emndjklbiakacbolpojiogpiccbjieik/_generated_background_page .html из-за неизвестной ошибки: страница не найдена: chrome-extension://emndjklbiakacbolpojiogpiccbjieik/_generated_background_page.html
Расширение не поддерживается в режиме Chrome Headless. stackoverflow.com/questions/45372066/…
Если вы используете Selenium на Mac или Linux, вы можете использовать Xvfb для запуска Chrome в фоновом режиме на виртуальном дисплее, продолжая использовать расширения. Блестящее решение кстати. Работал как шарм!
есть ли способ без создания файла .zip?
Вот быстрое, творческое решение, которое не требует изменения параметров селена или загрузки файла в 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 последняя рабочая версия с расширениями
После нескольких часов копания с той же проблемой, что и у вас, я наткнулся на этот сайт 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: расширение Chrome
Эй, я пробовал это, и по какой-то причине у меня не было ошибки, но мой IP-адрес совпадает с моим домашним IP-адресом, а не IP-адресом прокси-сервера, есть шанс, что вы, возможно, столкнулись с той же проблемой и могли бы помогите решить?
Используйте селеновая проволока.
Пример кода из документации:
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); единственное предостережение, так как он не работает автоматически в режиме инкогнито - но это общая проблема расширения, а не это решение.
Какой удивительный ответ.