文章目录
- 前言
- 一、商品数据
- 1.分析url
- 2.解析数据
- 3.实现翻页
- 二、评论数据
前言
利用Python对苏宁易购商品数据评价数据实现爬取
提示:以下是本篇文章正文内容,下面案例可供参考
一、商品数据
苏宁易购官网商品数据是属于动态加载的,所以我用的方法时selenium模拟,利用selenium向下滑动加载数据,获取数据
1.分析url
我们搜索一件商品观察url,这个url很简单,就是在官网上加上了关键字,没有多余的参数
https://search.suning.com/%E7%BA%A2%E7%B1%B3K40/
我们翻页看一下其他url,我们跳到第二页可以看到在第一页url后加了“#second-filter”第三页跟第二页的url是一样的
第二页:https://search.suning.com/%E7%BA%A2%E7%B1%B3K40/#second-filter
第三页:https://search.suning.com/%E7%BA%A2%E7%B1%B3K40/#second-filter
我原本想通过制造url来实现翻页,但是现在貌似是不能了,但是没关系,因为我们用的是selenium可以通过循环点击下一页的方式来实现翻页
2.解析数据
我们向下滑动可以发现有一部分数据是需要滑动才能加载出来的,所以我们需要通过selenium模拟滑动
通过访问页面,模拟滑动加载数据
self.bro.get("https://search.suning.com/%E7%BA%A2%E7%B1%B3K40/")
self.bro.execute_script('window.scrollTo(0, document.body.scrollHeight)') # 向下滑动一屏
我们选中一件商品右键检查元素,可以发现所有数据都在ul中每一个li里
根据这我们可以遍历没有li标签获取每一个商品数据,看一下我要拿到他的标题、价格、评价数等等数据
实例代码如下:
html=etree.HTML(self.bro.page_source)
li_list=html.xpath('//ul[@class="general clearfix"]/li')
for li in li_list:
dic={}
try:
dic["title"]="".join(li.xpath('.//div[@class="res-info"]/div[@class="title-selling-point"]/a[1]//text()')).replace("\n","")
except:
dic["title"]=""
try:
dic["price"]="".join(li.xpath('.//div[@class="price-box"]/span[1]//text()')).replace("\n","")
except:
dic["price"]=""
try:
dic["type"]=li.xpath('.//div[@class="info-config"]/@title')[0]
except:
dic["type"]=""
try:
dic["comment_num"]=''.join(li.xpath('.//div[@class="info-evaluate"]/a[1]//text()'))
except:
dic["comment_num"]=""
try:
dic["shop"]=li.xpath('.//div[@class="store-stock"]/a[1]/text()')[0]
except:
dic["shop"]=""
try:
dic["label"]=','.join(li.xpath('.//div[@class="sales-label"]//text()'))
except:
dic["label"]=""
try:
dic["img_link"]="http:"+li.xpath('.//div[@class="img-block"]/a[1]/img/@src')[0]
except:
dic["img_link"]=""
try:
if "http" in li.xpath('.//div[@class="res-info"]/div[@class="title-selling-point"]/a[1]/@href')[0]:
dic["detail_link"]=li.xpath('.//div[@class="res-info"]/div[@class="title-selling-point"]/a[1]/@href')[0]
else:
dic["detail_link"]="http:"+li.xpath('.//div[@class="res-info"]/div[@class="title-selling-point"]/a[1]/@href')[0]
except:
dic["detail_link"]=""
保存数据我使用的边爬边存的追加方式
with open(".//taobao.csv", "a+", encoding="utf-8") as f:
writer = csv.DictWriter(f, dic.keys())
writer.writerow(dic)
3.实现翻页
通过上面的代码我们可以实现单个页面的获取了,现在我们需要做的是实现翻页,全站数据爬取
我们是要在圈中的位置 输入页数 点击确认实现翻页
我们可以定位总页数,打印出总页数,以此我们来利用input交互式的方式实现翻页
再利用input输入起始页数、结束页数做for循环实现翻页
self.start_page = input("请输入起始页数:")
self.end_page = input("请输入结束页数:")
for i in range(int(self.start_page),int(self.end_page)+1):
解析数据
self.bro.find_element_by_xpath('//span[@class="page-more"]/input').send_keys(int(i)) #输入页数
self.bro.find_element_by_xpath('//a[@class="page-more ensure"]').click() #点击确认
这里需要注意一点,就是当数据只有一页时,便不需要用循环了
到此便可获取苏宁商品数据,看一下效果
二、评论数据
我们利用chrome自带的抓包,筛选出评论数据包,我们可以看到,评论数据都在commodityReviews中
现在我们来分析一下评论数据的url,我们可以的看出,变化的地方只有一处就是total-和-default中间的数据,如第一页:total-1-default 第二页:total-2-default 第三页:total-3-default.由此我们就找到了url的变化规律
第一页:https://review.suning.com/ajax/cluster_review_lists/cluster-37644362-000000012234208643-0000000000-total-1-default-10-----reviewList.htm?callback=reviewList
第二页:https://review.suning.com/ajax/cluster_review_lists/cluster-37644362-000000012234208643-0000000000-total-2-default-10-----reviewList.htm?callback=reviewList
第三页:https://review.suning.com/ajax/cluster_review_lists/cluster-37644362-000000012234208643-0000000000-total-3-default-10-----reviewList.htm?callback=reviewList
现在我来解析数据,我将将数据复制到json.cn中
每个用户的数据都在commodityReviews中我们可以通过requests访问得到数据转为json格式。遍历commodityReviews,拿到每个人的数据
实例代码如下:
text=requests.get(url,headers=head).text.replace("reviewList(","").replace(")","")
data=json.loads(text)
for da in data["commodityReviews"]:
dic={}
try:
dic["nickName"]=da["userInfo"]["nickName"]
except:
dic["nickName"]=""
try:
dic["levelName"]=da["userInfo"]["levelName"]
except:
dic["levelName"]=""
try:
dic["isVip"]=da["userInfo"]["isVip"]
except:
dic["isVip"]=""
try:
dic["charaterDesc1"]=da["commodityInfo"]["charaterDesc1"]
except:
dic["charaterDesc1"]=""
try:
dic["charaterDesc2"]=da["commodityInfo"]["charaterDesc2"]
except:
dic["charaterDesc2"]=""
try:
dic["content"]=da["content"]
except:
dic["content"]=""
try:
dic["publishTime"]=da["publishTime"]
except:
dic["publishTime"]=""
保存数据我使用的边爬边存的追加方式
with open(".//taobao.csv", "a+", encoding="utf-8") as f:
writer = csv.DictWriter(f, dic.keys())
writer.writerow(dic)
最终效果如下