我一直在尝试学习在 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方法来提交数据。
有什么建议吗?
最佳答案
如果您在输入号码并提交表单时检查发送到服务器的请求,您会注意到这是一个带有 pnr
的 POST 请求 _token
参数:
您缺少需要从页面的 HTML 源代码中提取的 _token
参数。它是一个隐藏的 input
元素:
<input name="_token" type="hidden" value="WRbJ5x05vvDlzMgzQydFxkUfcFSjSLDhknMHtU6m">
我建议研究像 Mechanize
这样的工具, MechanicalSoup
或RoboBrowser
这将简化表单提交。您还可以使用 HTML 解析器(例如 BeautifulSoup
)自己解析 HTML,提取 token 并通过 urllib2
或 requests
发送。 :
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/