爬取北京新发地当天货物信息并展示十五天价格变化(三)---获取物品十五天内的价格

。。。。。。。。。。。。。。。。。。。。。。

  • 1.网页请求一下内容
  • 2.通过爬虫进行请求
  • 3.获取商品十五天详细数据并绘制折线图
  • 4.项目详细代码

1.网页请求一下内容

在这里插入图片描述

通过抓包我们发现一共七个参数
limit: 20                                           # 一页多少数据
current: 1                                         #第几页
pubDateStartTime: 2023/09/12       # 开始时间
pubDateEndTime: 2023/09/27          #结束时间
prodPcatid: 
prodCatid: 
prodName: 大白菜                           #名称

2.通过爬虫进行请求

首先我们获取十五天里这个货物一共有多少件

#name是由商品名-规格-产地组合而成
def xlx(name):                                  #用来获取名字为name的商品十五天内该货物共有多少条数据#name='白虾(精品)-21到24头并且活-'data = {'limit': '1','current': '1','pubDateStartTime': f'{s15}',#自定义的时间'pubDateEndTime': f'{end}',#自定义的时间'prodPcatid': '','prodCatid': '','prodName': name.split('-')[0],}count=requests.post(url, data=data).json()['count']p(name,count)#将名称和数量传入p函数

3.获取商品十五天详细数据并绘制折线图

def p(name,count):data = {'limit': f'{count}','current': '1','pubDateStartTime': f'{s15}','pubDateEndTime': f'{end}','prodPcatid': '','prodCatid': '','prodName': '',}data['prodName']=name.split('-')[0]res=requests.post(url='http://www.xinfadi.com.cn/getPriceData.html',data=data).json()class_=res['list'][0]['prodCat']res=res['list']pricelow=[]pricemax=[]time_list=[]for i in res:if i['prodName']==name.split('-')[0]:#sg=i['specInfo']s = i['specInfo'].replace('<', '小于')#对字符串进行处理替换特殊字符s = s.replace('>', '大于')s = s.replace('/', '并且')s = s.replace('-', '到')s = s.replace('\\', '或者')if s==name.split('-')[1]:
#画图if i['place']==name.split('-')[2]:pricemax.append(i['highPrice'])pricelow.append(i['lowPrice'])n=str(i['pubDate']).split(' ')[0].split('-')[1:]time_list.append(n[0]+'.'+n[1])pricelow.reverse()pricemax.reverse()time_list.reverse()print(name)plt.figure(figsize=(20, 10), dpi=100)plt.plot(time_list, pricelow)plt.savefig(fr'./类别/{class_}/价格趋势图/{name}.jpg')plt.close()with open(f'./类别/{class_}/价格文档/{name}.txt', 'w') as fp:fp.write(' '.join(time_list)+'\n'+' '.join(pricemax)+'\n'+' '.join(pricelow))time.sleep(1)

4.项目详细代码

