无法将私有Socks5代理与Selenium+Firefox(Python)一起使用

2024-05-15 23:41:44 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:我正在使用Python、selenium+Geckodriver。Firefox webbrowser automation和我在私有代理身份验证方面存在问题。我无法配置我的socks5代理用户名和密码。因此,Firefox出现了,但连接不起作用

我想做的简单任务是:

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

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

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

因此,当前代码是,用socks5代理数据替换主机/用户名/端口/密码:

    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')

不行,有什么想法吗


Tags: 密码代理portseleniumnetworkalertfirefox用户名
1条回答
网友
1楼 · 发布于 2024-05-15 23:41:44

要将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

相关问题 更多 >