【优秀python案例】基于Python的京东商城口红商品的爬虫与可视化的设计与实现

news2024/11/25 11:00:17

摘要随着互联网的普及,网络购物已经成为了人们购物的首选,用户只需要在电商平台上进行自己喜欢的商品进行搜素,就可以得到成千上万条商品信息。而在购买商品时,商品价格就成为了用户的主要关注对象,而在一些特殊的日子里,例如618、双十一等等,许多商品都会降价以此来吸引顾客,降价的多少也成为了用户浏览商品的一个因素。因此,对商品降价的分析对用户是否购买该商品提供了对比性,具有一定的意义。该系统基于python的各种库来实现,分为获取京东商城口红商品的信息进行可视化分析。

1系统开发背景

随着互联网的普及,网络购物已经成为了人们购物的首选,用户只需要在电商平台上进行自己喜欢的商品进行搜素,就可以得到成千上万条商品信息。而在购买商品时,商品价格就成为了用户的主要关注对象,而在一些特殊的日子里,例如618、双十一等等,许多商品都会降价以此来吸引顾客,降价的多少也成为了用户浏览商品的一个因素。因此,对商品降价的分析对用户是否购买该商品提供了对比性,具有一定的意义。

基于网络爬虫的搜索引擎研究与实现,在当今网络中已非常普及。目前比较流行的搜索引擎代表有谷歌,百度,搜狗等。合理地使用好算法抓取页面,才是网络爬虫实现的核心。

爬虫又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动的抓取互联网中网页或者脚本,而影评搜索需要特定的收集,使得数据更加具有目的性。传统的爬虫是从一个或者多个初始url开始,不断的从当前页面抽取新的url进行搜索,直到满足一定条件才会停止。而聚集爬虫是根据一定的网页分析算法过滤于主体无关的链接,并将其放入等待抓取的url队列中,然后进行一定的分析,过滤,并建立索引,以便之后的查询和检索。网页的抓取策略可以分为深度优先,广度优先和最近优先三种。

2系统相关技术介绍

本文主要是基于python语法和其强大的库来实现系统的多种功能。

2.1 Python语言

  Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。

  Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。

2.2 request库

Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,是网络爬虫中及其重要的组成成分。

2.3 lxml

lxml是XML和HTML的解析器,其主要功能是解析和提取XML和HTML中的数据;lxml和正则一样,也是用C语言实现的,是一款高性能的python HTML、XML解析器,也可以利用XPath语法,来定位特定的元素及节点信息,HTML是超文本标记语言,主要用于显示数据,他的焦点是数据的外观,XML是可扩展标记语言,主要用于传输和存储数据,他的焦点是数据的内容

2.4 Matplotlib库

matplotlib是一个python的绘图库,它以各种硬拷贝格式和跨平台的交互式环境出版生成质量级别的图形,它能输出的图形包括折线图,散点图,直方图等,在数据可视化方面,matplotlib强悍的绘图能力能够帮助我们对数据形成非常清晰直观的认知。

2.5 pandas

pandas是基于numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

2.6 time

Time库在爬虫的应用,主要是作为延迟或者限制爬虫频率的用途,对降低爬虫频率,对抗网站反爬虫措施意义重大

2.7 random

随机数在计算机应用中十分常见Python通过random库提供各种伪随机数基本可以用于除加密解密算法外的大多数工程应用。这里的话主要是用来产生一个随机时间来使用,配合时间库降低爬虫频率。

3系统分析与设计

3.1系统功能模块组成

本系统主要由京东口红商品数据采集、京东口红商品数据处理、京东口红商品可视化等模块组成。

     

1 系统功能模块

这里将通过requests库结合xpath解析,来获取某东商城前20页,每页60个口红商品,共数百条条口红商品数据,包括商品的ID,名称,价格,店名,是否自营,地址链接,评论数(京东无直接销量数据,评论数相当于销量数据)以及好评率等数据,并使用pandas库对数据进行清洗与分析matloplit进行可视化

