问题描述
准备问我的第一个问题和编程新手,所以请耐心等待:
我正在尝试使用 Python 和 requests
-library 进行一些有趣的网络抓取。但是,我无法成功登录该网站。
这是我尝试登录的网站上表单的 html 代码:
<body class="login"><div class="wrapper">
<div class="wrapper_forms">
<!-- Login Form -->
<form class="login" action="?" method="post">
<fieldset>
<legend>Login</legend>
<label for="login_username">Benutzername:</label>
<input id="login_username" type="text" name="username" autofocus="autofocus" /><em>*</em><br>
<label for="login_password">Passwort:</label>
<input id="login_password" type="password" name="password" /><em>*</em><br>
<em>* required</em><br>
<input type="hidden" name="form" value="login" />
<input id="screen_width" type="hidden" name="screen_width" value="" />
<input type="submit" value="Login" />
<br><a class="pw_reset" href="?action=pw_reset">Passwort vergessen</a>
<br>
</fieldset>
</form>
这是我的代码的缩写版本。我还对我为了可读性而排除的 get 和 post 请求的响应对象进行了一些额外的检查。该站点当前没有有效的 SSL 证书,因此 verify = False
参数。
from bs4 import BeautifulSoup
import requests
# Start session
session = requests.Session()
# payload
payload = {'username':'****','password':'****','form':'login','screen_width':'1920'}
# variables
login = "https://altklausurendb.de/login.PHP"
dest = "https://altklausurendb.de/index.PHP"
# initial get request to retrieve cookies and headers
s = session.get(login,verify = False)
cookies = s.cookies.get_dict()
headers = s.headers
# distribute payload
r1 = session.post(login,data = payload,cookies = cookies,headers = headers,verify = False)
#download content of destination site
r2 = session.get(dest,verify = False)
soup = BeautifulSoup(r2.text,'html.parser')
print(soup)
打印函数的输出返回上面的 html 表单,而不是 https://altklausurendb.de/index.PHP
的内容,后者是第二个 dest
请求的 GET
变量。
经过大量阅读此处、reddit 和 WWW 的其他内容后,我自己尝试的方法:
- 无需在
POST
请求中显式传递 cookie 和标头即可运行这一切(显而易见) - 手动登录,检查我登录网站时生成的
POST
请求,使用网络点击下的 Chrome 开发工具。甚至在脚本的单独版本中手动复制标题,以防requests
header
函数以某种方式提供错误的标题。 - 使用 HTTPBasicAuth 进行登录过程
- 对从初始
response
和GET
请求创建的POST
对象运行所有检查,有趣的是,无论用户名是什么,状态代码始终为200
和我在字典中提供的密码 --> 这让我怀疑,如果网站没有以POST
响应错误凭据,则403
请求未正确提交。
我看到某些网站在 name
语句中也有一个 <input type="submit">
变量,您必须将其传递给字典。然而,这个网站似乎没有它,基本上这就是我现在卡住的地方。
如果他们想自己重现脚本的行为,我愿意将我在网站上创建的测试帐户的凭据发送给某人。
感谢您的耐心等待,我知道网络抓取问题并不是最喜欢的问题,感谢您的帮助!
解决方法
扔掉所有这些,得到 selenium 模块。 BS4 适合抓取 HTML,但如果您要抓取动态页面,则需要 selenium。