在urllib.request.build_opener中实现用户代理的正确方法

时间:2018-10-28 19:19:06

标签: python python-3.x python-requests urllib

我正在尝试为我的urllib请求设置用户代理:

.carre:hover{
    transform:  rotateX(30deg) rotateY(20deg) rotateZ(-20deg) translateX(0) 
                translateY(0) translateZ(100px);
    box-shadow: -100px 100px 100px rgba(0,0,0,.3);
  .carre__tippy{
    transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg) translateZ(120px);
    box-shadow: -50px 50px 20px rgba(0,0,0,.3);
  }
  .carre__front{
    transform: translateZ(50px);
    box-shadow: -20px 20px 30px rgba(0,0,0,.3);
    opacity: .7;
   }
}

最后:

opener = urllib.request.build_opener(
            urllib.request.HTTPCookieProcessor(cj),
            urllib.request.HTTPRedirectHandler(),
            urllib.request.ProxyHandler({'http': proxy})
)

将用户代理标头设置为的最佳方法是什么

response3 = opener.open("https://www.google.com:443/search?q=test", timeout=timeout_value).read().decode("utf-8")

1 个答案:

答案 0 :(得分:1)

据我所知,ERR_CONTENT_DECODING_FAILED 有两个选项。

urllib返回一个OpenerDirector对象,该对象具有一个build_opener属性。我们可以使用该属性更改用户代理和其他标头。

addheaders

或者,我们可以使用install_opener将OpenerDirector对象安装到全局打开器中,然后使用opener.addheaders = [('User-Agent', 'My User-Agent')] url = 'http://httpbin.org/user-agent' r = opener.open(url, timeout=5) text = r.read().decode("utf-8") 提交请求。现在可以使用urlopen设置标题。

Request

就个人而言,我更喜欢第二种方法,因为它更加一致。一旦安装了打开器,所有请求将具有相同的处理程序,并且我们可以以相同的方式继续使用urllib。但是,如果您不想对所有请求使用这些处理程序,则应选择第一种方法,并使用urllib.request.install_opener(opener) url = 'http://httpbin.org/user-agent' headers = {'user-agent': "My User-Agent"} req = urllib.request.Request(url, headers=headers) r = urllib.request.urlopen(req, timeout=5) text = r.read().decode("utf-8") 来设置特定OpenerDirector对象的标头。


有了requests,事情就变得简单了。

如果要更改所有请求的用户代理或其他标头,则可以使用addheaders属性,

session.heders

,或者,如果我们只想为特定请求设置标头,则使用s = requests.session() s.headers['user-agent'] = "My User-Agent" r = s.get(url, timeout=5) 参数。

headers