Python爬虫爬取中药材价格数据

🎈 博主:一只程序猿子

🎈 博客主页:一只程序猿子 博客主页

🎈 个人介绍:爱好(bushi)编程!

🎈 创作不易:喜欢的话麻烦您点个👍和

🎈 欢迎访问我的主页(点我直达)

🎈 除此之外您还可以通过个人名片联系我

额滴名片儿

目录

1.介绍

2.网页分析

(1)市场价格数据

(2)药材历史价格数据

3.设计

(1)数据库设计

(2)代码结构

4.源码

5.测试


1.介绍

        本文将介绍如何编写Python爬虫,从中药材天地网,爬取中药材的市场价格某几种中药材的历史价格数据,在下一篇文章中我们将根据这些数据,做一个简单的基于Flask的中药材价格数据分析与可视化系统。

2.网页分析

(1)市场价格数据

        其中我们需要获取到的市场价格数据来自如下图片标示的位置:

        在页面底部有翻页按钮:

         再看看数据在html中的位置:

        首先可以看到表格的表头在文件中的位置。

        这是表格数据的位置:

         这是翻页按钮的位置:

         这里可以很容易发现规律,既翻页是通过修改url的最后一位数字实现的。

(2)药材历史价格数据

        这里我们偷懒,只爬取四种中药材的历史价格数据,分别是白术、麦冬、川芎和白芍。

        我们只爬取这四种药材在亳州药市,规格一的历史价格数据。

         现在我们看下数据是怎么获取的 :

通过开发者工具中的网络,很容易发现这个页面是一个动态页面,数据并不能在html中直接获取。

我们来抓下包看看: 

         很容易我们找到了我们想要的数据:

        看一下请求头和需要什么参数:

 

         然后可以找到mid从哪获取的:

         再看一下它的请求头和参数:

        因为我们只爬取四种中药材的历史价格,所以我们手动找到这四种中药材的MBID和MAreaID即可:

3.设计

(1)数据库设计

        总共设计了两张表,marketprice表用来存储药材的市场价格数据,historicalprice表用来存储四种药材的历史价格数据。

        表结构如下:

(2)代码结构

4.源码

db_helper.py:

import pymysql"""数据库操作"""class DBHelper(object):def __init__(self):pymysql.version_info = (1, 4, 13, "final", 0)  # 必须有这个不然会报版本不对错误pymysql.install_as_MySQLdb()  # 使用pymysql代替mysqldb连接数据库# 建立数据库连接self.conn = pymysql.connect(host="127.0.0.1",port=3306,user="用户名",passwd="密码",db="zhongyaoprice_demo")# 通过 cursor() 创建游标对象,并让查询结果以字典格式输出self.cur = self.conn.cursor(cursor=pymysql.cursors.DictCursor)def __del__(self):  # 对象资源被释放时触发,在对象即将被删除时的最后操作# 关闭游标self.cur.close()# 关闭数据库连接self.conn.close()def select_db(self, sql):"""查询"""# 使用 execute() 执行sqlself.cur.execute(sql)# 使用 fetchall() 获取查询结果data = self.cur.fetchall()return datadef execute_db(self, sql):"""更新/插入/删除"""try:# 使用 execute() 执行sqlself.cur.execute(sql)# 提交事务self.conn.commit()except Exception as e:print("操作出现错误:{}".format(e))# 回滚所有更改self.conn.rollback()def execute_db_ex(self, sql, params):"""更新/插入/删除"""try:# 使用 execute() 执行sqlself.cur.execute(sql, params)# 提交事务self.conn.commit()except Exception as e:print("操作出现错误:{}".format(e))# 回滚所有更改self.conn.rollback()def save_market_price(self, zhongyao):"""查找或者保存中药材市场价格"""select_sql_temp = "select * from marketprice where name = '%s' and spec = '%s'" % (zhongyao[0], zhongyao[1])result = self.select_db(select_sql_temp)if result is None or len(result) == 0:self.execute_db_ex("insert into marketprice (name, spec, market, recentprice, tendency, ""weeklyfluctuation, monthlyfluctuation, yearlyfluctuation)"" values (%s,%s,%s,%s,%s,%s,%s,%s) ",(zhongyao[0], zhongyao[1], zhongyao[2], zhongyao[3], zhongyao[4], zhongyao[5],zhongyao[6], zhongyao[7]))print(f'中药材:{zhongyao[0]},规格:{zhongyao[1]} 的市场价格信息保存成功!!!')else:print(f'该规格的中药材:{zhongyao[0]} 的市场价格信息已在数据库存在!!!')def save_historical_price(self, prices_info):"""查找或者保存中药材历史价格"""select_sql_temp = "select * from historicalprice where name = '%s' and spec = '%s'" % (prices_info[0], prices_info[1])result = self.select_db(select_sql_temp)if result is None or len(result) == 0:self.execute_db_ex("insert into historicalprice (name, spec, market, prices)"" values (%s,%s,%s,%s) ",(prices_info[0], prices_info[1], '亳州药市', prices_info[2]))print(f'中药材:{prices_info[0]},规格:{prices_info[1]} 的历史价格信息保存成功!!!')else:print(f'该规格的中药材:{prices_info[0]} 的历史价格信息已在数据库存在!!!')

