一、项目背景
百度网盘作为国内主流的云存储平台,拥有庞大的用户群体和海量的文件资源。对于有批量文件处理需求或希望实现文件自动化管理的用户来说,掌握模拟登录百度网盘并自动化下载文件的技能具有很高的实用性。然而,百度网盘的反爬虫机制较为严格,直接使用常规爬虫手段获取文件存在一定的挑战。因此,本篇文章将深入探讨如何通过 Python 爬虫技术实现模拟登录百度网盘,并结合验证码识别与流程自动化技术完成文件的自动化下载。
二、准备工作
(一)环境与库的安装
- Python :确保本地已安装 Python 3.x 版本。
- Selenium :用于模拟浏览器操作。安装命令为
pip install selenium
。 - ChromeDriver :根据本地 Chrome 浏览器版本下载对应版本的 ChromeDriver,并将其放置在系统路径或指定路径。
- 百度 OCR SDK :用于验证码识别。访问百度 AI 开放平台注册账号并创建应用,获取
API Key
和Secret Key
后,下载对应语言的 SDK 或使用 REST API 接口。 - 其他库 :如
requests
、beautifulsoup4
等,用于辅助的 HTTP 请求和 HTML 解析操作。安装命令分别为pip install requests
和pip install beautifulsoup4
。
(二)目标与思路分析
本次爬虫的目标是模拟登录百度网盘,实现文件的自动化下载。具体思路如下:
- 模拟登录 :通过分析百度网盘的登录流程,模拟浏览器行为,发送登录请求并处理登录过程中的验证码问题,获取登录后的 Cookie 和 Session。
- 验证码识别 :在登录过程中,若遇到验证码,使用百度 OCR 技术进行识别,自动填写验证码并提交。
- 文件下载 :登录成功后,根据指定的文件或文件夹路径,构造下载请求,实现文件的自动化下载。
三、模拟登录
(一)登录流程分析
使用浏览器访问百度网盘,打开开发者工具进行抓包分析,观察登录过程中的请求和响应。百度网盘的登录流程大致如下:
- 获取 Token 和 Pubkey :首先向
https://passport.baidu.com/v2/api/?getapi&...
发送 GET 请求获取token
,然后向https://passport.baidu.com/v2/getpublickey?token=...
发送 GET 请求获取rsakey
和pubkey
。 - 密码加密 :根据获取到的
pubkey
对密码进行加密,并进行 Base64 编码。 - 发送登录请求 :将用户名、加密后的密码以及其他必要参数通过 POST 请求发送到
https://passport.baidu.com/v2/api/?login
,若返回err_no=0
,则登录成功。
(二)代码实现
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
import base64
import json
import requests
from PIL import Image
import io
# 初始化 WebDriver
driver_path = 'path/to/chromedriver' # ChromeDriver 路径
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://pan.baidu.com/')
# 等待页面加载完成
driver.implicitly_wait(10)
# 切换到登录 iframe
driver.switch_to.frame(driver.find_element(By.ID, 'login_frame'))
# 点击账号登录
driver.find_element(By.ID, 'TANGRAM__PSP_4__footerULoginBtn').click()
# 输入用户名和密码
driver.find_element(By.ID, 'TANGRAM__PSP_4__userName').send_keys('your_username') # 替换为你的百度网盘用户名
driver.find_element(By.ID, 'TANGRAM__PSP_4__password').send_keys('your_password') # 替换为你的百度网盘密码
# 检查是否存在验证码
try:
captcha_img = driver.find_element(By.ID, 'TANGRAM__PSP_4__verifyCodeImg')
# 下载验证码图片
captcha_img.screenshot('captcha.png')
# 调用百度 OCR API 识别验证码
def get_access_token():
# 此处为简化示例,实际需根据 API 文档获取
return 'your_access_token'
def ocr_captcha(image_path):
url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic'
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Bearer ' + get_access_token()
}
with open(image_path, 'rb') as f:
img = base64.b64encode(f.read())
params = {
'image': img
}
response = requests.post(url, headers=headers, data=params)
result = json.loads(response.text)
if 'words_result' in result and len(result['words_result']) > 0:
return result['words_result'][0]['words']
else:
return None
captcha_text = ocr_captcha('captcha.png')
print(f"识别的验证码:{captcha_text}")
# 输入验证码
driver.find_element(By.ID, 'TANGRAM__PSP_4__inputVerifyCode').send_keys(captcha_text)
except:
pass
# 点击登录按钮
driver.find_element(By.ID, 'TANGRAM__PSP_4__submit').click()
# 等待登录成功
time.sleep(5)
四、验证码识别
(一)百度 OCR 集成
百度 OCR 提供了强大的文字识别能力,通过调用其 API 可以实现验证码的自动识别。首先需要在百度 AI 开放平台注册账号并创建应用,获取 API Key
和 Secret Key
后,根据 API 文档获取访问接口的 Access Token
。
(二)验证码下载与识别
在登录过程中,若遇到验证码,使用 Selenium 下载验证码图片并保存到本地,然后调用百度 OCR API 进行识别,将识别结果返回并输入到验证码输入框中。
# 下载验证码图片
captcha_img = driver.find_element(By.ID, 'TANGRAM__PSP_4__verifyCodeImg')
captcha_img.screenshot('captcha.png')
# 调用百度 OCR API 识别验证码
def get_access_token():
# 此处为简化示例,实际需根据 API 文档获取
return 'your_access_token'
def ocr_captcha(image_path):
url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic'
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Bearer ' + get_access_token()
}
with open(image_path, 'rb') as f:
img = base64.b64encode(f.read())
params = {
'image': img
}
response = requests.post(url, headers=headers, data=params)
result = json.loads(response.text)
if 'words_result' in result and len(result['words_result']) > 0:
return result['words_result'][0]['words']
else:
return None
captcha_text = ocr_captcha('captcha.png')
print(f"识别的验证码:{captcha_text}")
# 输入验证码
driver.find_element(By.ID, 'TANGRAM__PSP_4__inputVerifyCode').send_keys(captcha_text)
五、文件下载
(一)获取文件列表
登录成功后,通过发送请求获取文件列表。可以通过分析百度网盘的文件列表接口,构造请求参数并发送请求获取文件的相关信息,包括文件名、文件大小、文件路径等。
# 获取文件列表
file_list_url = 'https://pan.baidu.com/api/list'
params = {
'dir': '/your_directory', # 替换为你想要下载文件的目录路径
'web': '1',
'app_id': '250528'
}
headers = {
'Cookie': 'your_cookie' # 替换为你实际获取的 Cookie
}
response = requests.get(file_list_url, headers=headers, params=params)
file_list = response.json()
print(file_list)
(二)下载文件
根据获取到的文件列表,构造下载请求,实现文件的自动化下载。可以通过调用百度网盘的文件下载接口,发送请求并保存文件到本地。
# 下载文件
def download_file(file_id, file_name):
download_url = 'https://pan.baidu.com/share/init'
params = {
'surl': 'your_surl', # 替换为实际的分享链接 surl
'uk': 'your_uk', # 替换为实际的 uk
'shareid': 'your_shareid', # 替换为实际的 shareid
'from': 'your_from', # 替换为实际的 from
'bdstoken': 'your_bdstoken' # 替换为实际的 bdstoken
}
headers = {
'Cookie': 'your_cookie' # 替换为你实际获取的 Cookie
}
response = requests.get(download_url, headers=headers, params=params)
download_link = response.json().get('download_url')
if download_link:
response = requests.get(download_link, headers=headers, stream=True)
if response.status_code == 200:
with open(file_name, 'wb') as f:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
print(f"文件 {file_name} 下载完成")
else:
print(f"文件 {file_name} 下载失败")
else:
print(f"获取文件 {file_name} 的下载链接失败")
# 示例:下载文件列表中的第一个文件
if 'list' in file_list and len(file_list['list']) > 0:
first_file = file_list['list'][0]
download_file(first_file['fs_id'], first_file['server_filename'])
六、流程自动化与异常处理
(一)流程自动化
通过整合上述模拟登录、验证码识别和文件下载的代码,实现整个流程的自动化。可以设置定时任务或触发条件,让程序自动执行文件下载任务,提高工作效率。
# 自动化流程示例
import time
import schedule
def automated_download():
# 模拟登录代码
# ...
# 验证码识别代码
# ...
# 文件下载代码
# ...
# 设置定时任务,每天 8 点执行文件下载任务
schedule.every().day.at("08:00").do(automated_download)
# 运行定时任务
while True:
schedule.run_pending()
time.sleep(60)
(二)异常处理
在实际运行过程中,可能会遇到各种异常情况,如网络请求失败、验证码识别错误、文件下载中断等。需要在代码中添加异常处理机制,确保程序能够稳定运行,并在出现问题时及时进行处理和反馈。
# 异常处理示例
try:
# 模拟登录代码
# ...
# 验证码识别代码
# ...
# 文件下载代码
# ...
except Exception as e:
print(f"程序运行出错:{e}")
# 可以添加错误日志记录、重试机制等代码
七、总结与拓展
(一)总结
本文详细介绍了如何利用 Python 爬虫技术实现模拟登录百度网盘并自动化下载文件的过程。通过分析百度网盘的登录流程,使用 Selenium 模拟浏览器操作,结合百度 OCR 技术进行验证码识别,并构造下载请求实现文件的自动化下载。同时,还介绍了如何进行流程自动化和异常处理,提高程序的稳定性和实用性。
(二)拓展与延伸
- 拓展其他功能 :除了文件下载,可以进一步拓展其他功能,如文件上传、文件夹管理、文件分享等操作,实现更全面的百度网盘自动化管理。
- 优化验证码识别 :尝试使用其他验证码识别技术或结合多种方法提高验证码识别的准确率,如使用深度学习模型进行训练和识别。
- 多账号管理 :实现对多个百度网盘账号的管理和操作,满足团队协作或批量处理的需求。
- 数据处理与分析 :对下载的文件进行进一步的数据处理和分析,挖掘有价值的信息,为决策提供支持。