专栏名称: EasyCharts
EasyCharts,易图表,我们将定期推送各种数据可视化与分析教程,包括Excel(Power BI)、Origin、Sigmaplot、GraphPad、R、Python、Matlab、Tableau、D3.js等。
目录
相关文章推荐
前端早读课  ·  【早阅】Chrome 133+ 全新 ... ·  昨天  
青海政务  ·  2025,聚焦青海两会 ·  2 天前  
青海政务  ·  2025,聚焦青海两会 ·  2 天前  
51好读  ›  专栏  ›  EasyCharts

在天猫网页上抓取数据和分析情况报告

EasyCharts  · 公众号  · 前端  · 2017-07-14 08:00

正文

声明


作者:李博,

原文首发于作者知乎,

本文已获作者授权原创形式发布,

欢迎点击【阅读原文】关注支持!


今天的文末

真的有彩蛋

真的有彩蛋

真的有彩蛋


1

会了看网页源代码

01. 我使用 Chrom 浏览器,在天猫上搜索笔记本电脑,然后选择品牌为 Lenovo / 联想。

02. 按下 CTRL+SHIFT+C。当鼠标放到该宝贝页面的任何位置是,可以看到相应的源代码。而宝贝的图片、价格、品牌名称、卖家以及月销量等数据都是包含在

...
块中。

03. 每一个 div 都可以展开。每一条都有对应的网页显示,当点击源代码时,网页上显示一层覆膜盖在相关的文字和图片上,表明这两个是对应的。

2

启动 R 进行工作

01. 安装 rvest 并加载 rvest 包

02. 保存搜索链接对象到 gurl。即把需要抓取的网页地址复制过来。

gurl

03. 抓取数据对象保存到 SCdata 中。即从源代码中提取出有用的部分——"div.product-iWrap"(相当于是一个目录,我们从整个源代码块中筛选出我们需要的目录)。

#%>%是管道操作符,意思是把左边的操作结果作为参数传递给右边的函数。

#div.product-iWrap是CSS选择器的语法,即div class="div.product-iWrap"

> SCdata %

+   read_html(encoding="GBK")%>%#读取gurl的链接,并指定编码为gbk.

+   html_nodes("div.product-iWrap")#筛选出所有包含在

...
块的内容

运行结果如下(仅为一小部分):

>SCdata

{xml_nodeset (60)}

 [1]

\n
\n [2]
\n
\n [3]
\n
\n [4]
\n
\n [5]
\n
\n [6]
\n
\n04. 从对象 SCdata 中继续筛选,获取卖家名称等数据。

需要掌握几个函数的基本使用:

#html_attr("data-nick")是从html_nodes()筛选出的标签中,查找data-nick属性的值。

#gsub()是字符串查找替换的函数,pattern是指定用来查找的正则表达式。

#html_nodes("p.productTitle>a[title]"),">"指定的筛选条件的标签

#html_text()只抓取内容标签>中的内容部分


#抓取卖家店铺名称和ID

> SCdata %

+   read_html(encoding="GBK")%>%#读取gurl的链接,并指定编码为gbk.

+   html_nodes("div.product-iWrap")#筛选出所有包含在

...
块的内容

> #抓取卖家昵称和ID

> sellerNick% html_nodes("p.productStatus>span[class]") %>%

+   html_attr("data-nick")

> sellerID% html_nodes("p.productStatus>span[data-atp]") %>%

+   html_attr("data-atp") %>%

+   gsub(pattern="^.*,",replacement="")


> #抓取宝贝名称等数据

> itemTitle% html_nodes("productTitle>a[title]") %>%

+   html_attr("title")#暂时未能输出结果,先放下,后面再请教作者并尝试。


> itemID%html_nodes("p.productStatus>span[class]") %>%

+   html_attr("data-item")


> price% html_nodes("em[title]") %>%

+   html_attr("title") %>%

+   as.numeric


> volume% html_nodes("span>em") %>%

+   html_text


> #最后保存成数据框对象并存盘备用,以及写入csv文件

> options(stringsAsFactors = FALSE) #设置字符串不自动识别为因子

> itemData

+                      sellerID=sellerID,

+                      itemID=itemID,

+                      price=price,

+                      volume=volume)

> save(itemData,file = "E:/R语言笔记/R语言第七章/itemData.rData")

> write.csv(itemData,file = "E:/R语言笔记/R语言第七章/itemData.csv")

