import requests
import hashlib
from lxml import etree
# js 对密码的加密:
# pwd = md5(pwd + 'Hq44cyp4mT9Fh5eNrZ67bjifidFhW%fb0ICjx#6gE59@P@Hr8%!WuYBa1yvytq$qh1FEM18qA8Hp9m3VLux9luIYpeYzA2l2W3Z');
#js:加密函数
def js_pwd(pwd):
# 创建MD5对象
md5_hash = hashlib.md5()
# 对密码字符串进行编码
pwd_string = pwd + 'Hq44cyp4mT9Fh5eNrZ67bjifidFhW%fb0ICjx#6gE59@P@Hr8%!WuYBa1yvytq$qh1FEM18qA8Hp9m3VLux9luIYpeYzA2l2W3Z'
encoded_pwd_string = pwd_string.encode('utf-8')
# 更新哈希对象
md5_hash.update(encoded_pwd_string)
# 获取十六进制表示的哈希值
MD5_pwd = md5_hash.hexdigest()
return MD5_pwd
# 加密后的密码
password=js_pwd("13302775336Ma.")
print("加密后的pwd:\n"+password)
# 参数
params={
"email":"3221231187@qq.com",
"password":password
}
# 请求头
headers= {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
}
# url
url="https://www.94mxd.com.cn/signin"
# 发送请求
response=requests.get(url=url,headers=headers,params=params)
# 检查响应状态
if response.status_code == 200:
print("成功获取 HTML 内容")
# 使用推测的编码来解码
response.encoding = response.apparent_encoding # 自动检测编码
print("使用: encoding:", response.encoding+"进行解码!")
html = response.text # 获取 HTML 内容
# 保存到文件
file_name = "煤想到.html"
with open(file_name, "w", encoding="utf-8") as file:
file.write(html)
print(f"HTML 内容已成功保存到文件:{file_name}")
# 使用 lxml.etree.HTML 解析 HTML 内容
html_tree = etree.HTML(response.text)
print(html_tree)
else:
print(f"请求失败,状态码: {response.status_code}")
代码功能概述
- 密码加密:定义了一个
js_pwd
函数,该函数将输入的密码与一个特定的字符串拼接后,使用 Python 的hashlib.md5
进行 MD5 加密,返回加密后的十六进制字符串。 - 发送请求:使用
requests
库发送一个带有加密密码和邮箱参数的 GET 请求到指定的 URL。 - 处理响应:检查响应状态码,如果状态码为 200,表示请求成功,将响应内容保存到文件中,并使用
lxml.etree
解析 HTML 内容;否则,打印请求失败信息。
代码问题与优化建议
1. 加密逻辑的 JavaScript 模拟
代码中模拟了 JavaScript 的 MD5 加密逻辑,但要注意 JavaScript 和 Python 的字符串处理可能存在细微差异。不过当前的代码实现是正确的,只是需要确保拼接的字符串和 JavaScript 中的一致。
2. 请求方法
使用requests.get
方法发送请求时,参数会被附加到 URL 后面。如果这个接口要求使用 POST 方法发送数据,那么需要将requests.get
改为requests.post
,并相应地修改代码:
response = requests.post(url=url, headers=headers, data=params)
3. 错误处理
代码中只是简单地检查了响应状态码,对于请求过程中可能出现的其他异常(如网络错误、超时等)没有进行处理。可以添加异常处理机制来增强代码的健壮性:
3. 错误处理
代码中只是简单地检查了响应状态码,对于请求过程中可能出现的其他异常(如网络错误、超时等)没有进行处理。可以添加异常处理机制来增强代码的健壮性:
try:
response = requests.get(url=url, headers=headers, params=params)
response.raise_for_status() # 检查响应状态码,如果不是200,抛出异常
# 处理成功响应的代码
except requests.RequestException as e:
print(f"请求发生错误: {e}")
4. 代码结构和注释
代码整体结构较为清晰,但可以添加更多的注释来解释关键步骤和逻辑,提高代码的可读性。
优化后的代码示例
import requests
import hashlib
from lxml import etree
# js 对密码的加密逻辑模拟
def js_pwd(pwd):
# 创建MD5对象
md5_hash = hashlib.md5()
# 拼接密码和特定字符串
pwd_string = pwd + 'Hq44cyp4mT9Fh5eNrZ67bjifidFhW%fb0ICjx#6gE59@P@Hr8%!WuYBa1yvytq$qh1FEM18qA8Hp9m3VLux9luIYpeYzA2l2W3Z'
# 对拼接后的字符串进行UTF-8编码
encoded_pwd_string = pwd_string.encode('utf-8')
# 更新哈希对象
md5_hash.update(encoded_pwd_string)
# 获取十六进制表示的哈希值
MD5_pwd = md5_hash.hexdigest()
return MD5_pwd
# 加密后的密码
password = js_pwd("13302775336Ma.")
print("加密后的pwd:\n" + password)
# 请求参数
params = {
"email": "3221231187@qq.com",
"password": password
}
# 请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
}
# 请求URL
url = "https://www.94mxd.com.cn/signin"
try:
# 发送请求
response = requests.get(url=url, headers=headers, params=params)
response.raise_for_status() # 检查响应状态码
print("成功获取 HTML 内容")
# 使用推测的编码来解码
response.encoding = response.apparent_encoding
print(f"使用: encoding: {response.encoding} 进行解码!")
html = response.text # 获取 HTML 内容
# 保存到文件
file_name = "煤想到.html"
with open(file_name, "w", encoding="utf-8") as file:
file.write(html)
print(f"HTML 内容已成功保存到文件:{file_name}")
# 使用 lxml.etree.HTML 解析 HTML 内容
html_tree = etree.HTML(response.text)
print(html_tree)
except requests.RequestException as e:
print(f"请求发生错误: {e}")