14

我正在尝试创建一个使用我的 ID 和密码登录到我大学网站的 python 程序。这是登录的正式页面:https ://webapp.pucrs.br/consulta/

您可能会注意到,这两个字段名为 pr1 和 pr2。该页面使用 POST 发送数据。此外,加载页面时会下载一个 cookie,它是一个包含随机值的 JSESSIONID,据我所知,您必须返回 POST 方法的标头以验证登录名。

我写了以下代码,但是 GET 方法的返回页面显示“会话未初始化”,可能是 cookie 没有正确发送回来。

from urllib2 import Request, build_opener, HTTPCookieProcessor, HTTPHandler
import httplib, urllib, cookielib, Cookie, os

conn = httplib.HTTPConnection('webapp.pucrs.br')

#COOKIE FINDER
cj = cookielib.CookieJar()
opener = build_opener(HTTPCookieProcessor(cj),HTTPHandler())
req = Request('http://webapp.pucrs.br/consulta/principal.jsp')
f = opener.open(req)
html = f.read()
for cookie in cj:
    c = cookie
#FIM COOKIE FINDER

params = urllib.urlencode ({'pr1':111049631, 'pr2':<pass>})
headers = {"Content-type":"text/html",
           "Set-Cookie" : "JSESSIONID=70E78D6970373C07A81302C7CF800349"}
            # I couldn't set the value automaticaly here, the cookie object can't be converted to string, so I change this value on every session to the new cookie's value. Any solutions?

conn.request ("POST", "/consulta/servlet/consulta.aluno.ValidaAluno",params, headers) # Validation page
resp = conn.getresponse()

temp = conn.request("GET","/consulta/servlet/consulta.aluno.Publicacoes") # desired content page
resp = conn.getresponse()

print resp.read()

我应该把这个 cookie 放在哪里,以便对登录进行身份验证?

4

5 回答 5

23

我会尝试使用requests图书馆。文档非常好,代码最终比urllib*

$ pip install requests

使用自己处理 cookie 的会话(参见 Piotr 的评论),结果如下所示

import requests
url_0 = "http://webapp.pucrs.br/consulta/principal.jsp"
url = "https://webapp.pucrs.br/consulta/servlet/consulta.aluno.ValidaAluno"
data = {"pr1": "123456789", "pr2": "1234"}

s = requests.session()
s.get(url_0)
r = s.post(url, data)

它似乎工作正常,因为我收到pr1123456789 的“Usuario inexistente”通知和带有您的用户号码的“Sehna inválida”。

于 2012-04-20T14:37:54.367 回答
7

您必须使用为所有请求创建的相同“开启程序”,它将自行处理所有 cookie。

这是我最近写的东西的摘录

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))

# then for all requests

if postData:     
    pData =  urllib.urlencode(postData)
else:
    pData = None

httpReq = urllib2.Request(url, pData, self._headers)
page =  opener.open(httpReq)
于 2012-04-20T14:44:55.980 回答
5

将 MatthieuW 的答案转换为 Python 3 给出了。

import urllib, http.cookiejar

opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
# then for all requests

if postData:     
    pData =  urllib.parse.urlencode(postData)
else:
    pData = None

httpReq = urllib.request.Request(url, pData)
page =  opener.open(httpReq)
于 2013-06-17T18:19:25.170 回答
1

urllib 不好,使用请求!

from requests import Request, Session

url = "https://webapp.pucrs.br/consulta/principal.jsp"
s = requests.Session()

p = dict(pb1 = 'dd', pb2 = 'cc')
r = s.get(url, params = p) 
# use the cert=/path/to/certificate.pem if you need it
# elsewhere use verify = False to bypass ssl verification

c = r.cookies

# Then send back a response using those same cookies

r = requests.get(other_url, cookies = c, verify = False)
于 2014-01-07T09:35:12.230 回答
1

我建议你使用mechanize,它会自动为你处理会话/cookies/登录,此外它提供了一个类似 urllib 的 API 和例如表单填充,所以你不必弄乱正确的 POST 请求,因为它得到机械化建造。

于 2012-04-20T13:24:01.600 回答