import matplotlib
import requests
import datetime
from multiprocessing.dummy import Pool
from matplotlib import pyplot as plt
import os
import shutil
import time
matplotlib.use('agg')def RemoveDir(filepath):    #用来删除文件夹中的所有内容'''如果文件夹不存在就创建,如果文件存在就清空!'''if not os.path.exists(filepath):os.mkdir(filepath)else:shutil.rmtree(filepath)os.mkdir(filepath)def count(url,data):res = requests.post(url, data=data)num = res.json()['count']return numdef xlx(name):                                  #用来获取名字为name的商品十五天内该货物共有多少条数据#name='白虾(精品)-21到24头并且活-'data = {'limit': '1','current': '1','pubDateStartTime': f'{s15}','pubDateEndTime': f'{end}','prodPcatid': '','prodCatid': '','prodName': name.split('-')[0],}count=requests.post(url, data=data).json()['count']p(name,count)#print(name)#print(count)#将名称和数据的数量传给p函数def p(name,count):data = {'limit': f'{count}','current': '1','pubDateStartTime': f'{s15}','pubDateEndTime': f'{end}','prodPcatid': '','prodCatid': '','prodName': '',}data['prodName']=name.split('-')[0]res=requests.post(url='http://www.xinfadi.com.cn/getPriceData.html',data=data).json()class_=res['list'][0]['prodCat']res=res['list']pricelow=[]pricemax=[]time_list=[]for i in res:if i['prodName']==name.split('-')[0]:#sg=i['specInfo']s = i['specInfo'].replace('<', '小于')s = s.replace('>', '大于')s = s.replace('/', '并且')s = s.replace('-', '到')s = s.replace('\\', '或者')if s==name.split('-')[1]:if i['place']==name.split('-')[2]:pricemax.append(i['highPrice'])pricelow.append(i['lowPrice'])n=str(i['pubDate']).split(' ')[0].split('-')[1:]time_list.append(n[0]+'.'+n[1])pricelow.reverse()pricemax.reverse()time_list.reverse()print(name)plt.figure(figsize=(20, 10), dpi=100)plt.plot(time_list, pricelow)plt.savefig(fr'./类别/{class_}/价格趋势图/{name}.jpg')plt.close()with open(f'./类别/{class_}/价格文档/{name}.txt', 'w') as fp:fp.write(' '.join(time_list)+'\n'+' '.join(pricemax)+'\n'+' '.join(pricelow))time.sleep(1)def filetxt(filename):namelist=[]file = open(filename, "r", encoding="GBK")file = file.readlines()for line in file:line = line.strip('\n')namelist.append(line)return namelistclass_list=['水产','水果','粮油','肉禽蛋','蔬菜','调料','豆制品'] #所有的主类别
for i in class_list:                                        #重置类别文件with open(f'./类别/{i}/今日类别.txt', 'w') as fp:fp.write('')RemoveDir(f'./类别/{i}/价格文档')RemoveDir(f'./类别/{i}/价格趋势图')url='http://www.xinfadi.com.cn/getPriceData.html'           #主页面urltoday = datetime.date.today()                              #获取当前日期
yesterday = str(today - datetime.timedelta(days=1))  #获取今天往前十五天的日期 吧
s15=str(today - datetime.timedelta(days=15))
today=str(today)
enddata_list=today.split('-')
start_list=yesterday.split('-') #去掉日期后面的时分秒
s15=s15.split('-')
end=enddata_list[0]+'/'+enddata_list[1]+'/'+enddata_list[2]#将日期格式转换为我们data需要的格式
start=start_list[0]+'/'+start_list[1]+'/'+start_list[2]
s15=s15[0]+'/'+s15[1]+'/'+s15[2]
data={'limit': '1','current': '1','pubDateStartTime': start,'pubDateEndTime': end,'prodPcatid':'' ,'prodCatid': '','prodName':'' ,}                                                            #获取当天所有交易货物的data
res = requests.post(url, data=data)                              #发送post请求#提取出共有多少种货物
data['limit']=res.json()['count']                               #将data中的limit设置为货物总数就可以一次请求全部获取
res=requests.post(url,data=data).json()                            #获取到当天所有货物的产地型号等详细数据data=res['list']for i in data:                                                #循环便利每一种货物prodCat=i['prodCat']#提取出当前货物的类别s=i['specInfo'].replace('<','小于')s=s.replace('>','大于')s=s.replace('/','并且')s = s.replace('-', '到')s = s.replace('\\', '或者')name=i['prodName']+'-'+s+'-'+i['place']          #将货物的名字定为    物品名-型号-产地with open(f'./类别/{prodCat}/今日类别.txt', 'a+') as fp:       #按照类别将其保存到所属的主类文件夹中fp.write(name+'\n')                                      #写入数据每个数据一行for i in class_list:                                        #循环所有主类取出其中所有的货物名称filename=f'./类别/{i}/今日类别.txt'name_list=filetxt(filename)if name_list!=[]:#判断是否为空pool = Pool(3)                                     #开启线程池# 定义循环数origin_num = [x for x in name_list]                #每一个货物开启一个线程# 利用map让线程池中的所有线程‘同时’执行calc_power2函数pool.map(xlx, origin_num)

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

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

