python:urllib2如何使用urlopen请求发送cookie

Ole*_*nko 81 python urllib2

我正在尝试使用urllib2打开URL并将特定的cookie文本发送到服务器.例如,我想打开网站解决国际象棋问题,使用特定的cookie,例如search = 1.我该怎么做?

我正在尝试执行以下操作:

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

提前致谢

Mes*_*ssa 110

Cookie只是另一个HTTP标头.

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

有关如何将HTTP标头添加到请求的其他方法,请参阅urllib2示例.

有多种方法可以处理cookie.像cookielib这样的模块尝试表现得像网络浏览器 - 记住你之前获得的cookie,并在以下请求中自动发送它们.

  • 如果您有多个cookie,则需要将它们连接在一个标题值中,并以分号分隔.例如,如果你有一个名为`cookievals`的cookie值字典,那么使用`opener.addheaders.append((''Cookie',";".join('%s =%s'%(k,v)for k,v在cookievals.items())))`. (9认同)

Mor*_*sen 57

也许使用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()
Run Code Online (Sandbox Code Playgroud)

编辑:

在Piotr的评论之后我会详细说明一下.来自文档:

CookieJar类存储HTTP cookie.它从HTTP请求中提取cookie,并在HTTP响应中返回它们.必要时,CookieJar实例会自动使包含的Cookie失效.子类还负责从文件或数据库中存储和检索cookie.

因此,无论您对CookieJar实例提出什么要求,所有Cookie都将自动处理.有点像你的浏览器:)

我只能根据自己的经验说话,我99%的用例用于获取cookie,然后需要在该会话中发送所有后续请求.上面的代码只是处理它,它是透明的.

  • @PiotrDobrogost你是对的,我没有用这个代码发送一个特定的cookie :)我假设我将在POST时收到一个,并且`CookieJar`实例将从那时起在所有相关域上处理它. (6认同)
  • OP 明确指出 *(...) 发送特定的 cookie 文本 (...)* 所以这不是答案。 (2认同)

Pio*_*ost 13

您可能想看一下名为Requests的优秀HTTP Python库.它使涉及HTTP的每个任务比urllib2更容易.来自快速入门指南的Cookies部分:

要将您自己的cookie发送到服务器,您可以使用cookies参数:

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

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
Run Code Online (Sandbox Code Playgroud)


Mar*_*tos 5

使用cookielib.链接的文档页面最后提供了示例.你也可以在这里找到一个教程.