这是一个用于爬取药品数据并保存到SQLite数据库的爬虫脚本。
pip install -r requirements.txt
python crawler.py
脚本会从 sms1 开始递增爬取,URL固定为 http://drug.ptger.cn/api/details?id=sms123477,body中的id从sms1开始递增。
编辑 crawler.py 中的 main() 函数,修改以下参数:
start_num: 起始数字(默认为1,即从sms1开始)end_num: 结束数字(如果为None则持续爬取直到连续失败10次)max_workers: 线程数(默认10),可以根据网络和服务器性能调整from crawler import DrugCrawler
# 创建爬虫实例
crawler = DrugCrawler(db_path='my_drug_data.db', json_dir='my_json_data')
# 从sms1开始爬取到sms1000,使用20个线程
crawler.crawl_range(
start_num=1,
end_num=1000,
prefix="sms",
max_workers=20
)
# 从sms1开始持续爬取(直到连续失败10次),使用10个线程
crawler.crawl_range(
start_num=1,
end_num=None,
prefix="sms",
max_workers=10
)
数据保存在SQLite数据库中,表结构如下:
id: 自增主键drug_id: 药品ID(唯一)decrypted_data: 解密后的数据created_at: 创建时间数据同时保存在 json_data/ 目录下,每个药品ID生成一个文件:
{drug_id}.json: 解密后的JSON文件(如果解密数据不是有效JSON,则保存为 .txt 文件)例如:
sms1.json - sms1的解密数据sms2.json - sms2的解密数据import sqlite3
conn = sqlite3.connect('drug_data.db')
cursor = conn.cursor()
# 查询所有数据
cursor.execute("SELECT * FROM drug_data")
rows = cursor.fetchall()
# 查询特定ID
cursor.execute("SELECT * FROM drug_data WHERE drug_id = ?", ("sms125821",))
row = cursor.fetchone()
conn.close()
爬虫会自动记录所有失败的ID到 failed_ids.json 文件中,包括:
drug_id: 失败的药品IDreason: 失败原因(如:请求超时、响应错误等)failed_count: 失败次数last_failed_time: 最后失败时间有两种方式重试失败的ID:
方式1:使用独立的重试脚本
python retry_failed.py
方式2:在代码中调用
from crawler import DrugCrawler
crawler = DrugCrawler()
crawler.retry_failed(max_workers=62) # 重试所有失败的ID
重试成功后,失败的ID会自动从失败记录中移除。