基于农产品(蔬菜)数据挖掘的分析与实现(Python+Spider)

目 录
摘 要 I
Abstract II
1绪论 1
1.1研究背景 1
1.2项目来源 1
1.3研究目的 2
1.3研究现状 2
1.4主要内容及预期目标 3
1.4.1数据挖掘技术简述及优点 3
1.4.2程序设计思路 3
1.4.3节点布置方案 4
1.4.4预期目标 5
2农产品(蔬菜)价格形成机制及影响因素分析 6
2.1蔬菜价格形成机制研究 6
2.2蔬菜价格影响因素分析 6
2.2.1市场内部影响因素 6
2.2.2市场外部影响因素 9
2.3蔬菜价格影响因素的测度 10
2.3.1变量与样本的选择 10
2.3.2模型形式与估计方法 11
2.3.3估计结果分析 11
3农产品(蔬菜)价格数据模型方案及功能分析 13
3.1分析与设计 13
3.2技术路线 13
3.2.1使用工具 13
3.2.2时间序列短期预测方法及模型 14
3.2.3数据采集模块 14
3.2.4功能实现模块 15
3.3数据仓库的组建 16
4农产品(蔬菜)价格短期预测模型的构建和实现 17
4.1 研究方法以及模型的基本原理 17
4.1.1研究方法 17
4.1.2模型的基本原理 17
4.2 估计步骤 19
4.2.1 利用ADF检验序列及其一阶差分的平稳性 19
4.2.2 选择模型的滞后阶数 19
4.2.3 Granger因果检验 20
3.2.4 Johansen协整检验及模型的建立 20
3.2.5误差修正模型的构建及检验 21
4.3 Python数据爬取网站 21
4.4 Python分析思路 21
4.5 Python爬虫源码说明 24
4.5.1首先创建一个Spider 24
4.5.2行情数据 24
4.5.3产地数据 29
4.5.4行情分布 32
4.5.5价格走势 41
4.5.6设计字典 44
4.5.7数据入库 47
总 结 53
参考文献 54
致 谢 55
1.4主要内容及预期目标
1.4.1数据挖掘技术简述及优点
数掘是指从大量的数据中抽取隐含的、不为人知的、有用的信息。数据挖掘是发现以前未知和潜在有趣的过程,在大数据集的模式(Piatetsky Shapiro和Frawley,1991)。“开采”信息,通常表示为数据集的语义结构的模型,其中模型可用于预测或分类的新数据[6]。数据挖掘也能被描述为试图创建一个数据库中描述的复杂世界的简单的模型,因而我们也可以说数据挖掘是处理大量信息的方法,并且它有助于比人更快的速度发现有用的信息[7]。数据挖掘通常与计算机科学有关,并通过统计、在线分析处理、情报检索、机器学习、专家系统(依靠过去的经验法则)和模式识别等诸多方法来实现数据挖掘[8]。
1.4.2程序设计思路
在农产品(蔬菜)的数据挖掘数据处理中,我们首先要寻找到足够的大量的农产品相关的数据信息的来源,因为拥有大量的数据信息是数据挖掘和数据处理的基础。其次是我们要做一些数据的准备:选择数据,就是确定待挖掘的数据的目标;数据预处理:研究数据的质量,确定将要进行的数据类型;数据转换:就是转换成一个分析模型。然后进行数据的挖掘:选择合适的挖掘算法。最后就是结果分析,主要是对提取的数据信息的可靠性、有效性等进行评估。
3农产品(蔬菜)价格数据模型方案及功能分析
3.1分析与设计
数据信息模块当中的各种不同农产品数据的类型的数据采集环境中的数据来自农产品网站,然后再把数据信息模块中的数据经过Python工具进行处理,再把模块上的处理过的数据,通过组建的爬虫网络进行数据传输,将数据发送给用户;用户模块接收Python工具模块发送过来的数据,并将这些数据进行处理、分析、整合,由结果分析模块把处理出来的数据经过结果分析模块将数据显示出来;结果分析模块通过建立的后台数据库将数据进行存储。设计的总体结构图如图3所示。
在这里插入图片描述

图3 总体结构图
3.2技术路线
3.2.1使用工具
(1)Python编程语言
(2)再用Hadoop处理数据
(3)MySQL数据库
(4)Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架
3.2.2时间序列短期预测方法及模型
随着计量经济建模理论的发展与完善,时间序列分析与预测得到了广泛应用。目前,常用的时间序列短期预测方法与模型主要有时间趋势外推
法、季节分解法、指数平滑法和 Box Jenkins 法。
趋势外推法。当时间序列具有某种上升或下降的趋势,并且无明显的季节波动时,通常采用简单趋势外推预测模型,主要包括多项式曲线预测模型、指数曲线预测模型、对数曲线预测模型、生长曲线预测模型等 4种。当既有某种上升或下降趋势,又存在季节性波动时,需要加入季节虚拟变量。常用方法有截距变动模型、斜率变动模型、截距和斜率同时变动模型。
季节分解法。将影响时间序列变化的因素分为 4 种:长期趋势因素( trend,T ) ,表示随着时间变化按照某种规律稳步上升、下降或保持在某一水平上; 季节变动因素( seasonal,S) ,表示在 1 个年度内依一定周期规律性变化; 循环变动因素( circle,C) ,表示以若干年为周期的变动变化; 不规则变动因素 ( irregular,I) ,表示不可控的偶然因素,如地震、水灾、恶劣天气、罢工和意外事故等。季节分解常用模型有:乘法模型( Y = T SCI ) 和加法模型( Y =T + S + C+ I) 。
指数平滑法。以本期实际数和本期预测数为基础,引入 1 个简化加权因子( 平滑系数) 的一种指数平滑预测法。
Box Jenkins 法。如果时间序列是非平稳的,先将序列变成平稳序列,变化后的新序列仍保持原时间序列的随机性。主要模型包括:自回归模型( AR) 、移动平均模型( M A) 、自回归移动平均模型( ARMA) 或差分自回归移动平均模型( ARIM A 或SARIM A) 。

 # -*- coding: utf-8 -*-
