Python中如何实现使用账号密码登录百度?
如题,感觉 token 那一块比较复杂,网上那些开源的项目也大多不可用了。
Python中如何实现使用账号密码登录百度?
8 回复
200,给你弄一个
import requests
from urllib.parse import urlencode
def login_baidu(username, password):
"""
使用账号密码登录百度(模拟登录流程)
注意:实际百度登录有复杂验证机制,此代码仅演示基本流程
"""
# 1. 获取登录页面,获取token等必要参数
session = requests.Session()
login_url = "https://passport.baidu.com/v2/api/?login"
# 设置请求头模拟浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.baidu.com/'
}
# 2. 实际百度登录需要先获取动态参数(这里简化演示)
# 通常需要从页面解析token、验证码等参数
payload = {
'username': username,
'password': password,
'token': '', # 实际需要从页面获取
'staticpage': 'https://www.baidu.com/cache/user/html/v3Jump.html',
'charset': 'UTF-8',
'tpl': 'mn',
'subpro': '',
'apiver': 'v3',
'tt': '', # 时间戳
'codestring': '', # 验证码(如果需要)
'isPhone': 'false',
'safeflg': '0',
'u': 'https://www.baidu.com/',
'quick_user': '0',
'logintype': 'dialogLogin',
'logLoginType': 'pc_loginDialog',
'verifycode': '',
'mem_pass': 'on'
}
try:
# 3. 发送登录请求
response = session.post(login_url, data=payload, headers=headers)
# 4. 检查登录是否成功
if response.status_code == 200:
# 实际需要根据返回内容判断,百度返回的是JSON数据
# 这里只是演示结构
print("登录请求已发送")
print(f"状态码: {response.status_code}")
# 可以检查session中是否包含登录凭证
if 'BDUSS' in session.cookies:
print("登录成功!获取到BDUSS cookie")
return session
else:
print("登录可能失败,未获取到有效凭证")
return None
else:
print(f"请求失败,状态码: {response.status_code}")
return None
except Exception as e:
print(f"登录过程中出错: {e}")
return None
# 使用示例
if __name__ == "__main__":
# 注意:实际使用时需要真实的账号密码
# 由于百度有严格的反爬机制,此代码可能需要调整才能实际使用
test_session = login_baidu("your_username", "your_password")
if test_session:
# 测试访问个人中心页面
test_response = test_session.get("https://www.baidu.com/")
print("可以继续使用session进行其他请求")
重要说明:
- 实际限制:百度有严格的登录保护机制,包括动态token、验证码、行为验证等,直接模拟登录非常困难
- 推荐方案:使用Selenium等浏览器自动化工具处理复杂的登录流程
- 替代方案:如果只是需要访问百度服务,考虑使用官方API或OAuth授权
- 法律合规:确保你的使用方式符合百度服务条款
简单建议: 对于百度这类复杂登录,建议使用浏览器自动化工具或官方API。
300,手把手教代码再送一套微博,一套百度网盘的上传接口。
非常感谢~
有哪位大神或者有相关的文章能分享一下过程吗?感觉很多步骤非内部人士不能够知道啊。
难道只有百度的人才能写百度的爬虫?不觉得可笑吗?
chrome debug 一下,什么都清楚了。