抓取并写入后部分结果

总体代码汇总如下:

> install.packages("rvest")

> # 加载包

> library(rvest)

载入需要的程辑包:xml2

> #保存搜索链接对象到gurl

> gurl

> #抓取数据对象保存到SCdata中

> #%>%是管道操作符

> #意思是把左边的操作结果作为参数传递给右边的命令

> #div.product-iWrap是CSS选择器的语法,即div class="div.product-iWrap"

> SCdata%

+   read_html(encoding="GBK")%>%#读取gurl的链接,并指定编码为gbk.

+   html_nodes("div.product-iWrap")#筛选出所有包含在

...
块的内容

> #从对象SCdata继续筛选,获取卖家名称等数据

> #html_attr("data-nick")是从html_nodes()筛选出的标签中,查找data-nick属性的值。

> #gsub()是字符串查找替换的函数,pattern是指定用来查找的正则表达式。

> #html_nodes("p.productTitle>a[title]"),">"指定的筛选条件的标签

> #html_text()只抓取内容标签>中的内容部分

> #抓取卖家昵称和ID

> sellerNick% html_nodes("p.productStatus>span[class]") %>%

+   html_attr("data-nick")

> sellerID% html_nodes("p.productStatus>span[data-atp]") %>%

+   html_attr("data-atp") %>%

+   gsub(pattern="^.*,",replacement="")

> #抓取宝贝名称等数据

> itemTitle% html_nodes("productTitle>a[title]") %>%

+   html_attr("title")#暂时未能输出结果,先放下,后面再请教作者并尝试。

> itemID%html_nodes("p.productStatus>span[class]") %>%

+   html_attr("data-item")

> price% html_nodes("em[title]") %>%

+   html_attr("title") %>%

+   as.numeric

> volume% html_nodes("span>em") %>%

+   html_text

> #最后保存成数据框对象并存盘备用,以及写入csv文件

> options(stringsAsFactors = FALSE) #设置字符串不自动识别为因子

> itemData

+                      sellerID=sellerID,

+                      itemID=itemID,

+                      price=price,

+                      volume=volume)

> save(itemData,file = "E:/R语言笔记/R语言第七章/itemData.rData")

> write.csv(itemData,file = "E:/R语言笔记/R语言第七章/itemData.csv")


3

进行数据分析

生成了 itemData 数据为. csv 文件,在预览是提示需要保存为. excel 文件。在本例中可以直接进行分析。本例只抓取了天猫上一个页面的综合数据(笔记本电脑 - 联想品牌,未使用其它筛选条件,保持天猫首页给出数据的原始性),数据量较小,不具有充分的代表性和实际意义,仅为实践操作。

01. 直接进行预处理

参照实践课程的处理方式,删除所有含有缺失数据的行。虽然数据样本可能是完整的,但是在分析数据是严谨细致是必须的。使用 na.omit() 函数可以删除所有含有缺失数据的行,可以使用 newData

> itemData

> itemData

也可采取同样的方法对销售的数量 volume 进行操作,目的是保证后期重要数据的有效性。

02. 进行列名重命名工作

使用 fix() 函数调出编辑器即可。或者使用 names() 函数来重命名。

调出编辑器后情况

03. 处理销售数量列

本例不涉及日期。本例子中较为有用的信息主要是 price、volume、sellerNick。本例需要处理的是 volume,从中分离出销售数量,即从 384 笔中提取出 384。具体使用字符串中的 str_extract() 函数:

> library(stringr)#载入字符串

> Newvolume

#+号的意思是输出识别到所有数字。

> Newvolume

[1] "363"  "493"  "123"  "491"  "365"  "929"  "670"  "439"  "143"  "98"  

[11] "153"  "1465" "1270" "110"  "522"  "128"  "473"  "277"  "345"  "161" 

[21] "215"  "87"   "64"   "190"  "116"  "107"  "38"   "567"  "126"  "85"  

[31] "201"  "359"  "106"  "13"   "92"   "147"  "2"    "167"  "79"   "66"  

[41] "51"   "56"   "61"   "106"  "11"   "19"   "38"   "69"   "27"   "60"  

[51] "14"   "17"   "12"   "25"   "33"   "11"   "44"   "2"    "36"   "14" 

> NewData

> save(NewData,file = "E:/R语言笔记/R语言第七章/NewData.rData")

> write.csv(NewData,file = "E:/R语言笔记/R语言第七章/NewData.csv")