importscrapy
frommySpider.items import MyspiderChanDi
fromcopy import deepcopy


classChandiSpider(scrapy.Spider):
    name = 'chandi'
    allowed_domains = ['hangqing.ymt.com']
    start_urls =['http://hangqing.ymt.com/chandi_8031_0_0']

    #省份数据
    def parse(self, response):
        #产地列表
        li_list =response.xpath("//div[@class='fl sku_name']/ul//li")
        for li in li_list:
            items = MyspiderChanDi()
           items["ymt_province_href"] =li.xpath("./a/@href").extract_first()
            items["ymt_province_id"]= items["ymt_province_href"].split("_")[-1]
            items["ymt_province_name"]= li.xpath("./a/text()").extract_first()

            yield scrapy.Request(
               items["ymt_province_href"],
               callback=self.parse_city_detail,
                meta={"item":deepcopy(items)}
            )

    #城市数据
    def parse_city_detail(self, response):
        item = response.meta["item"]
        option =response.xpath("//select[@class='location_select'][1]//option")

        if len(option) > 0:
            for op in option:
                name = op.xpath("./text()").extract_first()
                if name != "全部":
                   item["ymt_city_name"] = name
                   item["ymt_city_href"] =op.xpath("./@data-url").extract_first()
                   item["ymt_city_id"] = item["ymt_city_href"].split("_")[-1]
                    yield scrapy.Request(
                       item["ymt_city_href"],
                       callback=self.parse_area_detail,
                        meta={"item":deepcopy(item)}
                    )
        else:
            item["ymt_city_name"] =""
            item["ymt_city_href"] =""
            item["ymt_city_id"] = 0
            yield scrapy.Request(
               item["ymt_city_href"],
               callback=self.parse_area_detail,
                meta={"item":deepcopy(item)}

            )

    #县市数据
    def parse_area_detail(self, response):
        item = response.meta["item"]
        area_list =response.xpath("//select[@class='location_select'][2]//option")

        if len(area_list) > 0:
            for area in area_list:
                name =area.xpath("./text()").extract_first()
                if name != "全部":
                   item["ymt_area_name"] = name
                   item["ymt_area_href"] = area.xpath("./@data-url").extract_first()
                   item["ymt_area_id"] =item["ymt_area_href"].split("_")[-1]
                    yield item
        else:
            item["ymt_area_name"] =""
            item["ymt_area_href"] =""
            item["ymt_area_id"] = 0
            yield item

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,您的问题是关于如何基于Python、Scrapy、Redis和Rule组件实现分布式爬虫爬取京东华为笔记本的。首先,您需要安装Scrapy和Redis,并在Scrapy的配置文件中添加Redis相关的配置: ```python # 在settings.py中添加以下配置 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True REDIS_URL = 'redis://localhost:6379' ``` 然后,您需要编写Spider和Item Pipeline,其中Spider负责解析并抓取网页,Item Pipeline负责处理抓取到的数据。下面是一个示例的Spider代码: ```python from scrapy_redis.spiders import RedisSpider from scrapy.selector import Selector from ..items import ProductItem class JdSpider(RedisSpider): name = 'jd' redis_key = 'jd:start_urls' def parse(self, response): sel = Selector(response) products = sel.xpath('//div[@class="gl-i-wrap"]') for product in products: item = ProductItem() item['name'] = product.xpath('div[@class="p-name"]/a/em/text()').extract_first() item['price'] = product.xpath('div[@class="p-price"]/strong/i/text()').extract_first() item['url'] = product.xpath('div[@class="p-name"]/a/@href').extract_first() yield item ``` 在Item Pipeline中,您可以对抓取到的数据进行清洗和存储,下面是一个示例的Item Pipeline代码: ```python import pymongo class JdPipeline(object): def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): self.db['products'].insert(dict(item)) return item ``` 最后,您需要创建一个Redis队列,并向队列中添加起始URL,如下所示: ```python import redis r = redis.Redis(host='localhost', port=6379) r.lpush('jd:start_urls', 'https://search.jd.com/Search?keyword=%E5%8D%8E%E4%B8%BA%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8') ``` 最终,您就可以运行分布式爬虫并抓取京东华为笔记本的数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值