我试图学习在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方法。
有什么建议吗?
答案 0 :(得分:2)
如果您在输入号码并提交表单时检查发送给服务器的请求,您会注意到它是{em> POST请求 pnr
和{{1参数:
您缺少需要从页面的HTML源提取的_token
参数。它是一个隐藏的_token
元素:
input
我建议您调查Mechanize
,MechanicalSoup
或RoboBrowser
等可以简化表单提交的工具。您也可以使用HTML解析器解析HTML,例如您自己<input name="_token" type="hidden" value="WRbJ5x05vvDlzMgzQydFxkUfcFSjSLDhknMHtU6m">
,解压缩令牌并通过BeautifulSoup
或requests
发送:
urllib2