尝试登录此网站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字符串,因此也不确定如何执行此操作。
答案 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)
您将看到网站的回复。 这不是解决办法,而更像是一种检查是否出问题的方法