python:urllib2如何在urlopen请求中发送cookie

84 投票
5 回答
136216 浏览
提问于 2025-04-16 01:50

我想用 urllib2 来打开一个网址,并向服务器发送特定的 cookie 信息。比如,我想打开网站 Solve chess problems,并带上一个特定的 cookie,比如 search=1。我该怎么做呢?

我正在尝试以下方法:

import urllib2
(need to add cookie to the request somehow)
urllib2.urlopen("http://chess-problems.prg")

5 个回答

13

你可以看看一个很棒的Python库,叫做Requests。这个库让处理HTTP相关的任务比urllib2简单一些。在快速入门指南的Cookies部分提到:

如果你想把自己的cookies发送给服务器,可以使用cookies这个参数:

>>> cookies = dict(cookies_are='working')

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
56

也许使用 cookielib.CookieJar 会对你有帮助。例如,当你要向一个包含表单的页面发送数据时:

import urllib2
import urllib
from cookielib import CookieJar

cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# input-type values from the html form
formdata = { "username" : username, "password": password, "form-id" : "1234" }
data_encoded = urllib.urlencode(formdata)
response = opener.open("https://page.com/login.php", data_encoded)
content = response.read()

编辑:

在Piotr的评论之后,我再详细说一下。从文档中可以了解到:

CookieJar类用来存储HTTP cookies。它会从HTTP请求中提取cookies,并在HTTP响应中返回这些cookies。CookieJar的实例会在必要时自动过期里面的cookies。子类还负责从文件或数据库中存储和获取cookies。

所以,无论你用你的 CookieJar 实例发出什么请求,所有的cookies都会被自动处理。就像你的浏览器一样 :)

我只能根据自己的经验说,我99%的使用场景是接收一个cookie,然后在这个会话中需要把它发送给所有后续的请求。上面的代码正好处理了这个问题,而且处理得非常透明。

113

Cookie 就是另一种 HTTP 头信息。

import urllib2
opener = urllib2.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")

可以查看 urllib2 示例,了解其他添加 HTTP 头信息到请求的方法。

处理 Cookie 的方法还有很多。一些模块,比如 cookielib,会像网页浏览器一样,记住你之前获取的 Cookie,并在后续的请求中自动发送这些 Cookie。

撰写回答