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

news2025/6/19 2:17:25

【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

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

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

相关文章

【Algorithms 4】算法(第4版)学习笔记 16 - 4.2 有向图

文章目录 前言参考目录学习笔记1&#xff1a;介绍1.1&#xff1a;有向图简介1.2&#xff1a;应用举例1.3&#xff1a;相关问题2&#xff1a;有向图 API2.1&#xff1a;有向图表示2.1.1&#xff1a;邻接表数组 Adjacency-list2.1.2&#xff1a;Java 实现&#xff1a;邻接表数组2…

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…

C# OpenVINO Yolov8-OBB 旋转目标检测

目录 效果 模型 项目 代码 下载 C# OpenVINO Yolov8-OBB 旋转目标检测 效果 模型 Model Properties ------------------------- date&#xff1a;2024-02-26T08:38:44.171849 description&#xff1a;Ultralytics YOLOv8s-obb model trained on runs/DOTAv1.0-ms.yaml …

论文的引用书写方法

前置操作 1、全选文献 2、在开始选项卡 段落功能区 选择编号功能 3、设置编号格式 [1] 论文的引用 1、光标放在需要引用论文的地方 2、选择引用选项卡 点击交叉引用 3、引用类型为编号项 引用内容为段落编号 选择需要的第几条参考文献

Linux第74步_“设备树”下的LED驱动

使用新字符设备驱动的一般模板&#xff0c;以及设备树&#xff0c;驱动LED。 1、添加“stm32mp1_led”节点 打开虚拟机上“VSCode”&#xff0c;点击“文件”&#xff0c;点击“打开文件夹”&#xff0c;点击“zgq”&#xff0c;点击“linux”&#xff0c;点击“atk-mp1”&am…

数据库的筛选条件

【一】筛选过滤条件 【1】完整的查询语句 -- 查询当前表中的全部数据select * from 表名 where 筛选条件;​-- 查询当前表中的指定字段的数据select 字段名,字段名 from 表名 where 筛选条件;# 执行顺序from where select ​select 你选择的列1, 你选择的列2, ... from 查询的…

UVA191 Intersection 题解

UVA191 Intersection 题解 水紫&#xff0c;建议降蓝。 解法 求线段相交裸题&#xff0c;考虑使用向量解决。 我们把矩形的 4 4 4 个点两两相连&#xff0c;得到 6 6 6 条线段&#xff0c;如果先输入的线段和这 6 6 6 条线段都没有交点&#xff0c;则认为线段和矩形不相…

高度塌陷问题及解决

什么情况下产生 (when 父盒子没有定义高度&#xff0c;但是子元素有高度&#xff0c;希望用子盒子撑起父盒子的高度&#xff0c;但是子盒子添加了浮动属性之后&#xff0c;父盒子高度为0 <template><div class"father"><div class"son"&…

基于命名实体链接的事件抽取与知识图谱在电商领域的应用

开源项目推荐 多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口&#xff0c;功能强大&#xff0c;欢迎体验。 多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口…

代码还原之 函数

指令堆里逆向出来的代码有歧义&#xff0c;有三处返回&#xff0c;有嵌套IF语句&#xff0c;故推断出是个函数&#xff1b; #if 0/*27ec: 48 8d 3d 58 39 00 00 lea 0x3958(%rip),%rdi # 614b <_IO_stdin_usedBase0x14b> // rdi"COLUMNS"27f3: e8 e…

Express学习(三)

Express中间件 中间件的概念 什么是中间件 中间件&#xff0c;特指业务流程的中间处理环节。Express中间件的调用流程 当一个请求到达Express的服务器之后&#xff0c;可以连续调用多个中间件&#xff0c;从而对这次请求进行预处理。类似于下图所示 Express中间件的格式 Expr…

安卓SDK dx工具生成dex文件命令

目录 前言一、添加到环境变量二、命令示例 前言 在Android SDK 工具中&#xff0c;dx命令用于将Java字节码文件转换为Dalvik Executable&#xff08;dex&#xff09;文件&#xff0c;以便在Android设备上运行。 一、添加到环境变量 找到想要使用的SDK版本&#xff0c;将dx.b…

C++11 新特性 增加数据类型

一.C11 新增加数据类型介绍 在C11中&#xff0c;新增了long long、unsigned long long、char16_t和char32_t等数据类型&#xff0c;它们可以支持更宽的整型和字符表示。 long long&#xff1a;long long是一种整数类型&#xff0c;它至少可以存储64位&#xff08;8字节&#x…

Offer必备算法12_链表_五道力扣题详解(由易到难)

目录 ①力扣2. 两数相加 解析代码 ②力扣24. 两两交换链表中的节点 解析代码 ③力扣143. 重排链表 解析代码 ④力扣23. 合并 K 个升序链表 解析代码1&#xff08;小根堆优化&#xff09; 解析代码2&#xff08;递归_归并&#xff09; ⑤力扣25. K 个一组翻转链表 解…

【从部署服务器到安装autodock vina】

注意&#xff1a;服务器 linux系统选用ubuntu 登录系统&#xff0c;如果没有图形化见面可以先安装图形化界面 可以参考该视频 --> linux安装图形化界面 非阿里云ubuntu 依次执行以下命令 sudo apt-get update sudo apt-get install gnome sudo reboot阿里云ubuntu 需多执…

Glip模型

Yolos 完全使用Transformer做目标检测 Detr 先使用CNN提取特征然后再使用transformerDetr和Yolos共同的缺点:需要事先知道所有的类别 Glip Zero-shot, 目标检测的类别可以不在训练类别中目标框进行视觉编码,然后和文本进行匹配文本和视觉特征是通过Clip模型提取的,所以视觉向…

从功能测试进阶自动化测试全套进阶指南,亲身经验分享

因为我最近在分享自动化测试技术&#xff0c;经常被问到&#xff1a; 功能测试想转自动化&#xff0c;请问应该怎么入手&#xff1f;有没有好的资源推荐&#xff1f; 那么&#xff0c;接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。&#xff08;学习路线放…

蓝桥杯python常用内置函数

一、 abs() #返回数字的绝对值 例&#xff1a; 二、 all() #判断给定的可迭代参数中的所有元素是否都为True&#xff0c;若是则返回True&#xff0c;反之返回False 例&#xff1a; 三、 any() #判断给定的可迭代参数是否都为False&#xff0c;全为False则返回False&am…

光明网发布稿件多少钱?新闻投稿低价渠道推荐,附光明网价格明细表

想要在光明网发稿&#xff1f;不知道费用是多少&#xff1f;媒介多多告诉你答案&#xff01; 在当今数字化时代&#xff0c;媒体平台的重要性日益突出&#xff0c;而光明网作为国内知名的新闻门户网站&#xff0c;吸引了大量的目标受众。许多企业和个人都希望能够在光明网上投…

Dubbo-记录

1.概念 Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo 提供的丰富服务治理…