【问题标题】:How can I recreate a urllib.requests in Python 2.7?如何在 Python 2.7 中重新创建 urllib.requests?
【发布时间】:2017-07-22 22:18:57
【问题描述】:

我正在抓取一些网页并解析其中的一些数据,但其中一个网站似乎阻止了我的请求。使用带有 urllib.requests 的 Python 3 的代码版本可以正常工作。我的问题是我需要使用 Python 2.7,而我无法使用 urllib2 得到响应

这些请求不应该是相同的吗?

Python 3 版本:

def fetch_title(url):
    req = urllib.request.Request(
        url, 
        data=None, 
        headers={
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
        }
    )
    html = urllib.request.urlopen(req).read().encode('unicode-escape').decode('ascii')

    return html

Python 2.7 版本:

import urllib2

opener = urllib2.build_opener()
opener.addheaders = [(
            'User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
        )]
response = opener.open('http://website.com')

print response.read()

【问题讨论】:

  • 我确实收到了来自两个版本的响应,但我使用 urllib.requests 获得了完整的内容页面,并且我获得了带有 urllib2 版本的站点的阻止版本

标签: python python-2.7 python-3.x python-requests urllib2


【解决方案1】:

以下代码应该可以工作,基本上使用 python 2.7,您可以使用所需的标头创建一个字典并格式化您的请求,使其可以使用 urllib2.Request 与 urllib2.urlopen 一起正常工作。

import urllib2

def fetch_title(url):
    my_headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36"
    }
    return urllib2.urlopen(urllib2.Request(url, headers=my_headers)).read()

【讨论】:

  • 一般来说,最好的答案可以提供关于为什么如何工作的洞察力。答案很好,但是您可以通过一些解释做很多事情来进行教育。有点像Teach a man to fish
  • 您好,感谢您回来改进您的回答。有10分:)
猜你喜欢
  • 2017-09-06
  • 1970-01-01
  • 2015-11-10
  • 2018-05-08
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2018-08-23
  • 2017-11-04
相关资源
最近更新 更多