相关文章

JPA的注解@Field指定为Keyword失败,导致查询不到数据

一、背景 使用 jpa 对es操作&#xff0c;查询条件不生效&#xff0c;需求是批量查询课程编号。说白了&#xff0c;就是一个In集合的查询。在es里&#xff0c;如果是精准匹配是termQuery&#xff0c;比如&#xff1a; queryBuilder.filter(QueryBuilders.termQuery(“schoolId…

C++ placement new使用

placement new重载来原来的operator new&#xff0c;且placement new不能被即需重载 placement new是在原有的一块地址上继续创建一个对象&#xff0c;注意对象类型要一致&#xff0c;这样的操作的优势有两个&#xff1a; 1、不用花时间在找合适的空间存放新对象&#xff0c;…

华为云云耀云服务器L实例评测|使用华为云耀云服务器L实例的CentOS部署Docker并运行Tomcat应用

目录 前言 步骤1&#xff1a;登录到华为云耀云服务器L实例 步骤2&#xff1a;安装Docker 并验证Docker安装 步骤3&#xff1a;拉取Tomcat镜像并运行Tomcat容器 步骤4&#xff1a;放行8080端口 步骤5&#xff1a;访问tomcat 步骤6&#xff1a;管理Tomcat容器 小结 前言 …

【QT+CUDA】QT中使用cuda,QT+VS+cuda下载安装配置

文章目录 相关网址汇总&#xff1a; 一、软件安装&#xff1a;VS、CUDA、QT1 安装VS1.1 下载1.2 vs2017安装1.3 vs2015安装 2 安装CUDA2.1 下载2.2 安装2.3 测试2.4 卸载 3 安装QT3.1 下载3.2 安装 二、QT使用cuda1 .pro文件 三、常用操作1 NVIDIA控制面板&#xff1a;显卡、驱…

数据分析技能点-正态分布和其他变量分布

在数据驱动的世界里,了解和解释数据分布是至关重要的。不同类型的数据分布,如正态分布、二项分布和泊松分布,具有不同的特性和应用场景。这些分布不仅在统计学和数据科学中有广泛应用,而且在日常生活和商业决策中也起着关键作用。 文章目录 正态分布正态分布和偏差其他常见…

如何快速搭建一个react项目?如何使用react脚手架快速搭建项目?

如何使用react脚手架快速搭建项目&#xff1f; 一、前提 电脑已经安装了node和npm环境。 react文档中要求Node > 8.10 和 npm > 5.6&#xff0c;查看版本&#xff1a;node -v&#xff1b;npm -v&#xff1b; 二、步骤 1、在合适的文件夹中打开命令行窗口cmd 2、全局安…

【设计模式】六、建造者模式

文章目录 需求介绍角色应用实例建造者模式在 JDK 的应用和源码分析java.lang.StringBuilder 中的建造者模式 建造者模式的注意事项和细节 需求 需要建房子&#xff1a;这一过程为打桩、砌墙、封顶房子有各种各样的&#xff0c;比如普通房&#xff0c;高楼&#xff0c;别墅&…

C语言进阶---动态内存管理

动态内存管理 前言&#xff1a;一、为什么存在动态内存分配&#xff1f;二、动态内存函数的介绍1.数据在不同区域的储存&#xff1a;2、malloc和free3、calloc4、realloc 三、常见的动态内存错误1、对NULL指针的解引用操作2、对动态开辟空间的越界访问3、对非动态内存开辟的空间…

C# 集合

C# 集合 集合集合接口和类型列表队列栈链表有序表字典LoopupHashSet位数组 集合 数组的大小是固定的。如果元素个数是动态的&#xff0c;就应使用集合类。List 和 ArrayList 是与数组相当的集合类。还有其他类型的集合&#xff1a;队列、栈、链表和字典。 集合接口和类型 集…

