Python爬虫之爬取中药材数据

目录

1.引言

2.目标网站和网页结构分析

3.爬虫框架和工具选择

4.爬虫实现过程详解

5.源码

6.运行效果展示


1.引言

        随着中医药行业的快速发展,中药材数据在中医药研究、药材采购和市场分析等领域变得越来越重要。然而,中药材数据的获取并非易事,传统的方法往往需要大量的人工操作和筛选。此时,Python爬虫技术便成为了获取中药材数据的一种高效、便捷的方法。

        在本文中,我们将介绍如何使用Python爬虫技术来爬取中药材数据。

        通过本文的介绍,读者将了解到Python爬虫技术在中药材数据获取中的应用价值,并掌握如何使用爬虫技术快速获取中药材数据的方法。同时,本文也将为中医药领域的研究者、药材采购商和市场分析人员提供一种高效、便捷的数据获取途径。

        你还可以访问我的主页查看其他文章:

一只程序猿子的CSDN博客主页

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)存储图片数据到本地文件系统

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只程序猿子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值