Python 创建 cookies 并用 cookies 加载页面

5 投票
3 回答
48237 浏览
提问于 2025-04-16 08:00


我想从一个Python程序访问一个网页。
为了加载这个网页,我需要设置一些cookies。
我用了httplib2这个库,但我不知道怎么添加我自己的cookie。

resp_headers, content = h.request("http://www.theURL.com", "GET")

我该怎么创建带有正确名称和值的cookie,把它添加到函数里,然后加载这个网页呢?
谢谢!

3 个回答

0

你也可以只使用 urllib2 这个库。

        import urllib2

        opener = urllib2.build_opener()
        opener.addheaders.append(('Cookie', 'cookie1=value1;cookie2=value2'))
        f = opener.open("http://www.example.com/")
        the_page_html = f.read()
14

来自 http://code.google.com/p/httplib2/wiki/Examples 希望能帮到你)

关于Cookies

在自动化某些操作时,你通常需要“登录”,以便和服务器保持某种会话或状态。有时候,这通过表单认证和Cookies来实现。你向服务器提交一个表单,服务器会在返回的HTTP头中给你一个Cookie。之后的请求中,你需要把这个Cookie带回去,以保持状态或维持会话。

下面是一个处理Cookies的例子,适用于你的HTTP Post请求。

首先,我们来导入需要用到的模块:

import urllib
import httplib2

接下来,定义我们需要的数据。在这个例子中,我们要做一个表单提交,包含两个字段,分别是用户名和密码。

url = 'http://www.example.com/login'   
body = {'USERNAME': 'foo', 'PASSWORD': 'bar'}
headers = {'Content-type': 'application/x-www-form-urlencoded'}

现在我们可以发送HTTP请求了:

http = httplib2.Http()
response, content = http.request(url, 'POST', headers=headers, body=urllib.urlencode(body))

此时,我们的“response”变量里包含了服务器返回的HTTP头字段的字典。如果服务器返回了一个Cookie,你会看到一个“set-cookie”字段,里面有Cookie的值。我们需要把这个值放到后续请求的HTTP头中:

headers['Cookie'] = response['set-cookie']

现在我们可以使用这个包含Cookie的头发送请求,这样服务器就能识别我们了。

所以……下面是整个过程的脚本。我们先登录一个网站,然后使用收到的Cookie再发起另一个请求:

#!/usr/bin/env python

import urllib
import httplib2

http = httplib2.Http()

url = 'http://www.example.com/login'   
body = {'USERNAME': 'foo', 'PASSWORD': 'bar'}
headers = {'Content-type': 'application/x-www-form-urlencoded'}
response, content = http.request(url, 'POST', headers=headers, body=urllib.urlencode(body))

headers = {'Cookie': response['set-cookie']}

url = 'http://www.example.com/home'   
response, content = http.request(url, 'GET', headers=headers)
7
http = httplib2.Http()
# get cookie_value here
headers = {'Cookie':cookie_value}
response, content = http.request("http://www.theURL.com", 'GET', headers=headers)

你可能想要添加另一个头部参数,以便指定其他的HTTP请求参数。

撰写回答