1、批量型的网络爬虫
这种类型是针对用户有着明确的抓取范围和目标,当达到既定的目标之后,抓取工作就会停止。这个目标可以是抓取的时间,也可以是抓取的数量等 。
2、增量式网络爬虫
这种爬虫类型不同于批量型爬虫,没有固定的限制,且需要程序持续不断的运行,对于抓取到的数据定期的更新。它针对的是网页在不断变化的,增量式爬虫只需要抓取新产生或者发生新变化的网页,他不会重复的抓取没有变化的网页,这样可以缩减时间和存储空间,当然这种爬虫程序运行起来是相对有难度的。
3、通用爬虫
通用网络爬虫也叫作全网爬虫,它是搜索引擎抓取系统的重要组成部分。主要为门户 网站站点搜索引擎和大型 Web 服务提供商采集网络数据。这类网络爬虫的爬行范畴和数量比较大,所以对于爬取速度和存储空间的要求很高。
4、聚焦网络爬虫
聚焦网络爬虫是指有针对性的爬取,和通用网络爬虫相比对于硬件的要求有所降低,而且所抓取的数据垂直性更高,可以满足特定人群的需求。
根据网上公开访问可见数据资料用Spyder爬京东鞋子数据。
大的原则上,在网上能公开访问的可见的数据资料都是有办法爬取到的,京东上是有部分的订单成交数据的,所以这些也是可以爬取的。某宝中的楚江数据,数据采集工作可以代写爬虫,也可以直接让他们爬取数据。
京东商品评论信息是由JS动态加载的,所以直接抓取商品详情页的URL并不能获得商品评论的信息。因此我们需要先找到存放商品评论信息的文件。这里我们使用Chrome浏览器里的开发者工具进行查找。
具体方法是在商品详情页点击鼠标右键,选择检查,在d出的开发者工具界面中选择Network,设置为禁用缓存(Disable cache)和只查看JS文件。然后刷新页面。页面加载完成后向下滚动鼠标找到商品评价部分,等商品评价信息显示出来后,在下面Network界面的左侧筛选框中输入productPageComments,这时下面的加载记录中只有一条信息,这里包含的就是商品详情页的商品评论信息。点击这条信息,在右侧的Preview界面中可以看到其中包含了当前页面中的评论信息。(抓取价格信息输入prices)。
复制这条信息,并把URL地址放在浏览器中打开,里面包含了当前页的商品评论信息。这就是我们要抓取的URL地址。
仔细观察这条URL地址可以发现,其中productId=10001234327是当前商品的商品ID。与商品详情页URL中的ID一致。而page=0是页码。如果我们要获取这个商品的所有评论,只需要更改page后面的数字即可。
在获得了商品评论的真实地址以及URL地址的规律后,我们开始使用python抓取这件商品的700+条评论信息。并对这些信息进行处理和分析。
开始前的准备工作
在开始抓取之前先要导入各种库文件,这里我们分别介绍下需要导入的每个库文件的名称以及在数据抓取和分析中的作用。requests用于进行页面抓取,time用于设置抓取过程中的Sleep时间,random用于生产随机数,这里的作用是将抓取页面的顺序打乱,re用于在抓取后的页面代码中提取需要的信息,numpy用于常规的指标计算,pandas用于进行数据汇总和透视分析,matplotlib用于绘制各站图表,jieba用于对评论内容进行分词和关键词提取。
#导入requests库(请求和页面抓取)
import requests
#导入time库(设置抓取Sleep时间)
import time
#导入random库(生成乱序随机数)
import random
#导入正则库(从页面代码中提取信息)
import re
#导入数值计算库(常规计算)
import numpy as np
#导入科学计算库(拼表及各种分析汇总)
import pandas as pd
#导入绘制图表库(数据可视化)
import matplotlibpyplot as plt
#导入结巴分词库(分词)
import jieba as jb
#导入结巴分词(关键词提取)
import jiebaanalyse
将爬虫伪装成浏览器
导入完库文件后,还不能直接进行抓取,因为这样很容易被封。我们还需要对爬虫进行伪装,是爬虫看起来更像是来自浏览器的访问。这里主要的两个工作是设置请求中的头文件信息以及设置Cookie的内容。
头文件信息很容易找到,在Chrome的开发者工具中选择Network,刷新页面后选择Headers就可以看到本次访问的头文件信息,里面包含了一些浏览器的技术参数和引荐来源信息。将这些信息直接添加到代码中就可以,这里我们将头部信息保存在headers中。
#设置请求中头文件的信息
headers = {'User-Agent':'Mozilla/50 (Windows NT 61) AppleWebKit/53711 (KHTML, like Gecko) Chrome/230127164 Safari/53711',
'Accept':'text/html;q=09,/;q=08',
'Accept-Charset':'ISO-8859-1,utf-8;q=07,;q=03',
'Connection':'close',
'Referer':''
}
在查看头文件信息的旁边还有一个Cookies标签,点击进去就是本次访问的Cookies信息。这里的Cookies信息与前面头文件中的Cookie信息一致,不过这里更加清晰。把Request Cookies信息复制到代码中即可,这里我们将Request Cookies信息保存在Cookie中。
#设置Cookie的内容
cookie={'TrackID':'1_VWwvLYiy1FUr7wSr6HHmHhadG8d1-Qv-TVaw8JwcFG4EksqyLyx1SO7O06_Y_XUCyQMksp3RVb2ezA',
'__jda':'122270672150760763214234957051479785414147979455392',
'__jdb':'12227067211507607632|921479794553',
'__jdc':'122270672',
'__jdu':'1507607632',
'__jdv':'122270672|direct|-|none|-|1478747025001',
'areaId':'1',
'cn':'0',
'ipLoc-djd':'1-72-2799-0',
'ipLocation':'%u5317%u4EAC',
'mx':'0_X',
'rkv':'V0800',
'user-key':'216123d5-4ed3-47b0-9289-12345',
'xtest':'4657553d9798cdf31c02d86b8b81cc119d94836b7a782741f667201b54880c925faec4b'}
抓取商品评论信息
设置完请求的头文件和Cookie信息后,我们开始抓取京东商品评论的信息。前面分析URL的时候说过,URL中包含两个重要的信息,一个是商品ID,另一个是页码。这里我们只抓取一个商品的评论信息,因此商品ID不需要更改。但这个商品的评论有700+条,也就是有近80页需要抓取,因此页码不是一个固定值,需要在0-80之间变化。这里我们将URL分成两部分,通过随机生成页码然后拼接URL的方式进行抓取。
#设置URL的第一部分
url1=''
#设置URL的第二部分
url2='&pageSize=10&callback=fetchJSON_comment98vv41127'
#乱序输出0-80的唯一随机数
ran_num=randomsample(range(80), 80)
为了使抓取过程看起来更加随机,我们没有从第1页一直抓取到第80页。而是使用random生成0-80的唯一随机数,也就是要抓取的页码编号。然后再将页码编号与两部分URL进行拼接。这里我们只知道商品有700+的评论,但并不知道具体数字,所以抓取范围定位从0-80页。
下面是具体的抓取过程,使用for循环每次从0-80的随机数中找一个生成页码编号,与两部分的URL进行拼接。生成要抓取的URL地址并与前面设置好的头文件信息和Cookie信息一起发送请求获取页面信息。将获取到的页面信息进行汇总。每次请求间休息5秒针,避免过于频繁的请求导致返回空值。
#拼接URL并乱序循环抓取页面
for i in ran_num:
a = ran_num[0]
if i == a:
i=str(i)
url=(url1+i+url2)
r=requestsget(url=url,headers=headers,cookies=cookie)
html=rcontent
else:
i=str(i)
url=(url1+i+url2)
r=requestsget(url=url,headers=headers,cookies=cookie)
html2=rcontent
html = html + html2
timesleep(5)
print("当前抓取页面:",url,"状态:",r)
在抓取的过程中输入每一步抓取的页面URL以及状态。通过下面的截图可以看到,在page参数后面的页码是随机生成的并不连续。
抓取完80个页面后,我们还需要对页面进行编码。完成编码后就可以看到其中所包含的中文评论信息了。后面大部分苦逼的工作就是要对这些评论信息进行不断提取和反复的清洗。
#对抓取的页面进行编码
html=str(html, encoding = "GBK")
这里建议将抓取完的数据存储在本地,后续工作可以直接从本地打开文件进行清洗和分析工作。避免每次都要重新抓取数据。这里我们将数据保存在桌面的pagetxt文件中。
#将编码后的页面输出为txt文本存储
file = open("c:\\Users \\Desktop\\pagetxt", "w")
filewrite(html)
fileclose()
读取文件也比较简单,直接open加read函数就可以完成了。
#读取存储的txt文本文件
html = open('c:\\Users\\ Desktop\\pagetxt', 'r')read()
提取信息并进行数据清洗
京东的商品评论中包含了很多有用的信息,我们需要将这些信息从页面代码中提取出来,整理成数据表以便进行后续的分析工作。这里应该就是整个过程中最苦逼的数据提取和清洗工作了。我们使用正则对每个字段进行提取。对于特殊的字段在通过替换等方式进行提取和清洗。
下面是提取的第一个字段userClient,也就是用户发布评论时所使用的设备类型,这类的字段提取还比较简单,一行代码搞定。查看一下提取出来的字段还比较干净。使用同样的方法我们分别提取了以下这些字段的内容。
#使用正则提取userClient字段信息
userClient=refindall(r',"usefulVoteCount","userClientShow":(),',html)
#使用正则提取userLevel字段信息
userLevel=refindall(r'"referenceImage","userLevelName":(),',html)
#使用正则提取productColor字段信息
productColor=refindall(r'"creationTime","productColor":(),',html)
#使用正则提取recommend字段信息
recommend=refindall(r'"creationTime","recommend":(),',html)
#使用正则提取nickname字段信息
nickname=refindall(r'"creationTime","nickname":(),',html)
#使用正则提取userProvince字段信息
userProvince=refindall(r'"referenceImage","userProvince":(),',html)
#使用正则提取usefulVoteCount字段信息
usefulVoteCount=refindall(r'"referenceImage","usefulVoteCount":(),',html)
#使用正则提取days字段信息
days=refindall(r'"usefulVoteCount","days":()}',html)
#使用正则提取score字段信息
score=refindall(r'"referenceImage","score":(),',html)</pre>
还有一些字段比较负责,无法通过正则一次提取出来,比如isMobile字段,有些值的后面还有大括号。这就需要进一步的提取和清洗工作。
#使用正则提取isMobile字段信息
isMobile=refindall(r'"usefulVoteCount","isMobile":(),',html)
使用for循环配合替换功能将字段中所有的}替换为空。替换完成后字段看起来干净多了。
#替换掉最后的}
mobile=[]
for m in isMobile:
n=mreplace('}','')
mobileappend(n)
productSize字段中包含了胸围和杯罩两类信息,为了获得独立的杯罩信息需要进行二次提取,将杯罩信息单独保存出来。
#使用正则提取productSize字段信息
productSize=refindall(r'"creationTime","productSize":(),',html)
使用for循环将productSize中的第三个字符杯罩信息提取出来,并保持在cup字段中。
#提取杯罩信息
cup=[]
for s in productSize:
s1=s[3]
cupappend(s1)
创建评论的日期信息仅依靠正则提取出来的信息还是比较乱,无法直接使用。因此也需要进行二次提取。下面是使用正则提取出的结果。
#使用正则提取时间字段信息
creationTime1=refindall(r'"creationTime":(),"referenceName',html)
日期和时间信息处于前20个字符,在二次提取中根据这个规律直接提起每个条目的前20个字符即可。将日期和时间单独保存为creationTime。
#提取日期和时间
creationTime=[]
for d in creationTime1:
date=d[1:20]
creationTimeappend(date)
在上一步日期和时间的基础上,我们再进一步提取出单独的小时信息,方法与前面类似,提取日期时间中的第11和12个字符,就是小时的信息。提取完保存在hour字段以便后续的分析和汇总工作。
#提取小时信息
hour=[]
for h in creationTime:
date=h[10:13]
hourappend(date)
最后要提取的是评论内容信息,页面代码中包含的评论信息是重复的,因此在使用正则提取完后还需要对评论信息进行去重。
#使用正则提取评论信息
content=refindall(r'"guid","content":(),',html)
使用if进行判断,排除掉所有包含的评论信息,已达到评论去重的目的。
#对提取的评论信息进行去重
content_1=[]
for i in content:
if not "img" in i:
content_1append(i)
完成所有字段信息的提取和清洗后,将这些字段组合在一起生成京东商品评论数据汇总表。下面是创建数据表的代码。数据表生成后还不能马上使用,需要对字段进行格式设置,例如时间和日期字段和一些包含数值的字段。具体的字段和格式设置依据后续的分析过程和目的。这里我们将creationTime设置为时间格式,并设置为数据表的索引列。将days字段设置为数值格式。
#将前面提取的各字段信息汇总为table数据表,以便后面分析
table=pdDataFrame({'creationTime':creationTime,'hour':hour,'nickname':nickname,'productColor':productColor,'productSize':productSize,'cup':cup,'recommend':recommend,'mobile':mobile,'userClient':userClient,'userLevel':userLevel,'userProvince':userProvince,'usefulVoteCount':usefulVoteCount,'content_1':content_1,'days':days,'score':score})
#将creationTime字段更改为时间格式
table['creationTime']=pdto_datetime(table['creationTime'])
#设置creationTime字段为索引列
table = tableset_index('creationTime')
#设置days字段为数值格式
table['days']=table['days']astype(npint64)
#查看整理完的数据表
tablehead()
这里建议再次保存清洗和预处理完的数据表。我们这里将数据表保存为csv格式。到了这一步可以选择在Excel中完成后续的数据分析和可视化过程,也可以继续在python中完成。我们这里选择继续在python中完成后续的数据分析和可视化工作。
#保存table数据表
tableto_csv('jd_tablecsv')
数据分析及可视化
分月评论数据变化趋势
首先查看京东商品评论的时间变化趋势情况,大部分用户在购买商品后会在10天以内进行评论,因此我们可以近似的认为在一个月的时间维度中评论时间的变化趋势代表了用户购买商品的变化趋势。
现在回归正题,用过GooSeeker产品的人都知道,只要在网页上能看到的信息,就可以采集下来,所以,我对第一个问这个问题的人就很确定说可以做到,结果他是想要拿到商品下的所有sku库存值,就是说,不是第一次看到的那个总库存量,而是要把尺码、颜色都组合一遍,然后拿到对应的库存量。
想了一下,要采集单个sku库存也不难,利用GooSeeker爬虫特有的连续动作功能,通过指定要点击的属性对象,然后爬虫就可以自动点击各种属性组合,再把库存值爬取下来,也就是说,我们的爬虫帮你完成了点击和拷贝保存的工作。如果对采集sku感兴趣的话,我会在另一篇文章里分享怎么用GooSeeker爬虫实现自动点击采集sku库存。
sku、spu、item分别指什么
好了,说完上面的问题了,下面再说说电商领域,关于商品的一些概念吧。
sku:Stock Keeping Unit 库存单位
从库存的角度,可以看到剩下多少存货,要不要进货,有时也能反映出商品的热销程度,比如说,缺货的商品通常是很好卖的。从定义上看,sku是定义商品的最小单位,由商品的属性组合决定的,比如,对于服装来说,尺码、颜色等可以让买家选择的特征就是商品属性,拿上面的商品来说,尺码、颜色分别有3种选择,那这个商品就有33=9个sku,每个sku都有一个唯一编码,作用就像身份z那样,用来区分和记录不同属性组合的信息;
spu:Standard Product Unit 标准化商品
具体来说,spu是商品信息聚合的最小单位,在服装行业,就是指不同的品类,比如T恤、牛仔裤等等,在手机行业,就是具体到手机型号了,通常搜索一个spu,你会找到很多相同的商品,分别是由不同的商家在售,通俗地讲,spu就是指具有相同属性集合的一类商品吧。
Item:商品
在搜索关键词后,看到的那一个个商品,比如,搜索T恤,就会看到很多T恤,任意点击一个T恤(item)进到详情页面,然后选择颜色、尺码,看到的就是sku了,从范围大小上讲,spu>item>sku。
淘宝商品、京东商品的区别
最后还要说一下淘宝和京东在这3个概念的区别。
淘宝为了展示灵活,是用item来代表商品的,在商品网址里可以看到这个item的编号id,而sku是包含在item里的,没有单独的id,所以把尺码和颜色任意组合,商品网址都不会改变,在不选择任何属性组合时,你可以看到item的总库存,在选择了属性组合后,还可以看到单个sku库存;
以上就是关于网络爬虫的几种常见类型全部的内容,包括:网络爬虫的几种常见类型、如何用Spyder爬京东鞋子数据、如何用python获取京东的评论数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)