我正在尝试学习使用Python的som web功能,并且认为我通过编写脚本来登录我大学的网页进行练习。最初我使用urllib2
编写了代码,但是用户alecxe使用requests/BeautifulSoup
向我提供了代码(请参阅:Website form login using Python urllib2)
我正在尝试登录页面http://reg.maths.lth.se/。该页面为学生提供一个登录表单,为教师提供一个登录表单(我显然是在尝试以学生身份登录)。要登录一个应该提供一个“Personnummer”,它基本上相当于一个社会安全号码,所以我不想发布我的有效号码。但是,我可以透露它应该是10位数。
我提供的代码(对最终的print语句进行了一些小改动)如下:
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) ##This is deliberately commented out
soup = BeautifulSoup(response.content, "html.parser")
print(soup)
因此应该打印在发布pnr之后获得的页面的源代码。
代码运行时,它总是返回主页http://reg.maths.lth.se/的源代码,这是不正确的。例如,如果您尝试手动输入错误长度的pnr,即0,则应将您定向到如下所示的页面:
位于网址http://reg.maths.lth.se/login/student
,其源代码与主页的源代码完全不同。
有什么建议吗?
答案 0 :(得分:2)
您没有将POST结果分配给response
,而只是打印出第一个GET请求的结果。
所以,
# submit form
session.post(login_url, data={
"_token": token,
"pnr": PNR
})
应该是
response = session.post(login_url, data={
"_token": token,
"pnr": PNR
})