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

news2024/12/1 0:33:30

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

  • 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 num

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)
    #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 namelist



class_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'           #主页面url

today = 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.coloradmin.cn/o/1051692.html

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

相关文章

自制代码编辑器:CASM Editor

哔哩哔哩演示视频&#xff1a;我使用python自制了一个代码编辑器——CASM Editor_哔哩哔哩_bilibili 源代码&#xff1a; import idlelib.colorizer as idc import idlelib.percolator as idp import os import sys import threading import time import tkinter as T_tk imp…

计算机视觉: 可控的高质量人体生成

背景 关于人体动作的生成范式目前主流的方向可以分为以下两种: Sequence based motion generation: 给定控制信号然后一次性生成连续的动作&#xff0c;能生成一些连续高阶语义的动作信号&#xff0c;因为其能看到整个动作信号。eg: MDM: Human Motion Diffusion Model, Teve…

机器学习(20)---神经网络详解

神经网络 一、神经网络概述1.1 神经元模型1.2 激活函数 二、感知机2.1 概述2.2 实现逻辑运算2.3 多层感知机 三、神经网络3.1 工作原理3.2 前向传播3.3 Tensorflow实战演示3.3.1 导入数据集查看3.3.2 数据预处理3.3.3 建立模型3.3.4 评估模型 四、反向传播五、例题5.1 题15.2 题…

【SQL】Mysql 时区设置解决--20230928

https://blog.csdn.net/qq_44392492/article/details/108717616 输入命令show variables like “%time_zone%”;&#xff08;注意分号结尾&#xff09;设置时区&#xff0c;输入 set global time_zone “8:00”; 回车,然后退出重启&#xff08;一定记得重启&#xff0c;不然查…

Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止

有时候一段时间本地mysql不用&#xff0c;在连接本地数据库的时候&#xff0c;会报mysql无法连接出现错误提示10061错误&#xff0c; 这时候一般是本地mysql服务没有启动 去左下角搜“服务”&#xff0c;进入后选择Mysql&#xff0c;点击启动&#xff08;我的截图是已经启动好…

C#,数值计算——Ranfib的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Implements Knuths subtractive generator using only floating operations. See /// text for cautions. /// </summary> public class Ranfib { p…

通过茶叶酒水小程序商城的作用是什么?

茶叶酒水往往会在一起经营&#xff0c;同时又具备较强的送礼属性&#xff0c;需求度较高但经营商家同样不少&#xff0c;同行竞争激烈&#xff0c;加之同城生意有限、外地客户难以拓展、销售营销不足、品牌宣传效果差等痛点&#xff0c;传统酒水茶叶门店需要线上带来增长。 那…

大数据Flink(九十二):DML:集合操作

文章目录 DML:集合操作 DML:集合操作 集合操作支持 Batch\Streaming 任务。 UNION:将集合合并并且去重。

uni-app:js修改元素样式(宽度、外边距)

效果 代码 1、在<view>元素上添加一个ref属性&#xff0c;用于在JavaScript代码中获取对该元素的引用&#xff1a;<view ref"myView" id"mybox"></view> 2、获取元素引用 &#xff1a;const viewElement this.$refs.myView.$el; 3、修改…

【Flink】

事件驱动型应用 核心目标&#xff1a;数据流上的有状态计算 Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界或有界数据流进行有状态计算。 运行逻辑 状态 把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态。这就是所谓的“…

mrctf2020_shellcode_revenge

mrctf2020_shellcode_revenge Arch: amd64-64-little RELRO: Full RELRO Stack: No canary found NX: NX disabled PIE: PIE enabled RWX: Has RWX segments64位&#xff0c;开了PIE和RELRO&#xff0c;看到RWX出来&#xff0c;就感觉是shellcode了…

如何使用PyInstaller打包Python应用(包含参数详解,spec文件详解,反编译和防止反编译)

文章目录 介绍PyInstaller安装PyInstaller参数及使用方法PyInstaller打包技巧和注意事项反编译和防止反编译介绍PyInstaller PyInstaller是一个强大的Python打包工具,它可以将Python程序打包成独立的可执行文件,方便在不同的操作系统上分发和运行。使用PyInstaller,你可以将…

react.js在visual code 下的hello World

想学习reacr.js &#xff0c;就开始做一个hello world。 我的环境是visual code &#xff0c;所以我找这个环境下的例子。参照&#xff1a; https://code.visualstudio.com/docs/nodejs/reactjs-tutorial 要学习react.js &#xff0c;还得先安装node.js&#xff0c;我在visual …

Mysql高级语句(进阶查询语句、数据库函数、连接查询)

Mysql高级语句&#xff08;进阶查询语句、MySQL数据库函数、连接查询 一、mysql查询语句1.1、 select ----显示表格中一个或数个字段的所有数据记录1.2、 distinct ----不显示重复的数据记录1.3、where ----有条件查询1.4、 and or ----且 或1.5 、in----显示已知的值的数据记录…

9_分类算法—决策树

文章目录 1 信息熵1.1 比特化&#xff08;Bits&#xff09;1.2 一般化的比特化&#xff08;Bits&#xff09;1.3 信息熵&#xff08;Entropy&#xff09;1.3.1 熵越大混乱程度越大 1.4 条件熵H&#xff08;YIX&#xff09; 2 决策树2.1 什么是决策树2.2 决策树构建过程&#xf…

MySQL 索引的作用、索引结构及执行流程介绍(索引篇 一)

索引介绍 MySQL索引&#xff08;index&#xff09;是一种用于加快数据库中数据搜索和查询的数据结构。它类似于书籍的目录&#xff0c;可以帮助数据库快速定位和访问特定数据&#xff0c;而无需扫描整个数据表。 索引的作用和缺点 1. 加快数据搜索&#xff1a;通过使用索引&…

《C++ Primer》练习7.31:定义互相嵌套的类

类可以先声明再定义&#xff0c;可以用下面这个题目理解一下 class Y; class X {Y *y; };class Y {X x; };未出现的类类型要在前面声明。 参考 《C Primer》

0x84加密数据传输服务

为了在安全模式下实现一些诊断服务&#xff0c;在服务端和客户端应用程序之间添加了Security sub-layer。在客户端与服务端之间进行诊断服务数据传输有两种方法&#xff1a; 1、非安全模式下数据传输   应用程序使用诊断服务(diagnostic Services)和应用层服务原语(Applicati…

网络-跨域解决

文章目录 前言一、跨域是什么&#xff1f;二、跨域的解决1.JSONP2.前端代理dev环境3.后端设置请求头CORS4.运维nginx代理 总结 前言 本文主要介绍跨域问题介绍并提供了四种解决办法。 一、跨域是什么&#xff1f; 准确的来说是浏览器存在跨域问题&#xff0c;浏览器为了安全考…

pygame实现跳跃发射子弹打怪效果

import pygame import sys,time,random from pygame.locals import * pygame.init() # 设置按下鼠标的时候一直触发 pygame.key.set_repeat(10, 10) # 加载背景图片 bg pygame.image.load(./img/bg.png) # 加载左方向行走和站立图片 heroLStand pygame.image.load(img/heroLs…