4系统实现

本部分将对系统每个模块的实现和核心代码进行介绍。……

4.1 数据采集模块

本案例中采集的口红商品数据是在某东商城官网搜索框输入"口红",搜索得到的前20页口红商品的数据,如下图:

4.1.1 页面分析

通过下滑商品页面,可以发现有新的数据加载进来,点击跳转到页面2,发现url地址中page从1变成了3,所以说明,页面1中可能包含了page=1和page=2两个url地址。

点击新加载的元素,可以看到其url中的page已经由1变为2,说明页面1中前30个商品是page=1的url获取的,而后30个商品是page=2的url获取的。所以总结下来,我们要获取前20页共1000+的商品数据,page需要从1变到40。

# page从1到40,即可加载到前20个页面的商品url = f"https://search.jd.com/Search?keyword=%E5%8F%A3%E7%BA%A2&qrst=1&wq=%E5%8F%A3%E7%BA%A2&sto

通过请求上述url网址,我们便可以遍历每一个商品,通过xpath解析,得到目标数据。实际操作过程中发现,评论数的数据无法获取(百度说是由于网页的异步渲染导致的),解决办法是借助某东的评价汇总网站,结合商品的ID,进行提取评论数及好评率等数据。

4.1.2 采集程序

经过多次尝试,最终使用以下程序采集成功。

首先导入需要用到的库,并对requests请求进行UA伪装:

# 导入库

import requests

import pandas as pd

from lxml import etree

