Python爬取猪肉价格信息

Python爬取猪肉价格信息

写这篇文章主要是分享一下爬取价格信息、股市信息、天气信息等的经验。欢迎各路大神前来指教,我就是个小菜鸡。

前言

因为之前做的一次数模比赛,其中一道题目需要在猪价网https://zhujia.zhuwang.cc/爬取猪肉的价格信息,当时真的一点儿思路都没有。在这次春节期间,由于疫情的原因所以也一直去不了学校,就在家里看了很多东西,看了微信小程序,Android Studio,html5,css, json,JavaScript,当然很多都是草草的浏览了一下,没有留下很多印象,毕竟以后我应该也不会用到,只是知道有这么个东西。但我觉的并不是说我用不到就不需要了解,因为很多知识都是相互联系的,正是这段时间我看的这些东西,给了我一些启发。

在前端开发中,本人绝对是个外行,只是知道有html5、javascript、css这么个东西,但对他们的工作原理确是一概不知。以前看爬虫的时候不了解html等相关知识,以至于之前自己写的爬虫程序也就只能爬爬网络小说啥的,那速度不用说了,像蜗牛在爬,还老报错。

这段时间才刚刚了解到网页中的很多信息都是存储在JSON文件中进行传输的,例如价格网站的价格数据,天气网站 的天气数据都是存储在JSON中的。所以只要我们能够GET到所需的JSON,就能解析出相关数据。了解到这一点,要爬取猪肉的价格信息就小菜一碟了。

在这里我就以爬取猪肉价格为例和大家分享一下我的经验,希望能够帮助到有需要做这方面爬虫的人,同时也希望有大神能来给我指点指点迷津。

网页分析

我们以猪价网全国猪价为例,我们要爬取的就是一年以来,猪肉的价格变化。全国年猪价走势
我们可以在网站的主页上看到猪价的走势图,作为一个小菜鸡,当初一直以为猪价信息就包含在图表中,所以废了很长时间也没有找到。其实上图图表只是通过JavaScript调用了猪价信息数据,我们去网页的所有数据文件中去查找JSON格式的文本,就能够找到了猪价数据了。

这里我暂时没去管是如何调用的,毕竟我也不是做前端的,这里我只教大家如然后找到相应的数据。在浏览器界面点击F12进入开发者窗口,选择网络选项卡。按F5刷新界面,即可查看到浏览器获取到到的所有数据,如下图所示,其中箭头所指,名为chartData的html文件,包含了存储表格数据的JSON格式文本。
猪价网网页分析J
接下来我们需要看浏览器是如何获取到这段html代码的,点击箭头所指的html文件可查看详细信息,如下图,具体的意思就是,我们通过GET方法访问请求网址,就能得到chartData文件。
请求地址

Python代码解析

构造请求url

我们来分析一下图中请求地址:https://zhujia.zhuwang.cc/api/chartData?areaId=-1&aa=1582686072319

  1. 其中https://zhujia.zhuwang.cc/api/chartData是原始网址
  2. ?areaID=-1意思判断用户选择的区域,-1代表了全国数据
  3. &aa=后面的一长串数字代表了请求发出时时间信息

我们要获取的就是全国数据,所以areaID不用改,我们只需要更改代表请求时间的字符串。

这里我们可以导入time模块,利用 **int(time.time()*1000)**计算的得到包含时间信息的字符串,同时我们导入requests模块,json模块,利用requests模块发起get请求,利用json解析数据

import time
# 构造请求网址url
url = "https://zhujia.zhuwang.cc/api/chartData?areaId=-1&aa=%d"% int(time.time()*1000)

发起get请求

# 构造请求头,有效避免发爬虫
header = {'User-Agent': 'Mozilla/5.0'}
# 获取json文本
html = requests.get(url, headers=header).text

解析json

通过**json.loads()**方法将html文本加载成json格式

j0 = json.loads(html)

在解析json文本的过程中,我们了解json文本的构成,这样才能找到在大量的信息中找到我们需要的信息。在这里我给大家推荐一个可以通过视图查看json格式文本的网址,JSON在线视图查看器

通过将将文本复制到该网址中,可以查看到JSON视图,如图所示。

json结构视图
接下来我们对利用json模块进行解析,同时利用matplotlib绘制猪价走势图,同时保存猪价到文本中

priceList = []

print(j0.keys())

if not os.path.exists("猪肉价格"):
    os.mkdir("猪肉价格")

# j0['pig_in'][i], j0['pig_local'][i], j0['maizeprice'][i], j0['bean'][i]
for item in j0:
    if item != "time":
        f = open("猪肉价格/"+item+'.txt', 'w+')
        for i in range(366):
            f.write("%.2f\n" % float(j0[item][i]))
        f.close()
        plt.figure(item)
        plt.title(item)
        plt.plot(j0[item])
        plt.xlabel("时间")
        plt.ylabel("元/公斤")
        plt.xlim([0, 366])
        plt.savefig("猪肉价格/"+item + '.png', dpi=600)
    else:
        f = open("猪肉价格/"+item+'.txt', 'w+')
        for i in range(4):
            for j in range(3):
                f.write("%s" % j0[item][i][j])
            f.write("\n")

总结

完整代码

import matplotlib.pyplot as plt
import numpy as np
import json, time, requests, os

url = "https://zhujia.zhuwang.cc/api/chartData?areaId=-1&aa=%d"% int(time.time()*1000)

header = {'User-Agent': 'Mozilla/5.0'}
html = requests.get(url, headers=header).text

j0 = json.loads(html)

priceList = []

print(j0.keys())

if not os.path.exists("猪肉价格"):
    os.mkdir("猪肉价格")

# j0['pig_in'][i], j0['pig_local'][i], j0['maizeprice'][i], j0['bean'][i]
for item in j0:
    if item != "time":
        f = open("猪肉价格/"+item+'.txt', 'w+')
        for i in range(366):
            f.write("%.2f\n" % float(j0[item][i]))
        f.close()
        plt.figure(item)
        plt.title(item)
        plt.plot(j0[item])
        plt.xlabel("时间")
        plt.ylabel("元/公斤")
        plt.xlim([0, 366])
        plt.savefig("猪肉价格/"+item + '.png', dpi=600)
    else:
        f = open("猪肉价格/"+item+'.txt', 'w+')
        for i in range(4):
            for j in range(3):
                f.write("%s" % j0[item][i][j])
            f.write("\n")

结果

原图未加工有点丑,不想看到直接略过吧。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述终于结束了,希望大家多多支持!!欢迎交流!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只双鱼儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值