python:urllib2如何在urlopen请求中发送cookie
我想用 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 个回答
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。