为“__hpKey”抓取网站,然后在 python 中使用请求和 beautifulsoup 登录

scraping website for '__hpKey' and then logging in using requests and beautifulsoup in python

这是我的第一个编码项目,所以我可能没有掌握所有正确的术语。我正在尝试使用 python 中的请求和 BeautifulSoup 图书馆登录 NHS 献血网站。我设法做到了这一点,但只有当我使用我从浏览器网络选项卡的登录 Headers 中复制并粘贴的“__hpKey”值时,它才有效。我希望能够抓取网站来找到这个令牌,而不必使用我复制和粘贴的令牌。

我找到了“__hpKey”,但尝试登录时此密钥似乎不起作用。

s = requests.session()
soup_key = BeautifulSoup(s.get('https://my.blood.co.uk/Account/SignIn').content, 'html.parser')
key = soup_key.find('input', {'name': '__hpKey'})['value']

我刚刚将网络登录选项卡中的值设置为 'key',因为使用上面的代码无法成功登录。我已经缩小了我需要传递到登录门户的四个元素。它们是:

data = {
  'LoginEmailAddress': 'email',
  'LoginPassword': 'password',
  'Question-Reason': '',
  '__hpKey': 'key'                ## 'key' is a 216 character key ending in ==

然后我将这 4 个元素传递到登录门户并使用 BeautifulSoup 解析带有我的捐助者资料的网页标题。标题让我知道是否登录成功。

login_req = s.post('https://my.blood.co.uk/Account/Login', data=data)
soup = BeautifulSoup(s.get('https://my.blood.co.uk/Home/Landing?load=Yourdonations').content, 'html.parser')
print(soup.title)       # If logged in prints "My Donor Record", else prints "My Donor Record - Sign in or Register"

那么,如何才能找到传递到登录门户时有效的“__hpKey”值?

谢谢

请求中包含一些验证字段。这些字段位于表单的隐藏 input 标记中。最快的方法是获取表单下的所有输入并按有效负载中的原样发送所有输入:

import requests
from bs4 import BeautifulSoup

s = requests.Session()

email = "your@email.com"
password = "your_password"

r = s.get("https://my.blood.co.uk/Account/SignIn")
soup = BeautifulSoup(r.text, "html.parser")
form = soup.findAll("form")[1]

payload = dict([
    (t["name"],t["value"]) 
    for t in form.findAll("input")
    if t.has_attr("value")
])
payload["Type-Fax"] = "" # maybe not necessary ?
payload["LoginEmailAddress"] = email
payload["LoginPassword"] = password

print(payload)
r = s.post("https://my.blood.co.uk/Account/Login", data = payload)

soup = BeautifulSoup(s.get('https://my.blood.co.uk/Home/Landing?load=Yourdonations').content, 'html.parser')
print(soup.title)

请注意,我没有使用有效帐户测试上述代码