如何使用urllib发送cookie


问题内容

我试图连接到一个网站,该网站要求您具有特定的cookie才能访问它。为了这个问题,我们将Cookie称为“ required_cookie”,并将值称为“
required_value”。

这是我的代码:

import urllib
import http.cookiejar

cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))

opener.addheaders = [('required_cookie', 'required_value'), ('User-Agent', 'Mozilla/5.0')]

urllib.request.install_opener(opener)

req = Request('https://www.thewebsite.com/')
webpage = urlopen(req).read()
print(webpage)

我是urllib的新手,所以请初学者回答


问题答案:

为此urllib,您需要:

  • 构造一个Cookie对象。构造函数未在文档中记录,但是如果您help(http.cookiejar.Cookie)在交互式解释器中,则可以看到其构造函数要求所有16个属性的值。请注意,文档说:“不希望http.cookiejar的用户构造自己的Cookie实例。”
  • 使用将其添加到cookiejar cj.set_cookie(cookie)
  • 告诉cookiejar将正确的标头添加到请求中cj.add_cookie_headers(req)

假设您已经正确配置了策略,则已设置完毕。

但这是一个巨大的痛苦。正如文档urllib.request所说:

另请参见 对于更高级别的HTTP客户端界面,建议使用Requests包

而且,除非您有充分的理由不能安装,否则您requests应该这样做。urllib在真正简单的情况下是可以容忍的,当您需要深入探究时可以很方便-
但对于其他所有方面,requests则要好得多。

使用requests,您的整个程序就变成了单行代码:

webpage = requests.get('https://www.thewebsite.com/', cookies={'required_cookie': required_value}, headers={'User-Agent': 'Mozilla/5.0'}).text

…虽然几行可能更易读:

cookies = {'required_cookie': required_value}
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('https://www.thewebsite.com/', cookies=cookies, headers=headers)
webpage = response.text