打开输出的文件 Newdata 查看了一下,数据转换正常。

04. 对 Newvolume 和 price 进行类型转换。

> class(NewData$newvolume)#先查看类别

[1] "character"

> class(NewData$price) #先查看类别

[1] "numeric"

> NewData$newvolume

> NewData$price

> class(NewData$newvolume)#进行再次查看

[1] "numeric"

> class(NewData$price) #进行再次查看

[1] "numeric"

05. 排序

可以使用 order() 函数对一个数据框进行排序,按照 Newvolume 对数据进行升序排序。

NewData


四、对数据的分析运用

目的一:计算样本中联想电脑的均价,销售数量的均值,并以此计算出总样本平均的销售价格。
目的二:销售总金额
目的三:绘制价格 - 销售数量图(箱线图和点图)

01. 计算联想电脑均价

> shopkpi1

> shopkpi1#计算抓取总的店铺数量(包括重复的店铺,因为存在价格不同、销售数量不同的情况)

[1] 60

> totalPrice

> averagePrice

> averagePrice#求出均价

[1] 4383.617

这里计算了一下联系电脑价格四分位数:
可以看到样本中求取得平均价格 4383.617 比 60% 的临界点小,比 40% 的临界点大,但更靠近 60% 的临界点,也就是说均价处于中等偏上位置。

> y

> y#求取分位数

 80%  60%  40%  20% 

5179 4539 3979 3479 

> z

> z#价格中位数

[1] 4324

> min(NewData$price)#求取最小值

[1] 2488

> max(NewData$price)#求取最大值

[1] 8399

> #绘制箱线图

> boxplot(NewData$price,main="联想电脑价格箱线图",ylab="Price")

联想电脑价格箱线图

02. 计算销售数量的均值

> shopkpi1

> shopkpi1

[1] 60

> totalVolume

> averageVolume

> totalVolume

[1] 12495

> averageVolume#店铺的平均销量为208.25笔交易(表示为已经收到货,

#且确认付款的交易,不包括未确认收获的交易情况,同时这也不是一个完整月的交易量,数据截止到2017.04.23)

[1] 208.25

03. 计算截止目前四月份销售总金额

> totalmoney

> totalmoney#抓取得页面中联系电脑总销售金额将近五千万

[1] 48700684

04 绘制价格 - 销量图

a.绘制最优拟合图

> #绘制最优拟合曲线图

> attach(NewData)

> plot(NewData$price,NewData$newvolume)

> abline(lm(NewData$price~NewData$newvolume))

> title("联想电脑价格和销售量关系图")

> detach(NewData)

联想电脑价格和销售数量拟合图

看来市场经济的规律是对的,需求第一定律说:无论何时何地,价格提高,商品的需求量就减少,价格降低到一定程度,需求量就一定会增加。

b. 绘数点图

dotchart(NewData$newvolume,labels = NewData$price,cex = .7,

         main = "销售数量和价格关系",

         xlab="销售数量")

价格和销量点数图

关于点数图,想进行分类别处理,目前还在探索中,后续会更新。

如需转载请联系EasyCharts团队!


说好的,彩蛋呢

今天的彩蛋就是

《Excel数据之美》42元 (近6折)

抱回家啦!

PS:

本书的电子书也登录亚马逊啦!

喜欢电子书的童鞋不要错过哦!


目前历史新低,

+ 大力折扣,

不要犹豫啦!


废话不多说

直接上图


领券200-50戳

运气好还有199-100的券哦

【手快有,手慢无】

https://wqs.jd.com/event/juhui/wxbooklib/index.shtml

长按下方二维码跳转



购书链接:

https://wqitem.jd.com/item/view?sku=11986529

长按书右侧二维码直接跳转商品链接哦!

《Excel数据之美》简介戳

《Excel 数据之美--科学图表与商业图表的绘制》上市啦

快快和小伙伴一起凑单吧!

当然小编也给大家推荐其他几本超棒的书,

可以一起买买买哦!

长按书右侧二维码直接跳转商品链接哦!

https://wqitem.jd.com/item/view?sku=12210370

《SAS 编程演绎》简介戳:

我出了本书,这些年倒腾的经验都在这里啦!


https://wqitem.jd.com/item/view?sku=12125533

《竞争力 玩转职场Excel,从此不加班》简介戳:

我如何从一个Excel小白,成长为一个出书力作的Excel大神