Python::请求身份验证

2024-09-29 01:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用BeautifulSoup刮一个网站。该网站需要登录。在

https://www.bahn.de/p/view/meinebahn/login.shtml

通过研究web,我了解到获得授权的一个正确方法是使用requests。在

我的代码如下所示:

url = 'https://www.bahn.de/p/view/meinebahn/login.shtml'
header = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5)AppleWebKit 537.36 (KHTML, like Gecko)     Chrome","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp    ,*/*;q=0.8"}

user = "username"
pwrd = "password"

response = requests.post(url,headers = header, auth=(user, pwrd))
page = requests.get('https://fahrkarten.bahn.de/privatkunde/meinebahn/meine_bahn_portal.go?lang=de&country=DEU#stay')

soup = BeautifulSoup(page.text, 'html.parser')

不幸的是,soup是一个html文本,其中声明“您已从我们的系统中注销”。虽然response的结果是<Response [200]>

我有点纠结于auth有两个原因:

  1. 我对auth方法的理解是否正确,即首先发布登录详细信息,然后访问“隐藏”登录的网站)或者这一方法的工作方式是否不同?在
  2. 如果我需要一个特别的网站怎么办?在html代码中是否有要查找的关键字?在

如果我真的想理解它,任何帮助都会很感激,而且我显然是“新手”从手册中得到正确的结论(例如http://docs.python-requests.org/en/master/user/authentication/


Tags: 方法httpsauthview网站htmlwwwlogin
2条回答

了解网站身份验证如何工作的最简单方法是在登录时捕获流量,并找出幕后发生了什么:使用了哪个URL,提交了哪些数据等。在

您可以使用fiddlercharles,或最方便的Chrome Dev工具(由F12启动),如下所示:

login request

在您的情况下,整个请求是:

POST /privatkunde/start/start.post HTTP/1.1
Host: fahrkarten.bahn.de
Connection: keep-alive
Content-Length: 74
Cache-Control: max-age=0
Origin: https://www.bahn.de
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://www.bahn.de/p/view/meinebahn/login.shtml
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8

scope=bahnde&lang=de&country=DEU&username=demo&password=demo&login-submit=

最重要的是,由于cookie用于身份验证/验证,因此整个过程需要一个会话以及以后用于访问只有登录用户才能访问的其他网页。在

^{pr2}$

很可能是因为您请求了错误的页面,请查看登录页面中的表单:

<form method="post" name="staticLogin" id="kv-static-logi" action="https://fahrkarten.bahn.de/privatkunde/start/start.post">
<input name="scope" value="bahnde" type="hidden">
<input name="lang" value="de" type="hidden">
<input name="country" value="DEU" type="hidden">
<p>
<input id="kv-static-login-username_ab" name="username" class="from" maxlength="60" autocomplete="off" placeholder="Benutzername" type="text">
</p>

<p>
<input id="kv-static-login-password_ab" name="password" class="from" maxlength="60" placeholder="Passwort" type="password">
</p>

<p><button type="submit" name="login-submit" class="btn slim no-margin" style="float: left">Login</button>
<a id="vergessen" href="https://fahrkarten.bahn.de/privatkunde/start/start.post?scope=pwvergessen&amp;lang=de">Login vergessen?</a>
</p></form>

您应该请求带有usernamepassword字段的页面https://fahrkarten.bahn.de/privatkunde/start/start.post。保留请求给你的东西!(代币等)

再见!在

相关问题 更多 >