3步搞定!用Python构建个人疾病知识库,轻松掌握健康信息
Python爬虫实战:3步构建疾病信息库 本文介绍了一个零基础可上手的Python爬虫项目,通过3个步骤构建个人疾病信息数据库: 环境配置:安装Python3.8+及requests、BeautifulSoup等库,使用Cookie-Editor浏览器插件获取登录凭证 爬取流程:先按字母顺序获取疾病列表页,解析详情页链接,再访问详情页提取疾病数据 技术要点:包含cookie管理、随机UserAge
一、引言:为什么你需要自己的疾病信息库?
你是否遇到过这样的情况:身体突然出现不适,想查相关症状却被搜索引擎的广告和碎片化信息淹没?或者作为医疗从业者,需要快速获取疾病数据却找不到便捷的途径?
在这个信息爆炸但优质内容稀缺的时代,拥有一个自己可控的疾病信息数据库变得尤为重要。它不仅能帮你快速筛选有效信息,还能成为你学习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() │
└─────────────────┘ └─────────────────┘ └─────────────────┘
我们的程序遵循一个清晰的工作流程:
- 爬取疾病列表:按字母顺序获取所有疾病的列表页面
- 提取详情链接:从列表页面中解析出每个疾病的详情页URL
- 爬取保存数据:访问详情页,提取疾病信息并保存到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分钟)
- 打开目标网站 https://jib.xywy.com/ 并登录
- 按F12打开开发者工具
- 在控制台输入
copy(document.cookie)复制Cookie - 将Cookie粘贴到
config/001.txt文件中 - 点击Cookie-Editor扩展
- 点击"Export"按钮导出Cookie选择json
- 将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,还是需要一个疾病信息查询工具,这个项目都能满足你的需求。
如果你觉得这篇文章有用,欢迎点赞、收藏、转发支持!有任何问题或建议,也欢迎在评论区留言讨论。
更多推荐
所有评论(0)