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

2024-04-21 13:44

本文主要是介绍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:

 

这篇关于Python爬虫爬取中药材价格数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923222

相关文章

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、