【Scrapy】京东商品数据可视化

【Scrapy】京东商品数据可视化

文章目录

  • 【Scrapy】京东商品数据可视化
    •   👉引言💎
    • 一、爬取数据:
      • 1.1 scrapy爬虫库简介:
      • 1.2 技术实现:
        • 1.2.1搭建框架结构
        • 1.2.2 分析网页结构
    • 二、数据保存:
    • 三、数据读取以及分析:
    • 四、数据可视化:
    • 五、全部代码
        • jd.py
        • dealData.py
        • items.py
        • pipelines

  👉引言💎

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
热爱写作,愿意让自己成为更好的人…


在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

一、爬取数据:

1.1 scrapy爬虫库简介:

Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试.

其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 后台也应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持.

1.2 技术实现:

1.2.1搭建框架结构

首先搭建scrapy库项目,运行如下代码生成代码框架:

scrapy startproject crawler
cmdline.execute('scrapy crawl jd'.split())

spiders文件夹中的py文件即为主要爬虫代码,当获取网页请求后,在该文件的主类中重写parse方法,即请求解析代码。

spiders上级目录下的items文件即为获取到的字段,也就是爬取的属性值,示例如下:

class CrawljingdongItem(scrapy.Item):
    id=scrapy.Field()
    comment=scrapy.Field()
    productName=scrapy.Field()
    storeName=scrapy.Field()
    address=scrapy.Field()
    price=scrapy.Field()
    UserComments=scrapy.Field()
    pass

1.2.2 分析网页结构

在重写parse请求时,首先需要对网页进行结构分析,这里以京东商品页面进行展示。

首先打开京东界面,得到网址,填入starturls中。然后使用xpath进行HTML的解析,此时可以获取静态页面中的所有内容

请添加图片描述

于是使用data = ans_html.xpath("//*[@class='gl-warp clearfix']/li") 可以得到所有的列表标签,可以看到,里面存放了所有的单位商品信息。随后使用for循环遍历每个列表,对商品信息进行单独提取,并使用item类进行存储。

这里需要注意的是,对于评论等数据是无法直接从HTML中提取出来的,因为这些数据通常是基于ajax技术进行异步传输,即滑动时会进行加载(动态加载),所以必须找到保存评论信息的json文件。通过网页检查器,可以发现文件位置,根据该URL使用request库进行请求即可。

请添加图片描述

主要逻辑代码完成后,下一步会进入spiders上级目录下的pipelines文件中进行数据的存储级操作,这里使用mysql数据库进行数据的存储。

二、数据保存:

首先需要导入pymsql库,其次进行主要连接属性的配置

 def dbHandle(self):
        conn = pymysql.connect(
            host="localhost",
            user="root",
            passwd="135157",
            charset="utf8",
            use_unicode=False
        )
        return conn

然后根据sql语法,使用pymysql的execute方法将查询语句传入到sql中进行查询,可以看到数据存储如下:

请添加图片描述

下一步使用pandas库的read_sql_query方法从mysql数据库中读取数据,同时进行分析以及处理。

三、数据读取以及分析:

将数据读取后得到一个DataFrame对象,然后分别进行数据处理,最终得到 商品价格区间的划分,不同价格区间范围内的商品数量,用户的评论集合,商品名称的集合等数据信息,进行下一步数据可视化。

四、数据可视化:

首先使用matplotlib的plot方法进行相关的操作。

对商品价格区间内的商品数量使用条形图进行可视化:

请添加图片描述

对店铺地址进行统计并使用饼图进行可视化:

请添加图片描述

将所有评论连接起来成一段文章,使用jieba中文分词库进行关键词提取,然后拼接起来调用WordCloud对象的wc.generate方法生成词云:

请添加图片描述

将所有商品名称连接起来成一段文章,使用jieba中文分词库进行关键词提取,然后拼接起来调用WordCloud对象的wc.generate方法生成词云:

请添加图片描述

五、全部代码

jd.py
import re

import sys
import json
import scrapy
from crawlJingDong import items
import requests as rq
from lxml import etree
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'}


