python - 使用Python urllib2网站表单登录

标签 python urllib2

我一直在尝试学习在 Python 中使用 urllib2 包。我尝试以学生身份(左侧表单)登录数学学生的注册页面:http://reg.maths.lth.se/ 。我已经检查了代码(使用 Firebug),显然应该使用 POST 调用左侧的表单,并使用名为 pnr 的键,其值应该是一个 10 个字符长的字符串(最后一部分可能无法从HTML 代码,但它基本上是我的社会安全号码,所以我知道它应该有多长)。请注意,相应 POST 方法 header 中的 action 是另一个 URL,即 http://reg.maths.lth.se/login/student .

我尝试过(在下面的示例中使用假pnr,但我在自己的代码中使用了真实号码)。

import urllib
import urllib2

url = 'http://reg.maths.lth.se/'
values = dict(pnr='0000000000')
data = urllib.urlencode(values)
req = urllib2.Request(url,data)
resp = urllib2.urlopen(req)
page = resp.read()

print page

执行时,打印的是原始页面http://reg.maths.lth.se/的源代码,所以看起来我没有登录。此外,我可以将任何键/值对添加到值字典中,并且不会产生任何错误,这对我来说似乎很奇怪。

此外,如果我转到页面 http://reg.maths.lth.se/login/student ,显然没有POST方法来提交数据。

有什么建议吗?

最佳答案

如果您在输入号码并提交表单时检查发送到服务器的请求,您会注意到这是一个带有 pnrPOST 请求 _token参数:

enter image description here

您缺少需要从页面的 HTML 源代码中提取的 _token 参数。它是一个隐藏的 input 元素:

<input name="_token" type="hidden" value="WRbJ5x05vvDlzMgzQydFxkUfcFSjSLDhknMHtU6m">

我建议研究像 Mechanize 这样的工具, MechanicalSoupRoboBrowser这将简化表单提交。您还可以使用 HTML 解析器(例如 BeautifulSoup)自己解析 HTML,提取 token 并通过 urllib2requests 发送。 :

import requests
from bs4 import BeautifulSoup

PNR = "00000000"

url = "http://reg.maths.lth.se/"
login_url = "http://reg.maths.lth.se/login/student"
with requests.Session() as session:
    # extract token
    response = session.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    token = soup.find("input", {"name": "_token"})["value"]

    # submit form
    session.post(login_url, data={
        "_token": token,
        "pnr": PNR
    })

    # navigate to the main page again (should be logged in)
    response = session.get(url)

    soup = BeautifulSoup(response.content, "html.parser")
    print(soup.title)

关于python - 使用Python urllib2网站表单登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35279961/

相关文章:

python - 在 Python 中子类化 float 类型,无法在 __init__() 中捕获异常

python - 从 python 运行 docker-compose

python - 重命名和压缩文件 Python - FileNotFoundError

python - 从 URL 请求加载 JSON 文件

Python 2.6 urlib2 超时问题

Python 无法使用 urllib2 进行 PUT

Python 2.x - 如何通过trainSet和testSet获取NLTK朴素贝叶斯分类的结果

python - 调试 python Web 服务

python - urllib2.urlopen 引发 HTTP 错误 400 : Bad Request

Python 从 Web 抓取的 URL 下载数据文件