我正在寻找可以帮助我的答案......我有一个项目,我需要使用用户名和密码连接到代理。我正在关注stackoverflow的以下答案
通过 Selenium chromedriver 进行 Python 代理身份验证
但是当我运行我的代码时,selenium 没有告诉我任何信息,也没有设置用户名和密码。这是add_extension
方法。
我也尝试过这种install_extension
方法,但我不能用这种方法运气......这是我的代码..我希望有人能帮助我。
任务调度程序.py
from webdriver.driver import RunSelenium
class TaskScheduler:
driver = driver_setup()
TaskScheduler()
驱动程序.py
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from .proxy import inject_proxy_extension
from selenium.webdriver.firefox.options import Options
from selenium.webdriver import DesiredCapabilities
from time import sleep
class RunSelenium:
@staticmethod
def get_firefox_profile(proxy_host=None, proxy_port=None, fp=None):
# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5
if proxy_host is not None:
fp.set_preference("network.proxy.type", 1)
fp.set_preference("network.proxy.http", proxy_host)
fp.set_preference("network.proxy.http_port", proxy_port)
fp.set_preference("network.proxy.ssl", proxy_host)
fp.set_preference("network.proxy.ssl_port", proxy_port)
fp.set_preference("network.proxy.no_proxies_on",
"localhost,127.0.0.1,*.mozilla.com")
fp.set_preference("browser.link.open_newwindow", 1)
fp.set_preference("browser.link.open_newwindow.restriction", 2)
fp.set_preference('media.mediasource.enabled', True)
fp.set_preference("network.http.pipelining", True)
fp.set_preference("network.http.proxy.pipelining", True)
fp.set_preference("network.http.pipelining.maxrequests", 2)
fp.set_preference("network.http.pipelining.ssl", False)
# Disable mixed content blocks
fp.set_preference('security.mixed_content.block_active_content', False)
fp.set_preference('security.mixed_content.block_display_content', False)
fp.set_preference("security.OCSP.enabled", False)
fp.set_preference("browser.cache.disk.capacity", 0)
fp.set_preference("browser.sessionstore.interval", 900000)
fp.set_preference("browser.cache.disk.enable", False)
fp.set_preference("content.interrupt.parsing", False)
fp.set_preference("dom.webnotifications.enabled", False)
fp.set_preference("dom.webnotifications.serviceworker.enabled", False)
fp.set_preference("dom.pushconnection.enabled", False)
fp.set_preference("dom.push.enabled", False)
fp.set_preference("services.sync.prefs.sync.dom.webnotifications.enabled", False)
fp.set_preference("services.sync.prefs.sync.dom.webnotifications.serviceworker.enabled", False)
fp.set_preference("services.sync.prefs.sync.dom.pushconnection.enabled", False)
fp.set_preference("services.sync.prefs.sync.dom.push.enabled", False)
fp.set_preference("browser.privatebrowsing.autostart", True)
fp.set_preference('intl.accept_languages', 'en-US, en')
fp.set_preference("marionette", False)
fp.set_preference("xpinstall.signatures.required",False);
return fp
@staticmethod
def driver_setup(proxy=None):
headless = False
try:
firefox_profile = webdriver.FirefoxProfile()
capabilities = DesiredCapabilities.FIREFOX
capabilities['overlappingCheckDisabled'] = True
capabilities['unexpectedAlertBehaviour'] = 'accept'
if proxy is not None:
firefox_profile = RunSelenium.get_firefox_profile(proxy_host=proxy['hostname'],
proxy_port=proxy['port'], fp=firefox_profile)
else:
firefox_profile = RunSelenium.get_firefox_profile(fp=firefox_profile)
opts = Options()
if proxy is not None:
print('go to inject proxy')
firefox_profile = inject_proxy_extension(firefox_profile, proxy['username'], proxy['password'])
opts.headless = headless
#opts.profile = firefox_profile
capabilities.update(opts.to_capabilities())
#firefox_profile.update_preferences()
print("starting Chrome")
print(capabilities)
sleep (5)
# driver = webdriver.Remote(command_executor='http://localhost:4444', desired_capabilities=capabilities)
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=capabilities, browser_profile=firefox_profile)
print("set firefox")
#driver.wait = WebDriverWait(driver, 100)
return driver
except Exception as e:
print(e)
raise e
代理.py
from selenium.webdriver import DesiredCapabilities, FirefoxProfile
from selenium.webdriver.firefox.options import Options
from selenium import webdriver
import shutil
import fileinput
import os
from selenium import webdriver
def inject_proxy_extension(firefox_profile, proxy_user, proxy_password):}
ROOT_DIR = os.path.abspath(os.curdir)
script_path = os.path.join(ROOT_DIR, "webdriver", "external", "firefox_proxy_addon", "background.js")
script_backup_path = os.path.join(ROOT_DIR, "webdriver", "external", "background.js.bak")
extension_path = os.path.join(ROOT_DIR, "webdriver", "external", "firefox_proxy_addon", "proxyauth")
shutil.copy(script_path, script_backup_path)
try:
os.remove(extension_path + ".zip.xpi")
except OSError:
pass
for line in fileinput.input(script_path, inplace=True):
print(line.replace("PROXY_AUTH_USERNAME", proxy_user)),
for line in fileinput.input(script_path, inplace=True):
print(line.replace("PROXY_AUTH_PASS", proxy_password.replace('"', '\\"'))),
extension_source_path = os.path.join(ROOT_DIR, "webdriver", "external", "firefox_proxy_addon")
shutil.make_archive(extension_path, 'zip', extension_source_path)
shutil.move(extension_path + ".zip", extension_path + ".zip.xpi")
shutil.copy(script_backup_path, script_path)
os.remove(script_backup_path)
file_extension = os.path.join(os.getcwd(), extension_path + ".zip.xpi")
firefox_profile._install_extension(os.path.join(extension_path + ".zip.xpi"), unpack=True)
firefox_profile.set_preference("extensions.logging.enabled", True)
return firefox_profile
清单.json
{
"description": "HTTP Basic Poxy Auth",
"manifest_version": 2,
"name": "HTTP Basic Poxy Auth",
"version": "1.0",
"permissions": [
"webRequest", "webRequestBlocking", "activeTab", "<all_urls>"
],
"background": {
"scripts": ["background.js"]
}
}
背景.js
{
"description": "HTTP Basic Poxy Auth",
"manifest_version": 2,
"name": "HTTP Basic Poxy Auth",
"version": "1.0",
"permissions": [
"webRequest", "webRequestBlocking", "activeTab", "<all_urls>"
],
"background": {
"scripts": ["background.js"]
}
}