class JdSpider(scrapy.Spider):
    name = 'jd'
    allowed_domains = ['jd.com']
    start_urls = ['https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&wq=%E6%89%8B%E6%9C%BA']

    def parse(self, response):
        rep = response.text
        ans_html = etree.HTML(rep)
        data = ans_html.xpath("//*[@class='gl-warp clearfix']/li")

        for it in data:
            item = items.CrawljingdongItem()
            id = it.attrib["data-sku"]
            # e=it.xpath("*[@class='onekeyvip-jd-box-area xh-highlight']")
            price = float(it.xpath("./div/div[3]//i//text()")[0])
            prodectName = it.xpath("./div/div[4]//em//text()")[0]
            comment = it.xpath("./div/div[5]//a/@href")[0]
            storeName = it.xpath("./div/div[7]//a/text()")[0]
            address = it.xpath("./div/div[9]")[0].attrib["data-province"]

            # 变字典
            item["id"] = id
            item["price"] = price
            item["productName"] = prodectName
            item["comment"] = comment
            item["storeName"] = storeName
            item["address"] = address
            """由于评论数据是ajax异步加载的,所以在一开始获取的界面中是无法得到评论数据的,但是根据网页分析可以知道,
            评论数据都在js中存放,拿京东来说,找到productPageComments文件,根据url进行获取,就能得到json格式的评论数据
            """
            comJson = rq.get(f"https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId={id}&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1",
                            headers= header)
            #由于直接得到的text并不是json格式(有jquery这些),所以需要先转换成json(就是字典格式)
            str = comJson.text.strip()
            loads = json.loads(re.findall('\{.*\}',str)[0])
            UserComment=[]
            list(map(lambda x:UserComment.append((x['content'])), loads['comments']))
            item['UserComments']=UserComment
            yield item


dealData.py
import jieba
import jieba.analyse
import pandas as pd

import pymysql as pl
from matplotlib import pyplot as plt
from wordcloud import WordCloud

plt.style.use('seaborn')
plt.rcParams['font.sans-serif'] = 'SimHei'

