admin管理员组

文章数量:1543652

目录

1 开发环境

2 程序功能介绍

(1)实验目的

(2)数据说明

(3)技术说明

3 程序设计的思路

4 关键技术及难点

5 程序的详细设计

5.1 爬取数据

5.2 读取数据

5.3查看数据的整体情况

5.4数据清洗

5.5数据分析

6 可视化展示

7 结论


1 开发环境

主要是Jupyter Notebook

2 程序功能介绍

(1)实验目的

参考智慧农业导论课程内容,结合本专业已学课程知识,开展涉农数据的“爬取—清洗—存储—可视化—结论性分析”的工作,通过分析,实现对数据的整体评价或预测。

(2)数据说明

本次爬虫实验共爬取了100页,2000条数据,八列分别为产地、单位、发布日期、品名、平均价、最低价、最高价、规格等,其中无重复值,产地有403个缺失值,规格有1259个缺失值,缺失值过多不能直接删除,这两个变量在后续研究中只看比较关系,无需填充,所以不用进行缺失值处理。数据类型有两类,object类型的数据有产地、单位、发布日期、品名、规格等,float64类型的数据包括平均价、最低价、最高价等。

(3)技术说明

采用Python3技术使用requests库的post()方法来爬取数据。

3 程序设计的思路

向HTML网页提交POST请求的方法,对应于HTTP的POST,找到蔬菜信息页面,然后进行翻页,发现页面的url没有发生改变,所有蔬菜信息是通过接口数据动态获取的,是动态数据。进行chrom调试抓包,找到每个页面信息所在的url,发现每个信息的url都相同,post请求,formdata不同。通过修改提交的data来获取不同页面的蔬菜信息。

4 关键技术及难点

  1. 如何爬取大量数据且保证数据的有效性
  2. 数据处理的方法,相关函数的应用,图像的制作
  3. 选定所要制作图像的数据
  4. 对所得结果的综合性分析

5 程序的详细设计

5.1 爬取数据

利用在页码框输入页码指定需要爬取的页面数目

爬取数据网址:新发地官网:http://www.xinfadi/priceDetail.html

import json
import requests
import threading
import pandas as pd
#新发地官网:http://www.xinfadi/priceDetail.html
#页数
page = 1
#商品总列表
count=[]
#json列表
jsons=[]

#解析网页函数
def url_parse(page):
    #请求地址
    url = 'http://www.xinfadi/getPriceData.html'
    headers = {
                "Accept": "*/*",
                "Accept-Encoding": "gzip, deflate",
                "Accept-Language": "zh-CN,zh;q=0.9",
                "Cache-Control": "no-cache",
                "Connection": "keep-alive",
                "Content-Length": "89",
                "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                "Host": "www.xinfadi",
                "Origin": "http://www.xinfadi",
                "Pragma": "no-cache",
                "Referer": "http://www.xinfadi/priceDetail.html",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
                "X-Requested-With": "XMLHttpRequest",
            }
    data = {
            "limit": "20",
            "current": page,
            "pubDateStartTime": "",
            "pubDateEndTime": "",
            "prodPcatid": "1186", #商品类id
            "prodCatid": "",
            "prodName": "",
        }
    response=requests.post(url=url,headers=headers,data=data).text
    #获取商品信息
    response=json.loads(response)['list']
    #生成线程锁对象
    lock=threading.RLock()
    #上锁
    lock.acquire()
    #添加到json列表中
    jsons.append(response)
    #解锁
    lock.release()

#解析json函数
def json_parse(product):
    lock=threading.RLock()
    lock.acquire()
    dic = {'品名': product['prodName'], "最低价": product['lowPrice'], '最高价': product['highPrice'],
           '平均价': product['avgPrice'], '规格': product['specInfo'], '产地': product['place'], '单位': product['unitInfo'],
           '发布日期': product['pubDate']}
    print(dic)
    #将商品信息添加到商品总列表中
    count.append(dic)
    lock.release()
    
