【问题标题】:Changing User-Agent String for Every Get为每次获取更改用户代理字符串
【发布时间】:2018-12-18 23:27:55
【问题描述】:

我正在使用以下代码更改用户代理字符串,但我想知道这是否会更改每个 browser.get 请求的用户代理字符串?

ua_strings = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.1 Safari/605.1.15',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    ...
]

def parse(self, response):
    profile = webdriver.FirefoxProfile()
    profile.set_preference('general.useragent.override', random.choice(ua_string))
    options = Options()
    options.add_argument('-headless')
    browser = webdriver.Firefox(profile, firefox_options=options)
    browser.get(self.start_urls[0])

    hrefs = WebDriverWait(browser, 60).until(
        EC.visibility_of_all_elements_located((By.XPATH, '//div[@class="discoverableCard"]/a'))
    )

    pages = []

    for href in hrefs:
        pages.append(href.get_attribute('href'))

    for page in pages:
        browser.get(page)

        """ scrape page """

    browser.close()

或者我必须browser.close() 然后创建browser 的新实例以便为每个请求使用新的用户代理字符串?

    for page in pages:
        browser = webdriver.Firefox(profile, firefox_options=options)
        browser.get(page)

        """ scrape page """

        browser.close()

【问题讨论】:

    标签: python python-3.x selenium scrapy


    【解决方案1】:

    由于最初调用了random.choice(),用户代理字符串在所有browser.get() 请求中保持不变。为确保用户代理始终是随机的,您可以创建一个 set_preference() 函数,在每个循环中调用该函数。

    def set_prefrences(self):
        user_agent_string = random.choice(ua_string)
    
        #print out user-agent on each loop
        print(user_agent_string)
        profile = webdriver.FirefoxProfile()
        profile.set_preference('general.useragent.override', user_agent_string)
        options = Options()
        options.add_argument('-headless')
        browser = webdriver.Firefox(profile, firefox_options=options)
        return browser
    

    那么在你的循环中可以是这样的:

    for page in pages:
        browser = set_preferences()
        browser.get(page)
    
        """ scrape page """
    
        browser.close()
    

    希望这会有所帮助!

    【讨论】:

    • 好吧,我就是这么想的。你能提供任何证明这一点的文件或其他信息吗?如果您可以提供该信息,我会将其标记为答案。我只是小心谨慎,因为你的分数太低了。或者我怎样才能打印出每个请求的用户代理字符串,以便我自己验证?!抱歉,说到 Selenium,我是个超级 n00b。
    • @Anthony,我修改了代码以在每个循环中显示随机用户代理!
    • 啊啊啊啊啊啊啊啊啊啊啊啊上帝我真是个菜鸟。我只是要运行我的脚本,如果它成功了,我们就可以开始了!
    • 我读到,经常打开和关闭 webdriver 的实例不一定是最佳实践。还有其他(更好的)方法可以做到这一点吗?
    • 嗯...现在我想到了。这种打印方式不一定会验证标头中的 UA 字符串是否已更改。有没有办法打印每个get 请求发送的实际标头?!?!
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多