conn = pl.connect(host='localhost', user='root', password='135157', db='JDstore', port=3306)
query = "SELECT * FROM `jdstore`.`jd` LIMIT 0,1000"
data = pd.read_sql_query(query, conn)
sumDes = data.describe()
print(f'数据信息的描述统计:\n{sumDes}')
# 得到价格区间
end, sta = int(sumDes.loc['max', 'price'] // 1000), int(sumDes.loc['min', 'price'] // 1000)
label = list(map(lambda x: str(x * 1000) + '-' + str((x + 1) * 1000), range(sta, end + 1)))
# 将商品价格划分到区间中
data['pStage'] = data['price'].apply(lambda x: int(x // 1000))
# 对商品价格区间内的商品数量使用条形图进行可视化
dataByP = data.groupby('pStage').count()['prodectName']
plt.bar(range(5),dataByP)
plt.title('价格分布')
plt.xticks(range(5),label,rotation=-10)
plt.yticks( rotation=-10)
plt.xlabel('价格(元)')
plt.ylabel('商品数量(个)')
plt.show(block=True)
# 对店铺地址进行统计并使用饼图进行可视化
dataByA = data.groupby('address').count()['storeName']
dataByA.plot(kind='pie',ylabel='',title='店铺地点分布',legend=True,cmap='rainbow')
plt.show(block=True)

# 将所有评论连接起来成一段文章
comStr = "".join(list(data['prodectName'])).replace('\n', ' ')
# 直接进行关键词分析
wordFlag = jieba.analyse.extract_tags(comStr)
print('\n开始制作词云……')  # 提示当前状态
wc = WordCloud(
    font_path='C:/Windows/Fonts/SimHei.ttf',  # 设置字体(这里选择“仿宋”)
    background_color='white',  # 背景颜色
    # mask=mask,  # 文字颜色+形状(有mask参数再设定宽高是无效的)
    # max_font_size=150  # 最大字号
)
wc.generate(' '.join(wordFlag))
plt.imshow(wc)  # 处理词云
plt.axis('off')
plt.show(block=True)
# 同上,不过操作对象是商品名称
comStr = "".join(list(data['userComments'])).replace('\n', ' ')
# 直接进行关键词分析
wordFlag = jieba.analyse.extract_tags(comStr)
print('\n开始制作词云……')  # 提示当前状态
wc = WordCloud(
    font_path='C:/Windows/Fonts/SimHei.ttf',  # 设置字体(这里选择“仿宋”)
    background_color='white',  # 背景颜色
    # mask=mask,  # 文字颜色+形状(有mask参数再设定宽高是无效的)
    # max_font_size=150  # 最大字号
)
wc.generate(' '.join(wordFlag))  # 从字典生成词云
plt.imshow(wc)  # 处理词云
plt.axis('off')
plt.show(block=True)

items.py
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class CrawljingdongItem(scrapy.Item):
    id=scrapy.Field()
    comment=scrapy.Field()
    productName=scrapy.Field()
    storeName=scrapy.Field()
    address=scrapy.Field()
    price=scrapy.Field()
    UserComments=scrapy.Field()
    pass




pipelines
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import pymysql


# useful for handling different item types with a single interface


class CrawljingdongPipeline:
    # def open_spider(self, spider):
    #     self.file = open('coments.txt', 'w+')
    #
    # def close_spider(self, spider):
    #     self.file.close()

    def dbHandle(self):
        conn = pymysql.connect(
            host="localhost",
            user="root",
            passwd="135157",
            charset="utf8",
            use_unicode=False
        )
        return conn

    def process_item(self, item, spider):
        dbObject = self.dbHandle()
        cursor = dbObject.cursor()
        cursor.execute("USE JDstore")
        str = '\n'.join(item['UserComments'])
        sql = "INSERT INTO jd(`id`, `prodectName`, `storeName`, `price`, `address`, `userComments`) VALUES ('%s','%s','%s',%f,'%s','%s')"
        try:
            cursor.execute(sql%(item['id'], item['productName'], item['storeName'], item['price'],item['address'],str))
            cursor.connection.commit()
        except BaseException as e:
            print("错误在这里>>>>>>>>>>>>>", e, "<<<<<<<<<<<<<错误在这里")
            dbObject.rollback()
        return item

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode】429. N 叉树的层序遍历

题目描述 给定一个 N 叉树&#xff0c;返回其节点值的_层序遍历_。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;…

Synthetic Temporal Anomaly Guided End-to-End Video Anomaly Detection 论文阅读

Synthetic Temporal Anomaly Guided End-to-End Video Anomaly Detection 论文阅读 Abstract1. Introduction2. Related Work3. Methodology3.1. Architecture3.1.1 Autoencoder3.1.2 Temporal Pseudo Anomaly Synthesizer 3.2. Training3.3. Anomaly Score 4. Experiments4.1.…

R语言更新版本

目录 一、更新R语言 1、安装最新的R语言版本 2、移动之前安装的packages 3、将Rstudio连接到最新的R语言 二、Rstudio更新 一、更新R语言 1、安装最新的R语言版本 查看当前R语言版本&#xff1a; R.version.string 下载最新的R语言安装包&#xff1a;R: The R Project…

王阳明:在心里中一个春天!吃好喝好不等于吃饱喝足,出租屋的第二个周末——早读(逆天打工人爬取热门微信文章解读)

种一个春天&#xff0c;等下一个天亮 引言Python 代码第一篇 霸王别坤第二篇 &#xff08;跳&#xff09;洞见 王阳明&#xff1a;人生若是太苦寒&#xff0c;在心里种一个春天第三篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 屋宽不如心宽&#xff0c;物整亦是心…

什么是微隔离技术?

微隔离产生的背景 首先来看下南北向流量以及东西向流量的含义 南北向流量 指通过网关进出数据中心的流量&#xff0c;在云计算数据中心&#xff0c;处于用户业务虚拟机&#xff08;容器&#xff09;跟外部网络之间的流量&#xff0c;一般来说防火墙等安全设备部署在数…

基于极大似然算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于极大似然算法的系统参数辨识。对系统的参数a1&#xff0c;b1&#xff0c;a2&#xff0c;b2分别进行估计&#xff0c;计算估计误差以及估计收敛曲线&#xff0…

【MySQL】表的增删改查——MySQL基本查询、数据库表的创建、表的读取、表的更新、表的删除

文章目录 MySQL表的增删查改1. Create&#xff08;创建&#xff09;1.1 单行插入1.2 多行插入1.3 替换 2. Retrieve&#xff08;读取&#xff09;2.1 select查看2.2 where条件2.3 结果排序2.4 筛选分页结果 3. Update&#xff08;更新&#xff09;3.1 更新单个数据3.2 更新多个…

UE4.27_ParticleSystem(没写完的材料)

UE4.27_ParticleSystem&#xff08;没写完的材料&#xff09; 参考实例&#xff1a; UE4[蓝图]下雪效果及雪的材质的实现

Learn OpenGL 04 纹理

纹理环绕方式 纹理坐标的范围通常是从(0, 0)到(1, 1)&#xff0c;那如果我们把纹理坐标设置在范围之外会发生什么&#xff1f;OpenGL默认的行为是重复这个纹理图像&#xff08;我们基本上忽略浮点纹理坐标的整数部分&#xff09;&#xff0c;但OpenGL提供了更多的选择&#xf…

UI 易用性测试 以及自动化实现!

GUI 是指图形用户界面&#xff0c;UI 是指用户界面&#xff0c;对于纯软件系统&#xff0c;这两者没有本质的区别&#xff0c;GUI易用性测试与 UI 易用性测试内容一致。但是如果测试的对象是一个产品&#xff0c;这两者则存在区别&#xff0c;对于产品 UI 则不仅仅包括 GUI&…

基于springboot+vue实现高校学生党员发展管理系统项目【项目源码+论文说明】

基于springboot实现高校学生党员发展管理系统演示 摘要 随着高校学生规模的不断扩大&#xff0c;高校内的党员统计及发展管理工作面临较大的压力&#xff0c;高校信息化建设的不断优化发展也进一步促进了系统平台的应用&#xff0c;借助系统平台可以实现更加高效便捷的党员信息…

JavaSE面试——Collection接口和Collections类

集合分为&#xff1a;Collection 和 Map 两个体系 java8为 Collection 的父接口( Iterable )提供了一个默认的 Foreach 方法&#xff0c;我们可以使用它进行集合遍历 1. Collection 接口 Collection接口是是Java集合类的顶级接口之一&#xff0c;Collection 接口有 3 种子类型…

RESTful API关键部分组成和构建web应用程序步骤

RESTful API是一种基于HTTP协议的、符合REST原则的应用程序接口。REST&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序的通信模式。 一个RESTful API由以下几个关键部分组成&#xff1a; 资源&#xff08;Resour…

基于springboot实现数据资产管理系统 项目【项目源码+论文说明】

基于springboot实现数据资产管理系统演示 摘要 固定资产管理系统主要是完成对系统用户管理、资产信息管理、资产变更管理、资产用途管理、资产类别管理和资产增减管理。因为利用本系统管理员可以直接录入信息&#xff0c;修改信息&#xff0c;删除信息&#xff0c;并且若在录入…

魔众智能AI系统v2.1.0版本支持主流大模型(讯飞星火、文心一言、通义千问、腾讯混元、Azure、MiniMax、Gemini)

支持主流大模型&#xff08;讯飞星火、文心一言、通义千问、腾讯混元、Azure、MiniMax、Gemini&#xff09; [新功能] 系统全局消息提示 UI 全新优化 [新功能] JS 库增加【ijs】类型字符串&#xff0c;支持默认可执行代码 [新功能] 分类快捷操作工具类 CategoryUtil [新功能…

RocketMQ-存储与弹性伸缩

存储与弹性伸缩 一、介绍二、存储架构图1.CommitLog2.ConsumeQueue3.IndexFile 三、消息读写流程1.写入流程1.1 获取Topic元数据1.2 消息投递1.3 消息写入 2.读取流程2.1 获取Topic元数据2.2 消息拉取2.3 消息消费 四、消息持久化1.页缓存2.刷盘2.1 同步刷盘2.2 异步刷盘 五、集…

力扣hot100:76.最小覆盖子串(滑动窗口)

本题使用滑动窗口解决&#xff0c;用right表示滑动窗口的右边界&#xff0c;left表示滑动窗口的左边界。寻找可行解&#xff0c;我们可以这样约定滑动窗口的意义&#xff1a;right指针向右移动&#xff0c;是使得滑动窗口找到可行解。left指针向右移动是为了更新窗口使得其可以…

定位算法——TDOA的Chan算法推导与Matlab实现

TDOA算法原理 TDOA(Time Difference of Arrival)——时间差到达算法&#xff0c;利用了几何数学中双曲线的特点—— 双曲线上的任意点到达两焦点的距离差是固定值。 这个距离差它天然可以抹去用户设备(UE)和基站的之间时钟误差。 P 1 C 1 c ⋅ ( t 11 Δ t ) P_1C_1 c(t_…

武汉灰京文化:5G与云计算技术下的手游行业,技术创新将带来怎样的变革?

随着技术的不断进步&#xff0c;手游行业将迎来一场革命性的变革。5G网络的普及和云计算技术的飞速发展&#xff0c;将为手游带来更加流畅、高清晰度的游戏体验&#xff0c;让玩家们尽情享受更真实、更沉浸式的虚拟现实和增强现实游戏。同时&#xff0c;人工智能技术的运用也将…

【Linux】cpp-httplib库

目录 升级gcc版本 下载cpp-httplib的zip安装包&#xff0c;上传到服务器 ​编辑 简单使用 首先打开gittee,搜索cpp-httplib,选择其中一个即可 也可以点下方链接 cpp-httplib库&#xff1a;cpp-httplib: cpp-httplib (gitee.com) 注意&#xff1a;cpp-httplib在使用的时候需…