settings.py:

HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Cache-Control': 'max-age=0','Connection': 'keep-alive','Sec-Fetch-Dest': 'document','Sec-Fetch-Mode': 'navigate','Sec-Fetch-Site': 'none','Sec-Fetch-User': '?1','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0','sec-ch-ua': '"Microsoft Edge";v="123", "Not:A-Brand";v="8", "Chromium";v="123"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"',
}COOKIES = {'FromsAuthByDbCookie_zytd_Edwin.PrvGuest': '1c1uuuuuuuuuuaI98Rb8c9916R6R18a8U1da851Rd59Ud4S49c40o5qqnc78ca99o698qac9nadmoll5moad015','Hm_lvt_ba57c22d7489f31017e84ef9304f89ec': '1713054805,1713141612','Hm_lpvt_ba57c22d7489f31017e84ef9304f89ec': '1713143695',
}

spider.py:

if __name__ == '__main__':for i in range(1, 31):url = f'https://www.zyctd.com/jiage/1-0-341699-{i}.html'print(f'开始爬取第 {i} 页!')get_market_price(url)if i < 30:print('休息两秒然后继续')else:print('爬取完毕,再见!')time.sleep(2)# 分别对应了白术,麦冬,川芎, 白芍的历史价格请求参数items = [{'name': '白术', 'MBID': 34, 'MAreaID': 341699},{'name': '麦冬', 'MBID': 396, 'MAreaID': 341699},{'name': '川芎', 'MBID': 102, 'MAreaID': 341699},{'name': '白芍', 'MBID': 32, 'MAreaID': 341699}]get_historical_price(items)

        篇幅有限,spider.py我只在此展示了部分源码,可以通过文章底部个人名片联系我获取完整代码! 

5.测试

        运行spider.py:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 全排列(难度⭐⭐)(62)

1. 题目解析 题目链接&#xff1a;46. 全排列 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。当候选解被确认不是一个解&#xff08;或者至少不是最后一…

欢迎 Llama 3:Meta 的新一代开源大语言模型

介绍 Meta 公司的 Llama 3 是开放获取的 Llama 系列的最新版本&#xff0c;现已在 Hugging Face 平台发布。看到 Meta 持续致力于开放 AI 领域的发展令人振奋&#xff0c;我们也非常高兴地全力支持此次发布&#xff0c;并实现了与 Hugging Face 生态系统的深度集成。 Llama 3 提…

包装类的认识

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

Linux CPU火焰图

Linux CPU火焰图 1、火焰图简介 火焰图&#xff08;Flame Graph&#xff09;是一种强大的性的性能分析工具&#xff0c;专门用于可视化cpu时间消耗咋各个函数栈上的情况&#xff0c;可以很快帮助开发这识别程序中的性能瓶颈和热点函数&#xff0c;从而有效的进行程序优化&…

网络编程 -- 简易TCP网络程序

一 字符串回响 1.1 核心功能 字符串回响程序类似于 echo 指令&#xff0c;客户端向服务器发送消息&#xff0c;服务器在收到消息后会将消息发送给客户端&#xff0c;该程序实现起来比较简单&#xff0c;同时能很好的体现 socket 套接字编程的流程。 1.2 程序结构 这个程序我们…

基于Zookeeper 简单实现分布式任务协调组件

优质博文&#xff1a;IT-BLOG-CN 一、什么是 Zookeeper ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。 它是一个为分布式应用提供一致性服务的软件&#xff0c;提…

【管理】杨三角模型