if __name__ == '__main__':
    num=int(input('请输入爬取页数:'))
    #多进程解析网页
    for i in range(1,num+1):
        x=threading.Thread(target=url_parse,args=(i,))
        x.start()
    x.join()
    # 多进程解析json
    for i in jsons:
        for product in i:
            y=threading.Thread(target=json_parse,args=(product,))
            y.start()
    y.join()
    #生成excel
    data = pd.DataFrame(count)
    data.to_excel('E:\\爬取蔬菜相关信息.xlsx', index=None)

​​​​​​​5.2 读取数据

导入数据集并进行查看,(爬取蔬菜相关信息.xlsx

import pandas as pd

df1 = pd.read_excel(r'E:\\爬取蔬菜相关信息.xlsx')

df1

df1.head()#显示前5条记录

5.3查看数据的整体情况

查看数据的规模,对数据的初步统计信息有所了解

(1)查看数据的规模:行数和列数

print(df1.shape)  #查看维度

print(df1.index.size) #获得行数

print(df1.columns.size)  #获得列数

数据规模(2000,8)

(2)利用info()查看数据的维度、字段名及类型等

df1.info()

(3)利用describe()查看数据初步统计信息

df1.describe()

数据的初步统计信息

图一

5.4数据清洗

对重复值,缺失值进行查看与处理

(1)重复值处理

#查看是否存在重复行

df1.duplicated()

#查看重复行与非重复行的数量

cf = df1.duplicated()

cf.value_counts()

无重复行,无需对重复行进行操作

(2)缺失值处理

#查看各元素是否为空值

df1.isnull()

#查看各列是否存在空值

#只要该列有空值,就为True

df1.isnull().any()

#各列含空值的具体数目

df1.isnull().sum()

可以得到该数据集中产地有403个缺失值,规格有1259个缺失值,缺失值过多不能直接删除,这两个变量在后续研究中只看比较关系,所以无需填充

(3)产看规格列包含具体种类

p1 = df1['规格'].drop_duplicates()

ww = []

for i in p1:

ww.append(i)

ww

#查看规格列各种类出现的次数

from collections import Counter

Counter(df1['规格'])

可以看到规格为'袋\箱'的较多,出现了68次,其次依次是'洗'47次,'新'47次,'泥\洗'34次,'老'30次等,'散装'出现较少,仅有4次,规格列缺失较多,但我们只需对已有的值进行分析,缺失值不影响比较结果,所以不对其进行处理

5.5数据分析

(1)查看每一列的数据类型

df1.dtypes

(2)查看价格的相关情况

#最高价的平均值

pj1 = df1['最高价'].mean()

print("最高价的平均值是{}".format(pj1))

#最高价的众数:

zs1 = df1['最高价'].mode()

print("最高价的众数是:{}".format(zs1))

#最高价的方差:

fc1 = df1['最高价'].var()

print("最高价的方差是:{}".format(fc1))

#最低价的平均值

pj2 = df1['最低价'].mean()

print("最低价的平均值是{}".format(pj2))

#最低价的众数:

zs2 = df1['最低价'].mode()

print("最低价的众数是:{}".format(zs2))

#最低价的方差:

fc2 = df1['最低价'].var()

print("最低价的方差是:{}".format(fc2))

#平均价的平均值

pj3 = df1['平均价'].mean()

print("平均价的平均值是{}".format(pj3))

#平均价的众数:

zs3 = df1['平均价'].mode()

print("平均价的众数是:{}".format(zs3))

#平均价的方差:

fc3 = df1['平均价'].var()

print("平均价的方差是:{}".format(fc3))

data = {'平均值':[pj1,pj2,pj3],'众数':[zs1,zs2,zs3],'方差':[fc1,fc2,fc3]}

w = pd.DataFrame(data,index=

本文标签: 官网新发领域农业数据