【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 reimport 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.textans_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"] = iditem["price"] = priceitem["productName"] = prodectNameitem["comment"] = commentitem["storeName"] = storeNameitem["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']=UserCommentyield item
dealData.py
import jieba
import jieba.analyse
import pandas as pdimport pymysql as pl
from matplotlib import pyplot as plt
from wordcloud import WordCloudplt.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.htmlimport scrapyclass 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 interfaceclass 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 conndef 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.hqwc.cn/news/527086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PCtoLCD实现OLED汉字取模方法

0 工具准备 PCtoLCD2002 NodeMCU&#xff08;ESP8266&#xff09;&#xff08;验证OLED字模效果&#xff09; 0.96寸OLED显示屏 1 基于PCtoLCD实现OLED汉字取模方法 1.1 基础知识介绍 0.96存OLED显示屏包含128x64个像素点&#xff0c;x轴方向为128个像素点&#xff0c;y轴方向…

重学SpringBoot3-内容协商机制

重学SpringBoot3-内容协商机制 ContentNegotiationConfigurer接口配置内容协商URL参数Accept头使用Url扩展名 自定义内容协商格式步骤1: 注册自定义媒体类型步骤2: 实现HttpMessageConverter接口步骤3: 使用自定义HttpMessageConverter 注意点 在 Spring Boot 3 中&#xff0c;…

【共享内存】System V共享内存{通信原理/相关接口/代码测试}

文章目录 1.初识共享内存1.0浅谈System V1.1什么是共享内存&#xff1f;1.2Linux-System V共享内存1.3图解共享内存1.4对共享内存的理解 2.创建共享内存2.1共享内存如何创建&#xff1f;2.2代码运行与测试2.3shm与pipe的区别2.4shm缺乏访问控制 3.代码理解shm3.1Log.hpp3.2comm…

HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写

前面两篇文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作 和 HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 我们已经编写了 初始化 和 增删改 操作的基本逻辑 最后 收尾一下查询的函数 我们还是打开编辑器 然后 打开项目 找到 我们正在写的这个 relationalClass…

FPGA - 时钟Buffer的探究

1、IBUF : FPGA上所有的输入信号必须进过IBUF,vivado会自动给所有输入信号分配IBUF OBUF&#xff1a;FPGA上所有的输入信号必须进过IBUF,vivado会自动给所有输入信号分配OBUF BUFG:专用时钟的资源&#xff0c;目的是减少时钟抖动、增强时钟的驱动能力&#xff0c;vivado不会给信…

L2-2 老板的作息表(Python)

作者 陈越 单位 浙江大学 新浪微博上有人发了某老板的作息时间表&#xff0c;表示其每天 4:30 就起床了。但立刻有眼尖的网友问&#xff1a;这时间表不完整啊&#xff0c;早上九点到下午一点干啥了&#xff1f; 本题就请你编写程序&#xff0c;检查任意一张时间表&#xff0c…

Linux Docker安装redis缓存数据库

文章目录 一、查找Redis镜像二、拉取redis镜像三、创建数据目录和配置文件四、创建redis容器 一、查找Redis镜像 首先到docker镜像仓库下载redis镜像。地址&#xff1a;https://hub.docker.com/搜索redis&#xff0c;如下&#xff1a;找到对应想要下载的版本&#xff1a; 二、…

Leetcode - 二分查找 | 在排序数组中查找元素的第一个和最后一个位置

题目一&#xff1a;二分查找 二分查找 看到这道题之后&#xff0c;很快就能想到暴力的解法&#xff0c;把数组遍历一遍就能找到答案&#xff0c;时间复杂度O(n)。 假设存在一批数字[1&#xff0c;1&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#x…

面试宝典-【redis】

目录 1.什么是缓存穿透 ? 怎么解决 ? 2.什么是布隆过滤器 3.什么是缓存击穿 ? 怎么解决 ? 4.什么是缓存雪崩 ? 怎么解决 ? 5.redis做为缓存&#xff0c;mysql数据如何与redis进行同步?(双写) 6.排他锁是如何保证读写、读读互斥的呢&#xff1f; 7.你听说过延…

Java EE之wait和notify

一.多线程的执行顺序 由于多个线程执行是抢占式执行&#xff0c;就会导致顺序不同&#xff0c;同时就会导致出现问题&#xff0c;就比如俩个线程同时对同一个变量进行修改&#xff0c;我们难以预知执行顺序。 但在实际开发中&#xff0c;我们希望代码按一定的逻辑顺序执行&am…

C++ 多状态dp

目录 按摩师 打家劫舍 打家劫舍2 删除并获得点数 粉刷房子 按摩师 面试题 17.16. 按摩师 最大值问题 f : 预约此次的最长时间 g &#xff1a;不预约此次的最长时间 出现的错误&#xff1a;return max(f[n - 1]), g[n - 1]); 注意&#xff1a;①题目没给nums的范围&…

uniapp 云开发笔记

uniapp云开发官方文档https://uniapp.dcloud.io/uniCloud/learning.html 新建 关联云空间 云函数获取用户openID uniCloud API列表https://uniapp.dcloud.io/uniCloud/cf-functions.html#unicloud-api%E5%88%97%E8%A1%A8 自建云函数login event中包含前端传来的参数 uniCloud.…