企业成功 成功 战略 X 组织能力 1&#xff09;组织能力对于企业的重要性是和战略一样的&#xff1b; 2&#xff09;组织能力必须与战略适配&#xff0c;才能共同造就企业的成功。 员工思维&#xff1a;员工愿不愿意参与战略落地的实践&#xff1f;员工每天所关心、追求和重视的…

【C++】哈希封装map与set

目录 前言&#xff1a; 一&#xff0c;底层哈希结构 1-1&#xff0c;迭代器的封装 1-2&#xff0c;哈希表的封装 二&#xff0c;unordered_map的封装 三&#xff0c;unordered_set的封装 前言&#xff1a; 上一篇文章说明了哈希结构&#xff0c;这一篇文章来说明如何使用…

安装WSL2

PS C:\Users\pc> wsl --set-default-version 2 有关与 WSL 2 关键区别的信息&#xff0c;请访问 https://aka.ms/wsl2操作成功完成。PS C:\Users\pc> wsl --update 正在检查更新。 已安装最新版本的适用于 Linux 的 Windows 子系统。PS C:\Users\pc> wsl --shutdownPS…

PyTorch深度解析:Tensor——神经网络的核心构建块

在深度学习和神经网络的研究与应用中&#xff0c;Tensor&#xff08;张量&#xff09;无疑是一个核心概念。特别是在PyTorch这一强大的深度学习框架中&#xff0c;Tensor更是扮演了举足轻重的角色。本文将深入探讨PyTorch中的Tensor&#xff0c;从其基本定义、特性、操作到实际…

回溯算法练习day.3

39.组合总和 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返…

uniapp Android 插件开发教程

一、下载uniapp提供的SDK Android 离线SDK - 正式版 | uni小程序SDK 二、在uniapp创建一个项目 查看包名&#xff1a;发行--> 原生app 云打包 三、进入dcloud官网 开发者中心 进入 应用管理 --> 我的应用 --> 点击应用名称-->各平台信息-->新增 这里需要这…

每日三个JAVA经典面试题(四十三)

1.如何在大数据环境下优化Java性能&#xff1f; 在大数据环境下优化Java性能涉及多个方面&#xff0c;包括调整JVM设置、代码优化和选择合适的工具和框架。以下是一些具体的优化建议&#xff1a; 调整JVM参数&#xff1a; 增加堆内存&#xff1a;通过调整-Xms&#xff08;堆起…

SQLite FTS3 和 FTS4 扩展(三十二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS5 扩展&#xff08;三十&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 概述 FTS3 和 FTS4 是 SQLite 虚拟表模块&#xff0c;允许用户执行 对一组文档进行全文搜索。最常见&#xff08;和最…

paddle.net怎么付款?paddle.net怎么订阅?

有需要的小伙伴可以使用Fomepay的卡进行订阅支付&#xff0c;我这里使用的是491090卡段&#xff0c;开卡步骤很简单&#xff0c;点击获取卡片 1、注册 2、填写姓名使用拼音或者英文名都可以 3、支付宝或者微信支付

【22.1】【22.2】【22.3】

【题解/标程】2022牛客寒假算法基础集训营 1 题解标程 【题解】2022牛客寒假算法基础集训营2 【题解】2022牛客寒假算法基础集训营3 九小时九个人九扇门 思路&#xff1a;数字根。知道后 f ( x y ) f ( f ( x ) f ( y ) ) f(xy)f(f(x)f(y)) f(xy)f(f(x)f(y)) &#xff…

● State Schema Evolution的平滑迁移策略

State Schema Evolution指的是在分布式系统或数据库中&#xff0c;随着业务需求的发展和变化&#xff0c;需要对存储的状态&#xff08;如数据库表结构、数据模型等&#xff09;进行升级或调整的过程。平滑迁移策略的目标是在不影响系统正常运行、尽量减少服务中断时间的前提下…

基于51单片机的数字万用表设计

基于51单片机的数字万用表设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.能够切换测量电压、电流、电阻&#xff1b; 2.数码管实时显示测量值&#xff1b; 3.短路报警&#xff1b; 4.测量…

Vue.extend()和我的两米大砍刀

Vue.extends是什么&#xff1f; 一个全局API,用于注册并挂载组件。 传统的引用组件的方式是使用import直接引入&#xff0c;但是使用Vue.extends()也可以实现。 使用规则 <div id"mount-point"></div>// 创建构造器 var Profile Vue.extend({templat…