使用Python urllib2登录网站表单

时间:2016-02-08 21:46:08

标签: python urllib2

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

执行此操作时,print是原始页面http://reg.maths.lth.se/的源代码,因此它似乎不是我登录的。此外,我可以将任何键/值对添加到值字典中不产生任何错误,这对我来说似乎很奇怪。

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

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

如果您在输入号码并提交表单时检查发送给服务器的请求,您会注意到它是{em> POST请求 pnr和{{1参数:

enter image description here

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

input

我建议您调查MechanizeMechanicalSoupRoboBrowser等可以简化表单提交的工具。您也可以使用HTML解析器解析HTML,例如您自己<input name="_token" type="hidden" value="WRbJ5x05vvDlzMgzQydFxkUfcFSjSLDhknMHtU6m"> ,解压缩令牌并通过BeautifulSouprequests发送:

urllib2