logo
0
0
WeChat Login

药品数据爬虫

这是一个用于爬取药品数据并保存到SQLite数据库的爬虫脚本。

功能特点

  • 自动爬取指定范围的药品ID数据
  • AES CBC模式解密(PKCS7填充)
  • 多线程并发爬取,大幅提升爬取速度
  • 数据保存到SQLite数据库
  • 同时保存解密后的JSON文件
  • 失败记录功能:自动记录失败的ID和失败原因
  • 重试功能:可以重新下载失败的ID
  • 支持ID递增爬取
  • 错误处理和线程安全机制

安装依赖

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数据库

数据保存在SQLite数据库中,表结构如下:

  • id: 自增主键
  • drug_id: 药品ID(唯一)
  • decrypted_data: 解密后的数据
  • created_at: 创建时间

JSON文件

数据同时保存在 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: 失败的药品ID
  • reason: 失败原因(如:请求超时、响应错误等)
  • failed_count: 失败次数
  • last_failed_time: 最后失败时间

重试失败的ID

有两种方式重试失败的ID:

方式1:使用独立的重试脚本

python retry_failed.py

方式2:在代码中调用

from crawler import DrugCrawler crawler = DrugCrawler() crawler.retry_failed(max_workers=62) # 重试所有失败的ID

重试成功后,失败的ID会自动从失败记录中移除。

注意事项

  1. 请遵守网站的robots.txt和使用条款
  2. 建议根据服务器性能合理设置线程数(max_workers参数),避免对服务器造成过大压力
  3. 多线程爬取会显著提升速度,但也要注意不要设置过多线程导致被封IP
  4. 如果遇到大量请求失败,可能需要减少线程数或检查网络连接
  5. 请求超时时间已设置为30秒(读取超时),如果仍然超时,可以手动重试失败的ID