python - 使用 Python 登录一个棘手的网站
问题描述
我作为数据分析师从事数字营销工作。我的部门使用第三方来帮助吸引更多客户。这些第三方中的每一个都有一个网站,他们可以在其中显示他们为我们公司带来了多少客户。我的部分工作是从每个网站收集数字并将它们放入报告中,这是一个漫长而手动的过程。到目前为止,我已经成功登录了我们的一些第三方网站并提取了一些数据。但是,有一个网站我在登录时遇到了一些问题... https://inspire.flg360.co.uk/SignIn.php。我还需要将会话重定向到另一个 URL 以从中抓取数据。
我编写了一些代码,这些代码成功地登录了我需要信息的不同网站。
import requests
from bs4 import BeautifulSoup
import re
username = 'username'
password = 'password'
scrape_url = 'https://portal.mvfglobal.com/index.php/dashboard'
login_url = 'https://portal.mvfglobal.com/index.php/login/login'
login_info = {'login_name': username, 'login_pass': password}
#Start session.
session = requests.session()
#Login using your authentication information.
session.post(url=login_url, data=login_info)
#Request page you want to scrape.
url = session.get(url=scrape_url)
soup = BeautifulSoup(url.content, 'html.parser')
print(soup)
但是,当我尝试使用相同的方法登录https://inspire.flg360.co.uk/SignIn.php时,我遇到了一些问题。
import requests
from bs4 import BeautifulSoup
username = 'username'
password = 'password'
login_url = 'https://inspire.flg360.co.uk/SignIn.php'
login_info = {'strEmail': username, 'strPassword': password}
scrape_url = 'https://inspire.flg360.co.uk/AuthUser.php'
#Start session.
session = requests.session()
#Login using your authentication information.
session.post(url=login_url, data=login_info)
#Request page you want to scrape.
url = session.get(url=scrape_url)
soup = BeautifulSoup(url.content, 'html.parser')
print(soup)
当我检查页面元素时,我注意到 302 响应重定向到https://inspire.flg360.co.uk/AuthUser.php。但是,当我尝试使用上面的代码登录时,仍然会出现错误。
我完全被任何想法难住了?
最终代码如下________________________________________________________
import requests
from bs4 import BeautifulSoup
import hashlib
username = 'username'
password = 'password'
login_url = 'https://inspire.flg360.co.uk/AuthUser.php'
login_info = {"strForwardURL": "",
"strEmail": username,
"intRememberMe": 1,
"strResponse": ""}
scrape_url = 'https://inspire.flg360.co.uk/ma/index.php'
# Start session.
session = requests.session()
# Get strResponse
strc = session.get(url=login_url)
strc = BeautifulSoup(strc.content, 'html.parser').findAll(attrs={"name": "strChallenge"})[0]['value']
strc_joined = strc + hashlib.md5(password.encode("utf-8")).hexdigest()
strresponse = hashlib.md5(strc_joined.encode("utf-8")).hexdigest()
login_info['strResponse'] = strresponse
#Login using your authentication information.
session.post(url=login_url, data=login_info)
# Request page you want to scrape.
url = session.get(url=scrape_url)
soup = BeautifulSoup(url.content, 'html.parser')
print(soup)
解决方案
看起来https://inspire.flg360.co.uk/SignIn.php页面发送的实际 POST 请求 还有一些需要的元素。即,POST 数据实际上看起来像:
strForwardURL=&strEmail=abc%40123.com&intRememberMe=1&strResponse=fdb4c46c5d0eeab6133be193afc7897e
字段是strForwardURL
、strEmail
、intRememberMe
和strResponse
。查看页面上的其余代码,当您单击提交按钮时,它会触发页面上的这段 javascript:
function fncSignIn() {
var loginForm = document.getElementById("signinForm");
if (loginForm.strEmail.value == "") {
alert("Please enter your email address.");
return false;
}
if (loginForm.strPassword.value == "") {
alert("Please enter your password.");
return false;
}
var submitForm = document.getElementById("submitForm");
submitForm.strEmail.value = loginForm.strEmail.value;
if (loginForm.intRememberMe.checked) submitForm.intRememberMe.value = 1;
submitForm.strResponse.value = hex_md5(loginForm.strChallenge.value+hex_md5(loginForm.strPassword.value));
submitForm.submit();
}
在页面的其他地方,您可以在此处找到strChallenge
字符串:
<input type="hidden" name="strChallenge" value="1d989603e448a1a0559f08bdc83a15522fbc6c0404ca66acc4cdd7aafe4039359e2fb23b706d60a3">
(顺便说一下,这个值在重新加载时会改变)
本质上,它不是字符串形式的密码,而是要求strChallenge
字符串的 md5 十六进制摘要与密码的 md5 十六进制摘要连接。
在python中,它会是这样的:
import hashlib
password = "abcdefg12345"
strc = "1d989603e448a1a0559f08bdc83a15522fbc6c0404ca66acc4cdd7aafe4039359e2fb23b706d60a3"
strc_joined = strc + hashlib.md5(password.encode("utf-8")).hexdigest()
strresponse = hashlib.md5(strc_joined.encode("utf-8")).hexdigest()
print(strresponse)
本例中的输出为 0d289f39067a25430d4818fe38046372
将原始请求中的 postdata 转换为:
{"strForwardURL":"", "strEmail":"abc@123.com", "intRememberMe": 1, "strResponse": "0d289f39067a25430d4818fe38046372"}
并且您应该能够登录。每次您想要抓取需要此特定登录的页面时,您应该能够简单地strChallenge
使用 BeautifulSoup4 抓取,计算正确的strResponse
,然后登录。
推荐阅读
- web-scraping - 无法浏览此站点。如何使用针对此特定站点的请求进行抓取
- java - 如何从字符串中删除 /* 和 */ 之间的字符
- c# - 如何插入位置、比例和正交大小?
- python - 在 django 中找不到支持格式和 MIME 类型的视频
- spring - 无论我在 Spring Boot 项目中使用哪个端口,每次 Web 服务器无法启动时都会显示。端口 #### 已被使用
- pyspark - pyspark databricks中分类逻辑回归模型的标签无效
- python - 如何从 .py 文件创建 .exe 文件
- python - discord.ext.commands.errors.CommandNotFound:找不到命令“等级”
- python - 如何获取 Tkinter 上可用字体的列表?
- python-3.x - 我的 vip 变量不以 False 作为值,并且始终默认为 True