无线振弦采集仪在岩土工程安全监测中优化成本支出

无线振弦采集仪在岩土工程安全监测中优化成本支出 随着城市的快速发展以及建筑业的不断壮大&#xff0c;岩土工程的安全监测变得越来越重要。在岩土工程中&#xff0c;振弦是一种重要的监测手段&#xff0c;可以有效地评估土体的力学性质和变形情况。因此&#xff0c;无线振弦…

一文了解VR全景在城市园区和电子楼书的应用

引言&#xff1a; 虚拟现实&#xff08;VR&#xff09;技术在日常生活中越发普及&#xff0c;已经成为众多行业的宣传工具&#xff0c;房地产行业近些年来热度较低&#xff0c;VR全景为房地产展示带来了新方式&#xff0c;为购房者提供更真实、更直观的体验。 一&#xff0e;…

康耐视visionpro脚本CogRectangleAffine ,CogPolygon图形限定框,边界显示(划痕缺陷案例分享)

目录 1.划痕缺陷整体方案设计:2.测试一效果图:3.测试一脚本编写​:4.测试二效果图:5.测试二脚本编写:6.测试三效果图:7.​测试三脚本编写:测试版本:康耐视visionpro9.0 1.划痕缺陷整体方案设计: 2.测试一效果图: 3.测试一脚本编写​: CogRectangleAffine Rectangle…

Spring Boot 如何使用Liquibase 进行数据库迁移

在现代的应用程序开发中&#xff0c;数据库迁移是一个不可或缺的环节。它使开发人员能够有效地管理数据库模式的变化&#xff0c;确保应用程序与数据库之间的一致性。Liquibase 是一个流行的开源工具&#xff0c;用于管理数据库的版本控制和迁移。本文将介绍如何在Spring Boot应…

网络安全攻防:软件逆向之反汇编

网络安全是当今社会中一个非常重要的问题&#xff0c;而软件逆向工程是网络安全攻防中常用的一种技术手段。在软件逆向工程中&#xff0c;反汇编是一种基础而重要的技术。通过反汇编&#xff0c;我们可以将二进制程序转换为汇编语言&#xff0c;从而更好地理解程序的执行流程和…

go语言 rune 类型

ASCII 码只需要 7 bit 就能完整地表示&#xff0c;但只能表示英文字母在内的 128 个字符&#xff0c;为了表示世界上大部分的文字系统&#xff0c;发明了 Unicode &#xff0c;它是 ASCII 的超集&#xff0c;包含世界上书写系统中存在的所有字符&#xff0c;并且为每个代码分配…

mysql事务测试

mysql的事务处理主要有两种方法1、用begin,rollback,commit来实现 begin; -- 开始一个事务 rollback; -- 事务回滚 commit; -- 事务提交 2、直接用set来改变mysql的自动提交模式 mysql默认是自动提交的&#xff0c;也就是你提交一个sql&#xff0c;它就直接执行&#xff01;我…

react import爆红

如上所示&#xff0c;会标红&#xff0c; 解决办法&#xff1a;在vscode内部SHiftCtrlP 输入Reload window, 如上的第一个&#xff0c;选中后回车&#xff0c;标红就没了&#xff0c;非常好用。

为您的视频编辑应用添加动力,美摄视频剪辑SDK

在当今的数字化时代&#xff0c;视频已经成为了最受欢迎的媒体形式之一。无论是社交媒体平台&#xff0c;还是在线教学站点&#xff0c;甚至是商业广告&#xff0c;都离不开视频的支持。而在这个领域&#xff0c;美摄视频剪辑SDK无疑是您的最佳选择。它不仅功能强大&#xff0c…

【2023集创赛】芯原杯一等奖作品:基于芯原DSP核的智能语音SoC设计

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;芯原杯一等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电子礼品等…

C++之va_start、vasprintf、va_end应用总结(二百二十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…