import timeimport random
headers = {    "Accept-Encoding": "Gzip",  # 使用gzip压缩传输数据让访问更快    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36",    # "Cookie": cookie    }

采集每个url页面信息获取评论数据信息(容易被封ip,建议将等待时间设置长一点)

# 网页是动态刷新的虽然页面1,2显示的url链接中page是1,3。但实际上第一页中前30个商品为page1,后30个商品为page2
def get_html(page):
    url = f'https://search.jd.com/Search?keyword=%E5%8F%A3%E7%BA%A2&qrst=1&wq=%E5%8F%A3%E7%BA%A2&stock=1&pvid=148fb7e5c10b4f879ef1e245c89ecb24&page={page}'
    r = requests.get(url, headers=headers)
    time.sleep(random.randint(1, 3)) # 设置等待时间,预防被网站封IP
    return r

# 获取总评数和好评率
def get_comments(pid):
    comment_url = "https://club.jd.com/comment/productCommentSummaries.action?referenceIds="
    comment_url += pid
    comment_r = requests.get(comment_url,headers=headers)
    time.sleep(random.randint(3, 5)) # 设置等待时间,预防被网站封IP,亲测该网站很限制ip访问频率,所以等待时间设置久一点。
    comment_sum = comment_r.json()["CommentsCount"][0]
    return comment_sum

获取商品其他信息,这里使用了pandas中的dataframe数据结构提取数据,然后在存为csv格式。

采集过程如下

最终得到的数据如下

Pandas读取数据,获得数据的结构为(1199行×8列)

import pandas as pddata = pd.read_csv('京东口红信息.csv')# 给数据加上表头

data.columns=['ID','name','price','store_name','self_run','url_list','CommentCount','GoodRate']
print(data.shape) # 输出结果为: (1199,8)

4.2 数据清洗

数据清洗包括将重复的数据进行删除;对评论数中的'万'及'+'进行替换,从而让程序能更好的分析、比较数据;提取某东自营的数据,并将商家名中的品牌提取出来,统计某东自营在售的销量>10万+的口红品牌。

4.2.1 删除重复数据

import pandas as pddata = pd.read_csv('京东口红信息.csv')


# 给数据加上表头

data.columns=['ID','name','price','store_name','self_run','url_list','CommentCount','GoodRate']
# 去除重复值data = data.drop_duplicates()print(data)

去掉重复值之后,保留了1018个有效数据

4.2.2 替换'万'字

# 将'万'字替换data['CommentCount'] = data['CommentCount'].str.replace('+','').str.replace('万','0000')print(data.CommentCount)

打印输出评价数量列,替换成功

4.2.3 提取自营店及口红品牌

# 提取自营商家及口红品牌data = data[data['store_name'].str.contains('京东自营')]data.reset_index(inplace=True)
data1 = data.store_name.str.split('京东自营',expand = True)data1.columns=['品牌','店名']data['品牌'] = data1['品牌']data = data.drop(columns='index')data.to_csv('自营商品信息提取.csv',index=False)print(data)

处理后数据如下:

4.3 数据统计

4.3.1 商品价格分布

如下图可知,口红价格多分布在500以下,0-250之间的最多。

实现代码:

import pandas as pd

import matplotlib.pyplot as plt

# 读取所有数据

df1 = pd.read_csv('去除重复值后数据.csv')# 商品价格分布df1.price.plot.hist(bins=20)plt.show()

4.3.1 不同价格区间分布

按照0-100,100-200,200-300,300-600,600-1000,1000+分类统计,可以发现0-100区间的口红占比最多,达到了34.1%!

实现代码如下:

bins= [0,100,200,300,600,1000,999999]price_Num = df1['price'].groupby(pd.cut(df1.price, bins= bins)).count().to_frame('数量')print(price_Num)labels = price_Num.indexsizes = price_Num['数量']explode = (0.1,0, 0, 0, 0, 0)
fig1, ax1 = plt.subplots(figsize=(10,8))patches, texts, autotexts = ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',                                    shadow=True, startangle=90)
plt.tight_layout()plt.show()

4.3.2 评论数分布(销量相关)占比图

由下图可知:

大多数销量在1万-10万之间,占比达31.1%,100万+的商品占比15%!

实现代码如下:

bins= [0,100,200,500,1000,5000,10000,100000,1000000]comment_Num = df1['CommentCount'].groupby(pd.cut(df1.CommentCount, bins= bins)).count().to_frame('数量')labels = list(comment_Num.index)[:7]labels.extend(['1000000+'])comment_Num = df1['CommentCount'].groupby(pd.cut(df1.CommentCount, bins= bins, labels=labels)).count().to_frame('数量')labels = comment_Num.indexsizes = comment_Num['数量']explode = (0,0, 0, 0, 0, 0,0.1,0)
fig1, ax1 = plt.subplots(figsize=(10,8))patches, texts, autotexts = ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',                                    shadow=True, startangle=90)plt.tight_layout()plt.show()

4.3.3 统计销量>10万+的自营口红品牌

打印输出十万加的口红品牌:

['兰蔻', 'YSL圣罗兰', '迪奥(Dior)美妆', 'MAC魅可', 'ARMANI阿玛尼美妆', 'GIVENCHY纪梵希', '花西子', '迪奥(Dior)海外', '美宝莲', '卡姿兰', '欧莱雅', '完美日记', '3CE', 'colorkey', 'Pink Bear']

代码实现如下:

# 读取所有数据df1 = pd.read_csv('自营商品信息提取.csv')
df2 = df1[df1['CommentCount']>=100000]
lst1 = df2['品牌'].valuestemp = [][temp.append(i) for i in lst1 if not i in temp]
print(temp)

4.3.4 自营口红品牌的商品种类

如下图

代码如下:

df1 = pd.read_csv('自营商品信息提取.csv')
df2 = df1.groupby(by='品牌').count()['ID']data = df2.sort_values(ascending=False)
print(data)

4.3.5 取口红种类前20的品牌进行绘制条形图

自营商品中,种类排名前20的品牌如下图所示

代码实现如下:

df1 = pd.read_csv('自营商品信息提取.csv')
df2 = df1.groupby(by='品牌').count()['ID']data = df2.sort_values(ascending=True)
x = data[-21:-1].indexy = data[-21:-1].values
plt.barh(x,y)plt.xlabel('商品种类')
plt.tight_layout()plt.show()

5系统开发总结

本系统主要介绍了如何用python爬取某东口红前20页的商品数据,并对数据进行清洗和分析。从三个层面分析,结构简单,脉络清晰。在开发过程中自然遇到很多问题,通过查阅书籍,向同学求助,网上查询,这些问题都能够逐一解决。

当然,此系统还存在诸多不足之处,涉及反爬措施不足等,后续会加以完善。

参考文献

[1] 崔庆才.python3网络爬虫实战演练[M].北京:人民邮电出版社,2018: 4-7.

[2] 刘瑜.python零基础到项目实战[M].北京:中国水利水电出版社,2018: 10-1.

[3] 明日科技.python项目开发样例集锦[M].吉林:吉林大学出版社,2019: 3-1.

[4] 连晓峰.python强化实战[M].北京:机械工业出版社,2019: 1-1.

[5] 包永帅.python应用开发实战[M].北京:人民邮电出版社,2018: 6-1.

[6] 王国辉.python从入门到项目实战[M].吉林:吉林大学出版社,2018: 8-1.

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

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

相关文章

深入理解 go context

打个广告:欢迎关注我的微信公众号,在这里您将获取更全面、更新颖的文章! 原文链接:深入理解 go context 欢迎点赞关注 context 介绍 context 是 Go 语言中用于处理并发操作的一个重要概念。context也被称作上下文,主要…

vue基础知识总结(2)--- axios的使用

一.下载Vue3: 选择自己想要下载的项目文件夹,cmd回车打开命令栏,执行 : cnpm init vuelatest 然后等待一会就可以创建一个项目,并更改项目名: √ 请输入项目名称: ... vue-project 之后按照…

python做简单爬虫的一些常用组件

文章目录 前言requestjsonbs4 前言 最近一直在做零散的一次性的爬虫工作,基本都是用python开发的,整理一下python做小规模爬虫开发常用的一些工具类 request python最简单的发http请求的包,request.get和request.post就可以搞定绝大部分的…

ECMA6Script学习笔记(五)

【摘要】 本文是对自己学习ES6的学习笔记回顾,后面是概要: 本文介绍了ES6中的对象创建和拷贝方法。对象创建方面,ES6通过class关键字支持了面向对象的语法糖,包括属性设置、getter和setter方法、构造器、静态方法以及私有属性的定义。同时,展…

Linux系统root账号密码破解(重置)

如果想不起root账号密码应该怎么做? 先关机再重新启动(重启虚拟机)做相关操作,开机时不能让服务器完全启动,需要把开机引导系统(GRUB)调出来 注:在实际生产环境中使用的Linux没有图…

四,系统规划

一,企业系统规划法BSP(2009、2010、2018,步骤以及优缺点、用到的工具) 企业系统规划法(Business Systems Planning,BSP)是IBM公司20世纪70年代提出的一种结构化的信息系统规划方法。该方法通过…

Spring Cloud微服务项目公共类抽取

在微服务架构中,代码的重用性和维护性是非常重要的。Spring Cloud 提供了丰富的工具和框架来帮助我们构建和管理微服务应用,但随着项目规模的扩大,我们会遇到大量的重复代码和相似的逻辑。在这种情况下,抽取公共类成为提高代码质量…

回归测试:保障软件质量的利器

目录 前言1. 回归测试的概念1.1 定义1.2 目标 2. 回归测试的主要作用2.1 确保系统稳定性2.2 提高软件质量2.3 节省维护成本 3. 回归测试在整个测试中的地位3.1 单元测试阶段3.2 集成测试阶段3.3 系统测试阶段3.4 验收测试阶段 4. 回归测试的主要工具4.1 Selenium4.2 JUnit4.3 J…

《Redis设计与实现》读书笔记-数据结构(SDS)

目录 SDS定义 SDS结构 SDS与C字符串结构差异 SDS优点 SDS扩容策略 SDS惰性空间回收 SDS定义 SDS(简单动态字符串),用于代替C语言自身的字符串(字符容量与字符数组强相关)。 SDS结构 sdshdr{int free //sds 中…

预警系统最小例程构建

预警系统最小例程构建 引言 为了更直观, 我们使用最小例程来实现这个预警流程, 环境温湿度读取,然后判断阈值, 超标则触发小灯警报。 最小例程工程备份链接: https://ww0.lanzoul.com/iz4wd261k21i 仿真文件工程备份链接: https://ww0.lanzoul.com/i8vTn261syyb 文章目录…

Jeecgboot仪表盘设计器使用https时访问报错

问题 仪表盘设计器设计好后,Nginx配置域名发送https请求时,/drag/page/queryById、/drag/page/addVisitsNumber仍发送http请求。导致发送下面错误: 原因 仪表盘设计器里设计的页面是由后端生成返回给前端的,后端是根据后端服…

docker安装elasticsearch(es)最新版本

docker安装elasticsearch(es) docker官网 https://hub.docker.com/ https://www.cnblogs.com/balloon72/p/13177872.html 1、拉取最新项目elasticsearch docker pull elasticsearch:8.14.3lscpu 查看架构 2、构建环境 mkdir -p /data/elasticsear…

【TOOLS】Project 2 Maven Central

发布自己的项目到maven中央仓库 Maven Central Account 访问:https://central.sonatype.com/,点击右上角,根据提示注册账号 构建User token ,用于访问中央仓库的API: 点击右上角,查看账户点击Generate Us…

医院体检信息管理系统,C#体检系统源码,健康体检系统PEIS

体检服务全流程 检前 检前注意事项提醒-体检预约-套餐选择-体检签到-费用缴纳 检中 科室队列提醒-增项检中支付 检后 报告查询-体检百科-报告解读-问卷调查 体检管理系统模块介绍 一、登记管理模块 登记体检者基本信息,包括唯一的体检编号,姓名、…

Windows 10+Visual Studio2019 Opencv-C++安装配置

前往官网下载需要的版本Releases - OpenCVhttps://opencv.org/releases/ 1.下载并解压OpenCV 我选择4.6.0,点击windows版本,进行下载 2.配置项目属性 打开你的Visual Studio 2019项目 -> 右击项目名,选择“属性” 注:整个配…

【C语言】指针基础知识理解【续】

1. ⼆级指针 指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?这就是 ⼆级指针 。 1.1 引入二级指针 由于一级指针已经很熟悉,这里就不再赘述,这里我们重点探讨二级指针 下面先简单使用一个二级指针看…

机器学习之——支持向量机(SVM)技术详解

机器学习之——支持向量机(SVM)技术详解 1. 支持向量机的基本原理1.1 超平面1.1.1 定义与作用1.1.2 高维空间中的超平面 1.2 间隔最大化1.2.1 间隔的定义1.2.2 最大化间隔的原则 1.3 支持向量1.3.1 支持向量的定义1.3.2 支持向量的作用 2. SVM的数学基础…

Vue3 加载条(LoadingBar)

效果如下图:在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小,单位 pxnumber2falsecolorLoading加载中颜色string‘…

快速识别音频文件转成文字

一、SenseVoice概述 阿里云通义千问开源了两款语音基座模型 SenseVoice(用于语音识别)和 CosyVoice(用于语音生成)。 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测,有以下特点: 多语言…

4000元投影仪性价比之王:爱普生TW5750极米RS10还是当贝X5S?

买投影很多人会倾向于买大品牌或者是销量最好的那几款,首先是大品牌售后更有保障,口碑和销量也间接证明了这款投影是否值得买。这几年国内投影市场中爱普生、极米、当贝这三家投影品牌无论是在产品、口碑、售后服务等方面都是最好的,被用户们…