一、引言:为什么你需要自己的疾病信息库?

你是否遇到过这样的情况:身体突然出现不适,想查相关症状却被搜索引擎的广告和碎片化信息淹没?或者作为医疗从业者,需要快速获取疾病数据却找不到便捷的途径?

在这个信息爆炸但优质内容稀缺的时代,拥有一个自己可控的疾病信息数据库变得尤为重要。它不仅能帮你快速筛选有效信息,还能成为你学习Python爬虫、数据分析的实战项目。

今天,我就来分享一个3步实现的Python疾病信息库构建方案,无需复杂技术,零基础也能上手!

二、准备工作:零基础也能搞定的环境配置

1. 所需工具(附下载链接)

  • Python:3.8+版本(官网下载,推荐3.10)
  • 第三方库:requests(网络请求)、BeautifulSoup4(HTML解析)、pandas(数据处理)、DrissionPage(自动化浏览)、fake_useragent(生成随机用户代理)、tqdm(进度条显示)
  • 浏览器扩展:Cookie-Editor(Cookie-Editor

2. 一键配置环境

为了节省时间,我准备了一个requirements.txt文件,包含所有需要的库。只需执行以下命令即可完成安装:

# 复制下面的命令到命令行执行
pip install -r requirements.txt

没有requirements.txt?没关系,也可以用下面的命令一次性安装:

pip install requests beautifulsoup4 pandas drissionpage fake-useragent tqdm openpyxl

3. 新手贴士

  • 安装Python时记得勾选"Add Python to PATH"
  • 建议使用虚拟环境避免依赖冲突
  • 遇到安装问题可以在评论区留言,我会尽力解答

三、代码实现:3步打造你的疾病信息库

1. 整体架构(附流程图)

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│  爬取疾病列表   │ -> │ 提取详情页链接  │ -> │ 爬取并保存数据  │
│  get_by_letter()│    │ solution_data() │    │ getAllILLNESS() │
└─────────────────┘    └─────────────────┘    └─────────────────┘

我们的程序遵循一个清晰的工作流程:

  1. 爬取疾病列表:按字母顺序获取所有疾病的列表页面
  2. 提取详情链接:从列表页面中解析出每个疾病的详情页URL
  3. 爬取保存数据:访问详情页,提取疾病信息并保存到Excel

2. 核心代码解析

(1)获取cookie并配置(反爬虫第一步)
# 从文件读取cookie - 这是绕过网站登录验证的关键
def get_by_letter():
    # 确保配置文件存在
    if not os.path.exists('config/001.txt'):
        os.makedirs('config',exist_ok=True)
        open('config/001.txt','w',encoding='utf-8').write('')
    
    # 读取cookie信息
    with open('config/001.txt','r',encoding='utf-8') as f:
        txt = f.read()
    if txt=='':
        raise "config/001.txt内容为空,请阅读解释文档后再来运行程序"
        exit()
    
    # 将cookie字符串转换为字典格式
    s = txt.split(';')
    dic = {i.split('=')[0]:i.split('=')[1] for i in s}
    # 后续代码将使用这个cookie字典

技术要点

  • 为什么需要cookie?因为网站需要登录后才能访问完整内容
  • 我们将cookie保存到文件中,避免每次运行都需要重新获取
  • 使用字典格式存储cookie,便于requests库使用
(2)爬取疾病列表(反爬虫第二步)
# 按字母顺序爬取疾病列表页面
def get_by_letter():
    # ... 前面是获取cookie的代码 ...
    
    # 26个字母,每个字母对应一个疾病列表页面
    zimu = 'abcdefghijklmnopqrstuvwxyz'
    # 确保下载目录存在
    if not os.path.exists('download/'):
        os.mkdir('download/')
    
    # 使用tqdm显示进度条
    for i in tqdm(zimu,desc="获取页面"):
        # 构建URL
        url = f'https://jib.xywy.com/html/{i}.html'
        # 设置请求头,模拟浏览器
        headers = {'referer':url}
        headers['user-agent'] = UserAgent().random  # 随机生成用户代理
        
        # 发送请求,带上cookie
        response = requests.get(url, cookies=dic, headers=headers)
        
        # 保存页面内容
        if response.status_code:
            response.encoding = 'gb2312'  # 设置正确的编码
            with open(f'download/{i}.html','w',encoding='utf-8') as f:
                f.write(response.text)
        
        # 随机延时,避免被封IP
        time.sleep(random.randint(1,3))

技术要点

  • 使用fake_useragent生成随机用户代理,避免被识别为爬虫
  • 设置referer请求头,模拟真实浏览器行为
  • 对每个字母页面进行循环爬取,覆盖所有疾病
  • 使用time.sleep添加随机延时,降低爬取频率
  • 使用tqdm库显示进度条,直观了解爬取进度
(3)解析详情页链接(数据提取)
# 从下载的页面中提取疾病详情页链接
def solution_data():
    # 获取下载目录下的所有文件
    file_dir = os.listdir('download')
    result = []
    
    # 遍历每个文件
    for i in tqdm(file_dir,desc='解析文件'):
        # 使用BeautifulSoup解析HTML
        bs = BeautifulSoup(open(f'download/{i}','r',encoding='utf-8'),'html.parser')
        base = 'https://jib.xywy.com'
        
        # 查找所有疾病列表
        uls = bs.find_all('ul',{'class':"ks-zm-list"})
        
        # 提取每个疾病的链接和标题
        a_lst = [[{"href":base+a['href'],"title":a.text.strip()} for a in  ul.find_all('a')] for ul in uls]
        a_links = []
        for i in a_lst:
            a_links.extend(i)
        result.extend(a_links)
    
    # 保存结果到JSON文件
    json.dump(result,open('result.json','w',encoding='utf-8'),indent=2,ensure_ascii=False)

技术要点

  • 使用BeautifulSoup库解析HTML,提取所需信息
  • 通过CSS选择器定位目标元素,精确提取数据
  • 将相对URL转换为绝对URL,方便后续访问
  • 将结果保存为JSON格式,便于后续处理
(3)解析详情页链接
def solution_data():
    file_dir = os.listdir('download')
    result = []
    for i in tqdm(file_dir,desc='解析文件'):
        bs = BeautifulSoup(open(f'download/{i}','r',encoding='utf-8'),'html.parser')
        base = 'https://jib.xywy.com'
        uls = bs.find_all('ul',{'class':"ks-zm-list"})
        a_lst = [[{"href":base+a['href'],"title":a.text.strip()} for a in  ul.find_all('a')] for ul in uls]
        a_links = []
        for i in a_lst:
            a_links.extend(i)
        result.extend(a_links)
    json.dump(result,open('result.json','w',encoding='utf-8'),indent=2,ensure_ascii=False)
(4)爬取疾病详情并保存(自动化终极篇)
# 使用浏览器自动化爬取疾病详细信息并保存
def getAllILLNESS():
    # 配置文件路径
    COOKIES_FILE = 'config/01B.json'
    
    # 检查cookie文件是否存在
    if not os.path.exists(COOKIES_FILE):
        raise "config/01B.json不存在,请阅读解释文档后再来运行程序"
    
    # 设置Excel保存路径
    savePath = 'diseases_data.xlsx'
    
    # 浏览器初始化
    browser = Chromium(ChromiumOptions().set_tmp_path('./tmp'))
    
    # 加载cookies
    # 这部分代码从JSON文件中加载cookie信息到浏览器
    # ... 省略部分代码 ...
    
    # 爬取数据
    findly_result = []
    count = 0
    
    # 读取之前保存的疾病链接数据
    gaishuPage = json.load(open('result.json','r',encoding='utf-8'))
    
    # 遍历每个疾病链接
    for i in tqdm(gaishuPage,desc="获取响应数据"):
        try:
            # 访问疾病详情页
            # ... 省略部分代码 ...
            
            # 采集疾病分类、简介、病因等信息
            # 使用DrissionPage的强大选择器提取数据
            dic = {
                '疾病分类': page.ele('xpath://div[@class="jb-arc-path"]').text.replace('位置:',''),
                'gaishu': page.ele('xpath://div[@class="jb-con-text"]').text,
                'cause': page.ele('xpath://div[@class="jb-xx-wrap"]').text,
                'prevent': page.ele('xpath://div[@class="jb-fg-wrap"]').text,
                'symptom': page.ele('xpath://div[@class="jb-zs-wrap"]').text,
                'treat': page.ele('xpath://div[@class="jb-lc-wrap"]').text,
                'nursing': page.ele('xpath://div[@class="jb-hl-wrap"]').text,
                'food': page.ele('xpath://div[@class="jb-sp-wrap"]').text
            }
            
            # 添加到结果列表
            findly_result.append({"title":i['title'],'data':dic})
            
            # 随机延时,避免被封
            time.sleep(random.uniform(1.5, 3.5))
        except Exception as e:
            print(f"处理 {i['title']} 时出错: {e}")
            continue
    
    # 保存到Excel
    rows = []
    for item in findly_result:
        row = {
            'illname': item['title'],
            '疾病分类': item['data']['疾病分类'],
            'gaishu': item['data']['gaishu'],
            'cause': item['data']['cause'],
            'prevent': item['data']['prevent'],
            'symptom': item['data']['symptom'],
            'treat': item['data']['treat'],
            'nursing': item['data']['nursing'],
            'food': item['data']['food']
        }
        rows.append(row)
    
    # 创建DataFrame并保存
    df = pd.DataFrame(rows)
    df.to_excel(savePath, index=False, sheet_name='疾病信息')
    print(f"数据已保存到 {savePath}")

技术要点

  • 使用DrissionPage库进行浏览器自动化,相比传统爬虫更难被网站识别
  • 通过ChromiumOptions设置临时目录,避免浏览器缓存干扰
  • 使用XPath选择器精确定位元素,提高数据提取准确性
  • 采用random.uniform生成更自然的随机延时,进一步降低被封风险
  • 结构化保存数据到Excel,方便后续分析和查询
  • 完善的异常处理机制,确保程序稳定运行

四、使用步骤:小白也能轻松上手(附详细图解)

1. 准备环境(5分钟)

  • 安装Python 3.8+(勾选"Add Python to PATH")
  • 安装所需库:
    pip install requests beautifulsoup4 pandas drissionpage fake-useragent tqdm openpyxl
    
  • 下载Cookie-Editor扩展到你的浏览器

2. 获取Cookie(3分钟)

  1. 打开目标网站 https://jib.xywy.com/ 并登录
  2. 按F12打开开发者工具
  3. 在控制台输入 copy(document.cookie) 复制Cookie
  4. 将Cookie粘贴到 config/001.txt 文件中
  5. 点击Cookie-Editor扩展
  6. 点击"Export"按钮导出Cookie选择json
  7. 将Cookie保存到config/01B.json文件中

💡 小提示:Cookie有效期有限,过期后需要重新获取,建议运行前都获取一次

3. 运行程序(2分钟)

  • 打开命令行,进入项目目录
  • 运行命令:
    python app.py
    
  • 等待程序运行完成,数据将保存在diseases_data.xlsx文件中

📝 运行过程中会显示进度条,耐心等待即可

五、数据应用场景:这些功能让你的数据库更有价值

1. 个人健康助手

  • 快速查询症状对应的疾病
  • 了解疾病的预防和治疗方法
  • 构建个人健康档案

2. 医疗行业应用

  • 辅助医生快速获取疾病信息
  • 疾病数据统计与分析
  • 医学教学辅助工具

3. 学术研究支持

  • 疾病相关性研究
  • 公共卫生数据分析
  • 医疗资源分配优化

六、注意事项:安全爬虫与法律合规

1. 遵守网站规则

  • 查看网站的robots.txt文件
  • 尊重网站的爬取限制
  • 不要过度消耗网站资源

2. 保护个人隐私

  • 不要爬取或存储个人身份信息
  • 不要将爬取的数据用于非法用途

3. 避免被封IP

  • 控制爬取频率(程序已设置随机延时)
  • 使用代理IP池(高级用户可选)
  • 分时段进行爬取

4. 法律声明

  • 本项目仅供学习交流,请勿用于商业用途
  • 爬取数据前请确保符合相关法律法规
  • 数据使用应遵循伦理道德规范

七、总结:不止是一个疾病信息库

这个项目不仅能帮你构建一个实用的疾病信息数据库,更重要的是,它是一个完整的Python实战项目,涵盖了:

  • 网络请求与爬虫技术
  • 数据解析与提取
  • 数据存储与分析
  • 浏览器自动化

无论你是想学习Python,还是需要一个疾病信息查询工具,这个项目都能满足你的需求。

如果你觉得这篇文章有用,欢迎点赞、收藏、转发支持!有任何问题或建议,也欢迎在评论区留言讨论。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