我尝试使用pythons请求模块登录网页。我在使用chrome提交Login表单时重新捕获了post请求,并重新检查了该表单的代码。 (网站以及参数在下面的代码片段中提到)
基于某人的帖子,我能够创建一个试图登录并访问受保护内容的python片段,但由于某种原因,这不能按预期工作。
这是我的python片段:
import requests
LOGIN = 'https://www.hackthis.co.uk/index.php'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
'username': 'VALIDUSERNAME',
'password': 'VALIDPASSWORD'
}
with requests.session() as s:
s.post(LOGIN, data=payload)
response = s.get(PROTECTED_PAGE)
print(response.text)
即使我发送带有所需有效负载的帖子请求,但我无法访问受保护的内容。 响应HTML代码包含登录表单以及在未登录的情况下不允许访问该内容的注释。
我在这里想念什么?
修改
感谢您提供非常有用的答案!犯了很愚蠢的错误。我忘记了URL的登录部分。 以下是有关该主题的后续问题的工作代码段(已测试,按预期工作):
import requests
LOGIN = 'https://www.hackthis.co.uk/index.php?login'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
'username': 'VALIDUSERNAME',
'password': 'VALIDPASSWORD'
}
with requests.session() as s:
s.post(LOGIN, data=payload)
response = s.get(PROTECTED_PAGE)
print(response.text)
答案 0 :(得分:1)
帖子是 https://www.hackthis.co.uk/index.php?login ,最后请注意 ?login
:
LOGIN = 'https://www.hackthis.co.uk/index.php?login'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
'username': 'uname',
'password': 'pass'
}
with requests.session() as s:
r = s.post(LOGIN, data=payload)
response = s.get(PROTECTED_PAGE)
print(response.text)
您可以在网络标签下的开发者工具/ firebug中看到帖子网址:
或者在html中,您可以在表单中看到action="?login"
:
<form id="login_form" action="?login" method="POST">
答案 1 :(得分:1)
大多数网站都使用身份验证机制,以便只向提供有效凭据的用户提供他们想要的内容。为了让这更简单,想象一下你想要进入一个博物馆。你可以在没有人要求你的情况下进入售票亭,但是你需要买票才能看到内部。考虑到这一点,您可以将网站/服务器视为售票亭,凭证作为购买机票的钱,并且应该使用机票本身以便进入博物馆的不同部分。为了将此示例带回Web服务,我将尝试解释用于身份验证的两种技术
Cookies是网站发送的小块(通常是加密的)数据,并在您浏览时存储到您的计算机中。 cookie身份验证过程如下:
虽然这项技术很棒但它有一些security issues
此技术类似于Cookie,但它更好地模拟了我们的博物馆门票示例。令牌是包含私人信息的加密数据。值得注意的是,令牌通常具有到期日期。身份验证过程如下:
使用Postman或Curl等HTTP请求工具,您可以看到此网站使用cookie技术,登录URL为 index.php?login 。
<强> TL; DR 强>
您的代码应该可以正常工作,唯一的问题是您用于登录的URL。
import requests
LOGIN = 'https://www.hackthis.co.uk/index.php?login'
PROTECTED_PAGE = 'https://www.hackthis.co.uk/news'
payload = {
'username': 'VALIDUSERNAME',
'password': 'VALIDPASSWORD'
}
with requests.session() as s:
s.post(LOGIN, data=payload)
response = s.get(PROTECTED_PAGE)
print(response.text)