【问题标题】:How to rotate various user agents using selenium python on each request如何在每个请求上使用 selenium python 轮换各种用户代理
【发布时间】:2018-11-05 19:45:40
【问题描述】:

我想向https://www.google.com/ 发出 10 个请求,但随机用户代理使用 selenium 和 python。我有一个循环,在该循环内我使用随机用户代理(使用假用户代理)发出 10 个请求。主要问题是对于每个请求,网络驱动程序都打开了一个新的谷歌浏览器实例,我想在一个实例中执行此操作,但使用不同的用户代理。我怎样才能做到这一点? 1 个谷歌浏览器实例和 10 个带有 10 个随机用户代理的请求。这是我的代码:

chrome_options = Options()
chrome_options.add_argument('no-sandbox')
chrome_options.add_argument("--start-maximized")
ua = UserAgent()
for i in range(0, 10):
    userAgent = ua.random
    chrome_options.add_argument('--user-agent="' + str(userAgent) + '"')
    driver1 = webdriver.Chrome(chrome_options=chrome_options, 
    executable_path="C:/Python34/chromedriver")
    driver1.get('https://www.google.com/')
    time.sleep(5)

【问题讨论】:

    标签: python selenium selenium-webdriver webdriver selenium-chromedriver


    【解决方案1】:

    首先更新1

    execute_cdp_cmd():现在有了execute_cdp_cmd(cmd, cmd_args) 命令,您可以使用Selenium 轻松执行 commands。使用此功能,您可以轻松修改 以防止 Selenium 被检测到。

    • 代码块:

      from selenium import webdriver
      
      driver = webdriver.Chrome(executable_path=r'C:\WebDrivers\chromedriver.exe')
      print(driver.execute_script("return navigator.userAgent;"))
      # Setting user agent as Chrome/83.0.4103.97
      driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'})
      print(driver.execute_script("return navigator.userAgent;"))
      # Setting user agent as Chrome/83.0.4103.53
      driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
      print(driver.execute_script("return navigator.userAgent;"))
      driver.get('https://www.httpbin.org/headers')
      
    • 控制台输出:

      Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36
      Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
      Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36
      
    • 浏览器快照:

    图例:1 - 仅适用于 Selenium 客户端。


    最初回答于 2018 年 11 月 6 日 8:00

    。当您使用 ChromeOptions 配置 ChromeDriver 的实例以启动新的 Chrome 浏览器会话 时,ChromeDriver 的配置在 ChromeDriver 的整个生命周期中保持不变并且保持不可编辑。因此,当 WebDriver 实例执行循环发出 10 个请求时,您无法更改 用户代理

    即使您能够提取 ChromeDriverChromeSession 属性,例如UserAgentSession IDCookies 和已经启动的Browsing Session 中的其他会话属性,您仍然不会能够更改 ChromeDriver 的那些属性。

    更简洁的方法是在 tearDown(){} 方法中调用 driver.quit()关闭销毁 ChromeDriver em> 和 Chrome 浏览器 实例,然后使用新的配置集跨越一组新的 ChromeDriverChrome 浏览器 实例。

    在这里你可以找到How can I reconnect to the browser opened by webdriver with selenium?的相关讨论


    参考

    您可以在以下位置找到一些相关的详细讨论:

    【讨论】:

    • 所以我认为我应该使用 python 请求库来完成这项任务,因为这样我可以更改每个请求的 IP 和用户代理,这就是我们可以使用不同的用户代理发出 10 个请求的方式。谢谢@DebanjanB
    【解决方案2】:

    是的。现在可以使用 cdp:

    driver.execute_cdp_cmd("Network.enable", {})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {"User-Agent": "browser1"}})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {"User-Agent": "browser2"}})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {"User-Agent": "browser3"}})
    
    driver.get('https://www.httpbin.org/headers')
    

    【讨论】:

      【解决方案3】:

      它打开了10个chrome实例因为你没有close()它,试试

      ...
      ...
      driver1.get('https://www.whatsmyua.info/')
      time.sleep(5)
      driver1.close()
      

      【讨论】:

      • 感谢您的回答。问题是我不想关闭驱动程序实例并使用相同的实例但使用不同的用户代理发出新请求。有可能吗?
      猜你喜欢
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2014-01-14
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多