如何使用python请求登录网站

时间:2019-10-05 08:46:47

标签: python-requests

尝试登录此网站https://lse.co.uk,但未成功。我看过StackOverflow并阅读了多个问题和答案,但是它们都是不同的。要么就是我错过了与此案相符的案子。

这就是我所拥有的。

import requests

login_url = "https://www.lse.co.uk/login.html"
s = requests.session()
payload = {
    "txtEmail": "some@email.co.uk", 
    "txtPassword": "somepassword"
}
r = s.post(login_url, data=payload)

也尝试了上述方法,但是使用Base64对凭据进行了编码。

从Chrome浏览器检查html代码,我可以看到Base64字符串。我应该捕获该字符串并使用此字符串对用户名和密码进行编码吗?在r.content的输出中看不到Base64字符串,因此也不确定如何执行此操作。

enter image description here

2 个答案:

答案 0 :(得分:1)

查看表单,可能您没有提交表单中的所有输入。仅发送所需的两个表单输入是不够的。

阅读表单的代码可能对您的代码有更多的期望,首先,有两个隐藏的输入提供了一些上下文:

<input type="hidden" name="txtFormType" value="LOGIN">
<input type="hidden" name="txtLoginSource" value="MAIN">

所以您应该将它们添加到您的剪贴代码中:

>>> payload = {
    "txtEmail": "some@email.co.uk", 
    "txtPassword": "somepassword",
    "txtFormType": "LOGIN",
    "txtLoginSource": "MAIN"
}

如果幸运的话,这就是它所要查找的内容,并且表格可以使用。

如果不是那样,则意味着您需要提供recaptcha隐藏元素,该元素可以防止用户通过脚本编写对登录页面的访问(主要是避免bot的暴力行为,其副作用是让人不寒而栗给愿意做合法脚本的人。

所以让我们检查一下:

>>> result = requests.get(login_url)

然后,您需要使用html解析器,例如lxml:

>>> from lxml import etree

您必须解析html:

>>> page = etree.fromstring(r.text, etree.HTMLParser())

,然后尝试获取它:

>>> tree.xpath("//form[@class='login__form']/input[name='g-recaptcha-response-v3']")
[]

哎呀,它不在那里! ?

那是因为它很可能由脚本来处理,该脚本会在加载页面时使用javascript添加隐藏的输入。因此,您注定要失败,没有简单的解决方案。

解决方案之一是使用真正的浏览器打开网页,运行google javascript,并做一些事情以确保不会被检测为机器人(例如调整窗口大小)加载页面时),然后获取该隐藏输入的值。

希望您可以使用selenium来进行此操作,参见that answer。我不会介绍如何安装Selenium,但是您的代码可能像这样:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(chrome_options=options, 
executable_path=r'/path/to/chromedriver')
driver.get(login_url)

# here get the g-recaptcha-response-v3 element to fetch its value, so you can add it to the payload

很抱歉,我没有深入研究该解决方案,但是您应该有足够的入门和探索的机会。

答案 1 :(得分:0)

我对python不太满意,我也在尝试学习请求。 我可以尝试帮助您查看响应,您可以尝试

print(r.text)

您将看到网站的回复。 这不是解决办法,而更像是一种检查是否出问题的方法