0

背景:我正在使用 Python、selenium + Geckodriver。Firefox 网络浏览器自动化,我在私有代理身份验证上遇到问题。我无法配置我的 socks5 代理用户名和密码。因此,Firefox 出现但连接不起作用。

我想做的简单任务是:

  1. 我想将 selenium(自动 Firefox)与代理(带密码的 SOCKS5 代理)一起使用
  2. 在网站上检查我的 IP 以查看代理是否正常工作

到目前为止,我注意到的是:

  • 我正在使用 Firefox V76.0.1 、 Geckodriver 和 Python3
  • 当您选择时通常应该弹出的用户/密码框不会弹出,这可能是 Firefox 版本的问题,可以通过覆盖:about:settings 中的一些设置来解决。一个解决方案可能是让这个弹出窗口工作并编写一些用户密码验证 - 请参阅下面的登录功能。老实说,它是不稳定的,我更喜欢找到一个可以在没有这个弹出窗口的情况下工作的解决方案。
  • 管理 socks5 代理的唯一稳定方法(无论弹出身份验证如何)是使用名为 FoxyProxy 的插件。
  • 我无法更改这个(Foxy Proxy AddOn),我可以在 python 中更改关于 Firefox 的所有设置,您可以使用 URL(about:config)在 Firefox 中访问这些设置
  • 简单的非密码保护代理不是问题,但带有用户名和密码的 SOCKS5 代理是一个问题
  • 另外:想知道是否可以覆盖 Foxy Proxy AddOn 并添加可在 Firefox 中访问的选项(关于:config)(老实说,我不是 Firefox 插件开发人员,所以也许有可能!?)

所以当前的代码是,用 socks5 代理数据替换 HOST/USERNAME/PORT/PASSWORD :

    from selenium import webdriver
    from base64 import b64encode
    from selenium import webdriver

    def login(browser):
        alert=browser.switch_to_alert()
        alert.send_keys("username"+webdriver.common.keys.Keys.TAB+"password")
        alert.accept()

    proxy = {'host': HOST, 'port': PORT, 'usr': USERNAME, 'pwd': PASSWORD}
    fp = webdriver.FirefoxProfile()
    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']))
    fp.set_preference('network.proxy.no_proxies_on', 'localhost, 127.0.0.1')
    fp.set_preference("network.proxy.socks_version", 5)
    credentials = '{usr}:{pwd}'.format(**proxy)
    fp.set_preference("network.proxy.type", 1)
    fp.set_preference("network.proxy.socks_version", 5)
    fp.set_preference("network.proxy.socks", HOST)
    fp.set_preference("network.proxy.socks_port", PORT)
    fp.set_preference("network.http.use-cache", False)
    driver = webdriver.Firefox(fp)
    # normally a proxy login popup should appear and we should call the login function here!!
    driver.get('https://wtfismyip.com')

不起作用,有什么想法吗?

4

1 回答 1

0

添加 foxyproxy 作为扩展:

driver = webdriver.Firefox(executable_path="path to geckodriver", options=options)
driver.install_addon("path to .xpi file of the extension", temporary=None)
driver.switch_to.window(driver.window_handles[1])`

所以它应该打开一个网页,您可以在其中设置代理。现在,要设置代理,首先我定义一个函数,让我插入所有代理的东西(主机、端口、用户名、密码)

def set_proxy(address, port, usernamex, passwordx):
    proxy_address_xpath = '//*[@id="proxyAddress"]'
    proxy_address_box = driver.find_element_by_xpath(proxy_address_xpath)
    proxy_address_box.send_keys(address)
    proxy_port_xpath = '//*[@id="proxyPort"]'
    proxy_port_box = driver.find_element_by_xpath(proxy_port_xpath)
    proxy_port_box.send_keys(port)
    proxy_username_xpath = '//*[@id="proxyUsername"]'
    proxy_username_box = driver.find_element_by_xpath(proxy_username_xpath)
    proxy_username_box.send_keys(usernamex)
    proxy_pass_xpath = '//*[@id="proxyPassword"]'
    proxy_pass_box = driver.find_element_by_xpath(proxy_pass_xpath)
    proxy_pass_box.send_keys(passwordx)
    save_xpath = '/html/body/div[2]/div[2]/button[4]'
    save_box = driver.find_element_by_xpath(save_xpath)
    save_box.click()

然后,使用以下代码,我设置代理并选择它,这样当我导航时它将使用代理

# go to the page where you can add the proxies
xpath_back ="/html/body/div[2]/div[2]/button"
back_box = driver.find_element_by_xpath(xpath_back)
back_box.click()
    
# add proxy
add_xpath = "/html/body/div[4]/div/nav/a[1]"
add_box = WebDriverWait(driver, timeout=10).until(lambda x: x.find_element_by_xpath(add_xpath))
add_box.click()
    
# select proxy type (in my case socks5)
type_xpath = '//*[@id="proxyType"]'
type_box = driver.find_element_by_xpath(type_xpath)
type_box.click()
    
socks5_xpath = '/html/body/div[2]/div[1]/div[2]/div[1]/select/option[3]'
socks5_box = driver.find_element_by_xpath(socks5_xpath)
socks5_box.click()
    
# write the proxy stuff
set_proxy('socks5', 'host', 'port', 'pass')
    
# select the proxy you just saved (in this case it selects the first one)
change_xpath = '//*[@id="mode"]'
change_box = WebDriverWait(driver, timeout=10).until(lambda x: x.find_element_by_xpath(change_xpath))
change_box.click()
    
select_xpath = '/html/body/div[4]/div/div/div[1]/select/option[2]'
select_box = driver.find_element_by_xpath(select_xpath)
select_box.click()

然后,要导航,请务必在新窗口中执行此操作或使用切换到第一个窗口

driver.switch_to.window(driver.window_handles[0])

这样您就可以保留 foxyproxy 窗口,例如更改代理。

如果您想使用其他方式,请查看How to set proxy authentication (user & password) using Python + Selenium

于 2020-10-29T22:11:31.097 回答