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


82

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

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

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

提前致谢

Answers:


111

Cookie只是另一个HTTP标头。

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

有关如何将HTTP标头添加到您的请求的其他方式,请参见urllib2示例

有更多方法来处理cookie。Cookielib之类的某些模块尝试表现得像Web浏览器一样-记住您之前获得了哪些Cookie,并在随后的请求中自动将其再次发送。


9
如果您有多个Cookie,则需要将它们加入一个以分号分隔的单个标头值中。例如,如果您有一个名为的cookie值字典cookievals,请使用opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items())))
格雷格·格洛克纳

如果他们使用其他参数进行urlopen怎么办?
安德鲁

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()

编辑:

在皮约特发表评论之后,我将详细说明。从文档:

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

因此,无论您对CookieJar实例提出什么请求,所有cookie都会自动处理。就像您的浏览器一样:)

我只能以自己的经验谈谈,我99%的cookie用例是接收cookie,然后需要将该会话中所有后续请求发送给它。上面的代码可以处理这些事情,并且透明地进行。


6
@PiotrDobrogost,您是对的,我没有使用此代码发送特定的Cookie :)我假设我将在发布时收到一个Cookie,CookieJar此后实例将在所有相关域中为我处理该Cookie 。
Morten Jensen

2
OP明确声明(...)发送特定的cookie文本(...),因此这不是答案。
Piotr Dobrogost

13

您可能想看看称为Requests的出色的HTTP Python库。它使每个涉及HTTP的任务都比urllib2容易一些。在快速入门指南的Cookie部分中:

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

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

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

1
它基于urllib3,它支持urllib3之类的连接池,并保留cookie和标头-请参见Requests Session。真漂亮!
Serge S.

5

使用cookielib。链接的文档页面最后提供了示例。您还将在此处找到教程。


在本教程中,他们是在从服务器接收到Cookie后保存它们的,不是吗?
奥列格·塔拉申科

它们既保存从服务器检索到的cookie,又将它们返回给服务器,因为这通常是cookie的工作方式。如果您想做一些与众不同的事情,那么您将不得不对库进行更深入的研究。我很确定它会支持您想做的任何事情。
马塞洛·坎托斯

1

由于该urllib2模块已在Python 3中拆分为多个模块,因此此答案不起作用。

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.