目录
1.引言
随着中医药行业的快速发展,中药材数据在中医药研究、药材采购和市场分析等领域变得越来越重要。然而,中药材数据的获取并非易事,传统的方法往往需要大量的人工操作和筛选。此时,Python爬虫技术便成为了获取中药材数据的一种高效、便捷的方法。
在本文中,我们将介绍如何使用Python爬虫技术来爬取中药材数据。
通过本文的介绍,读者将了解到Python爬虫技术在中药材数据获取中的应用价值,并掌握如何使用爬虫技术快速获取中药材数据的方法。同时,本文也将为中医药领域的研究者、药材采购商和市场分析人员提供一种高效、便捷的数据获取途径。
你还可以访问我的主页查看其他文章:
2.目标网站和网页结构分析
目标网站: http://www.zhongyoo.com
网页结构分析:
(1)可以看到每页展示20个中药材,共有40余页,首先我们需要找到每页的URL:
(2) 找到一个页面里的中药材信息的位置,这里我们可以获取到各中药材的详细信息URL和图片URL:
(3)在该页面可以找到该中药的详细信息:
可以看到,目标网站我们需要获取的数据均在HTML页面上,是一个典型的静态网页。
3.爬虫框架和工具选择
这里我们使用python的requests库对目标网站发送请求,使用lxml解析html页面!
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
4.爬虫实现过程详解
(1)发送请求,获取所有页面的URL
(2)遍历需要访问的页面,获取该页面内的所有中药材的图片URL和详情URL
(3)向图片URL发送请求下载图片到本地,向详情URL发送请求,获取中药材的详情信息。
5.源码
由于篇幅有限,这里只展示部分源码,全部源码或根据要求定制可以私信我!
zhongyao_spider.py
import re
import requests
import random
from lxml import html
from settings import User_Agents
from util import Util
class ChineseMedicineSpider(object):
def __init__(self):
self.headers = {'User-Agent': random.choice(User_Agents)}
# 启动爬虫
def run_spider(self):
pages = int(input('请输入需要爬取的页数:(小于或等于45)'))
if pages >=0 and pages <= 45:
print('爬虫开始运行!!!')
self.get_chinese_medicine(pages)
print('爬虫运行结束!!!')
else:
print("输入无效!!!")
def get_chinese_medicine(self ,pages):
for page in range(1, pages+1):
url = f'http://www.zhongyoo.com/name/page_{page}.html'
# print(url)
resp = requests.get(url, self.headers)
if resp.status_code == 200:
# print(resp.content.decode('gbk'))
tree = html.fromstring(resp.content.decode('gbk'))
zy_name_list = tree.xpath('//div[@class="sp"]/span/a/img/@alt') # 匹配到中药材的名字
zy_imge_list = tree.xpath('//div[@class="sp"]/span/a/img/@src') # 匹配到中药材的图片url
zy_info_list = tree.xpath('//div[@class="sp"]/span/a/@href') # 选取该页全部的中药的详情页url
i = 0
for zy_name in zy_name_list:
chinese_medicine = {} # 创建一个存放中药材信息的字典
chinese_medicine['name'] = zy_name
print(zy_name)
imge_url = zy_imge_list[i]
print(zy_imge_list[i])
self.get_chinese_medicine_imge(imge_url, chinese_medicine)
info_url = zy_info_list[i]
self.get_chinese_medicine_info(info_url, chinese_medicine)
i += 1
for key, value in chinese_medicine.items():
print(f'Key: {key}, Value: {value}')
else:
print("响应结果为空")
def get_chinese_medicine_imge(self,imge_url, chinese_medicine):
imge_data = requests.get(imge_url, self.headers)
if imge_data.status_code == 200 :
imge = imge_data.content
imge_name = f'{Util().getCurrentTimeRandom()}.jpg'
with open(f'data/imge/{imge_name}', 'wb') as f:
f.write(imge)
chinese_medicine['imge'] = imge_name
# 随机休眠
Util().getRandomSleep()
def get_chinese_medicine_info(self, info_url, chinese_medicine):
# 发送请求
resp = requests.get(info_url, self.headers).content.decode('gbk')
# 匹配<p></p>和<p></p>中间的全部内容
pattern = r'<p></p>([\s\S]*?)<p></p>'
match = re.search(pattern, resp)
if match:
# print(match.group(1))
# 正则表达式 < [ ^ >]+ > 匹配HTML标签及其内容,并将其替换为空字符串,从而实现了去除HTML标签和标签中内容的效果
text = re.sub(r"<[^>]+>", "", match.group(1))
# 去除【前的空格
text = re.sub(r"\s+【", "\n【", text)
# 去除开头空白行
text = re.sub(r"^\s*", "", text)
# 去除相关推荐文章
text = re.sub(r"相关推荐文章.*", "", text, flags=re.DOTALL)
# 去除结尾空白行
info = re.sub(r"\s*$", "", text)
# 把爬取到的详细信息存入到字典
chinese_medicine['info'] = info
else:
# print('暂无详细信息')
chinese_medicine['info'] = "暂无详细信息,请等待管理员添加!"
if __name__ == '__main__':
zy = ChineseMedicineSpider()
zy.run_spider()
6.运行效果展示
(1)控制台输出
可以看到中药材数据被打印到控制台:
(2)存储数据到MySQL数据库
这是我写的另一个版本(根据中药材的功效类别进行分类)然后把数据存储到数据库,这个版本并没有实现把数据存储到数据库:
(3)存储图片数据到本地文件系统