【问题标题】:Changing user agent on urllib2.urlopen更改 urllib2.urlopen 上的用户代理
【发布时间】:2010-10-22 13:48:11
【问题描述】:

我如何下载带有非 urllib2.urlopen 上默认用户代理的网页?

【问题讨论】:

    标签: python urllib2 user-agent


    【解决方案1】:

    几周前我answeredsimilar question

    该问题中有示例代码,但基本上你可以这样做:(注意User-Agent 的大写,RFC 2616,第 14.43 节。)

    opener = urllib2.build_opener()
    opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
    response = opener.open('http://www.stackoverflow.com')
    

    【讨论】:

    • 该方法适用于其他标头,但不适用于 User-Agent——至少在我的 2.6.2 安装中无效。由于某种原因,用户代理被忽略了。
    • 我相信 User-agent 实际上应该是 User-Agent(A 大写)这样做似乎对我有用。
    • 标题名称不区分大小写。
    【解决方案2】:
    headers = { 'User-Agent' : 'Mozilla/5.0' }
    req = urllib2.Request('www.example.com', None, headers)
    html = urllib2.urlopen(req).read()
    

    或者,更短一点:

    req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' })
    html = urllib2.urlopen(req).read()
    

    【讨论】:

    • 使用命名参数,您可以分两行执行此操作。删除第一行并将第二行替换为:req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'})。我更喜欢这种形式来提出一个请求。
    • 或者更短,在一行中:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
    【解决方案3】:

    Setting the User-Agent来自大家最喜欢的Dive Into Python

    小故事:您可以使用Request.add_header 来执行此操作。

    您也可以在创建请求本身时将标头作为字典传递,as the docs note:

    headers 应该是一个字典,并且将被视为使用每个键和值作为参数调用 add_header()。这通常用于“欺骗”User-Agent 标头,浏览器使用该标头来标识自己——一些 HTTP 服务器只允许来自普通浏览器的请求,而不是脚本。例如,Mozilla Firefox 可能将自己标识为 "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11",而 urllib2 的默认用户代理字符串是 "Python-urllib/2.6"(在 Python 2.6 上)。

    【讨论】:

      【解决方案4】:

      对于 python 3,urllib 被分成 3 个模块...

      import urllib.request
      req = urllib.request.Request(url="http://localhost/", headers={'User-Agent':' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'})
      handler = urllib.request.urlopen(req)
      

      【讨论】:

      • 这非常有用。我不明白为什么我需要 request.Request 然后重复 urllib.request.urlopen 旧版本会很好地执行 urllib.urlopen(req) 但无论哪种方式,这都有效,我现在知道如何在 python 3 中使用它.
      • 我仍然收到错误 404 :(
      • 我已经从答案中删除了令人困惑的 data=b'None' 参数。它将示例请求转换为带有无效数据的 POST。可能是您的情况失败的原因,@Maksim
      【解决方案5】:

      所有这些理论上都应该有效,但是(至少在 Windows 上使用 Python 2.7.2)任何时候发送自定义用户代理标头,urllib2 都不会发送该标头。如果您不尝试发送 User-agent 标头,它会发送默认的 Python / urllib2

      这些方法似乎都不适用于添加用户代理,但它们适用于其他标头:

      opener = urllib2.build_opener(proxy)
      opener.addheaders = {'User-agent':'Custom user agent'}
      urllib2.install_opener(opener)
      
      request = urllib2.Request(url, headers={'User-agent':'Custom user agent'})
      
      request.headers['User-agent'] = 'Custom user agent'
      
      request.add_header('User-agent', 'Custom user agent')
      

      【讨论】:

      • opener.addheaders 应该是[('User-agent', 'Custom user agent')]。否则所有这些方法都应该有效(我已经在 Python 2.7.3 (Linux) 上测试过)。在您的情况下,它可能会中断,因为您使用了错误的代理参数。
      • 对我来说,build_opener 调用返回时已经在标题中定义了默认用户代理。所以追加只会创建另一个 User-Agent 标头,第二个将被忽略。这就是@jcoon 的 sol 起作用的原因。
      【解决方案6】:

      对于urllib,您可以使用:

      from urllib import FancyURLopener
      
      class MyOpener(FancyURLopener, object):
          version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
      
      myopener = MyOpener()
      myopener.retrieve('https://www.google.com/search?q=test', 'useragent.html')
      

      【讨论】:

        【解决方案7】:

        urllib2 和 Python 2.7 中的另一个解决方案:

        req = urllib2.Request('http://www.example.com/')
        req.add_unredirected_header('User-Agent', 'Custom User-Agent')
        urllib2.urlopen(req)
        

        【讨论】:

        • 如果通过我的浏览器输入 url,则存在的页面出现错误 404
        【解决方案8】:

        urllib.URLopener()有两个属性,分别是:
        addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]
        version = 'Python-urllib/1.17'
        要欺骗网站,您需要将这两个值都更改为可接受的用户代理。例如
        Chrome 浏览器:'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
        谷歌机器人:'Googlebot/2.1'
        像这样

        import urllib
        page_extractor=urllib.URLopener()  
        page_extractor.addheaders = [('User-Agent', 'Googlebot/2.1'), ('Accept', '*/*')]  
        page_extractor.version = 'Googlebot/2.1'
        page_extractor.retrieve(<url>, <file_path>)
        

        仅更改一项属性不起作用,因为网站将其标记为可疑请求。

        【讨论】:

          【解决方案9】:

          试试这个:

          html_source_code = requests.get("http://www.example.com/",
                             headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
                                      'Upgrade-Insecure-Requests': '1',
                                      'x-runtime': '148ms'}, 
                             allow_redirects=True).content
          

          【讨论】:

          • 该问题明确讨论了urllib2 而不是其他模块。
          猜你喜欢
          • 1970-01-01
          • 2011-07-04
          • 1970-01-01
          • 2014-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-18
          • 1970-01-01
          相关资源
          最近更新 更多