msdos是什么操作系统
python新闻评论分析_使⽤python抓取并分析京东商品评论数
本篇⽂章是python爬⾍系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进⾏分析和可视化。下⾯是要抓取的商品信息,⼀款⼥⼠⽂胸。这个商品共有红⾊,⿊⾊和肤⾊三种颜⾊, 70B到90D共18个尺⼨,以及超过700条的购买评论。
京东商品评论信息是由JS动态加载的,所以直接抓取商品详情页的URL并不能获得商品评论的信息。因此我们需要先到存放商品评论信息的⽂件。这⾥我们使⽤Chrome浏览器⾥的开发者⼯具进⾏查。
具体⽅法是在商品详情页点击⿏标右键,选择检查,在弹出的开发者⼯具界⾯中选择Network,设置为禁⽤缓存(Disable cache)和只查看JS⽂件。然后刷新页⾯。页⾯加载完成后向下滚动⿏标到商品评价部分,等商品评价信息显⽰出来后,在下⾯Network界⾯的左侧筛选框中输⼊productPageComments,这时下⾯的加载记录中只有⼀条信息,这⾥包含的就是商品详情页的商品评论信息。点击这条信息,在右侧的Preview界⾯中可以看到其中包含了当前页⾯中的评论信息。(抓取价格信息输⼊prices)。
仔细观察这条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 matplotlib.pyplot as plt
#导⼊结巴分词库(分词)
import jieba as jb
#导⼊结巴分词(关键词提取)
import jieba.analyse
将爬⾍伪装成浏览器织梦内容管理系统怎么还原系统
导⼊完库⽂件后,还不能直接进⾏抓取,因为这样很容易被封。我们还需要对爬⾍进⾏伪装,是爬⾍看起来更像是来⾃浏览器的访问。这⾥主要的两个⼯作是设置请求中的头⽂件信息以及设置Cookie的内容。
头⽂件信息很容易到,在Chrome的开发者⼯具中选择Network,刷新页⾯后选择Headers就可以看到本次访问的头⽂件信息,⾥⾯包含了⼀些浏览器的技术参数和引荐来源信息。将这些信息直接添加到代码中就可以,这⾥我们将头部信息保存在headers中。
#设置请求中头⽂件的信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept':'text/html;q=0.9,*/*;q=0.8',
'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Connection':'close',
'Referer':'www.jd/'
}
在查看头⽂件信息的旁边还有⼀个Cookies标签,点击进去就是本次访问的Cookies信息。这⾥的Cookies信息与前⾯头⽂件中的Cookie信息⼀致,不过这⾥更加清晰。把Request Cookies信息复制到代码中即可,这⾥我们将Request Cookies信息保存在Cookie中。
#设置Cookie的内容
cookie={'TrackID':'1_VWwvLYiy1FUr7wSr6HHmHhadG8d1-Qv-
TVaw8JwcFG4EksqyLyx1SO7O06_Y_XUCyQMksp3RVb2ezA',
'__jda':'122270672.1507607632.1423495705.1479785414.1479794553.92',
'__jdb':'122270672.1.1507607632|92.1479794553',
'__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-123456',
'xtest':'4657.553.d9798cdf31c02d86b8b81cc119d94836.b7a782741f667201b54880c925faec4b'}
抓取商品评论信息
设置完请求的头⽂件和Cookie信息后,我们开始抓取京东商品评论的信息。前⾯分析URL的时候说过,URL中包含两个重要的信息,⼀个是商品ID,另⼀个是页码。这⾥我们只抓取⼀个商品的评论信息,因此商品ID不需要更改。但这个商品的评论有700+条,也就是有近80页需要抓取,因此页码不是⼀个固定值,需要在0-80之间变化。这⾥我们将URL分成两部分,通过随机⽣成页码然后拼接URL的⽅式进⾏抓取。
#设置URL的第⼀部分
url1='sclub.jd/comment/productPageComments.action?
productId=10001234327&score=0&sortType=3&page='
#设置URL的第⼆部分
url2='&pageSize=10&callback=fetchJSON_comment98vv41127'
#乱序输出0-80的唯⼀随机数
ran_num=random.sample(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:
python请求并解析json数据a = ran_num[0]
if i == a:
i=str(i)
url=(url1+i+url2)
(url=url,headers=headers,cookies=cookie)
t
else:
t
html = html + html2
time.sleep(5)
print("当前抓取页⾯:",url,"状态:",r)
在抓取的过程中输出每⼀步抓取的页⾯URL以及状态。通过下⾯的截图可以看到,在page参数后⾯的页码是随机⽣成的并不连续。
抓取完80个页⾯后,我们还需要对页⾯进⾏编码。完成编码后就可以看到其中所包含的中⽂评论信息了。后⾯⼤部分苦逼的⼯作就是要对这些评论信息进⾏不断提取和反复的清洗。
#对抓取的页⾯进⾏编码
html=str(html, encoding = "GBK")
这⾥建议将抓取完的数据存储在本地,后续⼯作可以直接从本地打开⽂件进⾏清洗和分析⼯作。避免每次都要重新抓取数据。这⾥我们将数据保存在桌⾯的⽂件中。
#将编码后的页⾯输出为txt⽂本存储
file = open("c:\Users \", "w")
file.write(html)
file.close()
读取⽂件也⽐较简单,直接open加read函数就可以完成了。
#读取存储的txt⽂本⽂件
html = open('c:\Users\ ', 'r').read()
提取信息并进⾏数据清洗
京东的商品评论中包含了很多有⽤的信息,我们需要将这些信息从页⾯代码中提取出来,整理成数据表以便进⾏后续的分析⼯作。这⾥应该就是整个过程中最苦逼的数据提取和清洗⼯作了。我们使⽤正
则对每个字段进⾏提取。对于特殊的字段在通过替换等⽅式进⾏提取和清洗。
下⾯是提取的第⼀个字段userClient,也就是⽤户发布评论时所使⽤的设备类型,这类的字段提取还⽐较简单,⼀⾏代码搞定。查看⼀下提取出来的字段还⽐较⼲净。使⽤同样的⽅法我们分别提取了以下这些字段的内容。
#使⽤正则提取userClient字段信息
userClient=re.findall(r',"usefulVoteCount".*?,"userClientShow":(.*?),',html)
#使⽤正则提取userLevel字段信息
userLevel=re.findall(r'"referenceImage".*?,"userLevelName":(.*?),',html)
#使⽤正则提取productColor字段信息
productColor=re.findall(r'"creationTime".*?,"productColor":(.*?),',html)
#使⽤正则提取recommend字段信息
recommend=re.findall(r'"creationTime".*?,"recommend":(.*?),',html)
#使⽤正则提取nickname字段信息
nickname=re.findall(r'"creationTime".*?,"nickname":(.*?),',html)
#使⽤正则提取userProvince字段信息
userProvince=re.findall(r'"referenceImage".*?,"userProvince":(.*?),',html)
#使⽤正则提取usefulVoteCount字段信息
usefulVoteCount=re.findall(r'"referenceImage".*?,"usefulVoteCount":(.*?),',html)
#使⽤正则提取days字段信息
days=re.findall(r'"usefulVoteCount".*?,"days":(.*?)}',html)
#使⽤正则提取score字段信息
score=re.findall(r'"referenceImage".*?,"score":(.*?),',html)
还有⼀些字段⽐较负责,⽆法通过正则⼀次提取出来,⽐如isMobile字段,有些值的后⾯还有⼤括号。这就需要进⼀步的提取和清洗⼯作。
#使⽤正则提取isMobile字段信息
isMobile=re.findall(r'"usefulVoteCount".*?,"isMobile":(.*?),',html)
使⽤for循环配合替换功能将字段中所有的}替换为空。替换完成后字段看起来⼲净多了。
#替换掉最后的}
mobile=[]
for m in isMobile:
place('}','')
mobile.append(n)
productSize字段中包含了胸围和杯罩两类信息,为了获得独⽴的杯罩信息需要进⾏⼆次提取,将杯罩信息单独保存出来。
#使⽤正则提取productSize字段信息
productSize=re.findall(r'"creationTime".*?,"productSize":(.*?),',html)
使⽤for循环将productSize中的第三个字符杯罩信息提取出来,并保持在cup字段中。
#提取杯罩信息
cup=[]
for s in productSize:
小程序开发制作济南兴田德润简介电话s1=s[3]
cup.append(s1)
创建评论的⽇期信息仅依靠正则提取出来的信息还是⽐较乱,⽆法直接使⽤。因此也需要进⾏⼆次提取。下⾯是使⽤正则提取出的结果。
#使⽤正则提取时间字段信息
creationTime1=re.findall(r'"creationTime":(.*?),"referenceName',html)
⽇期和时间信息处于前20个字符,在⼆次提取中根据这个规律直接提起每个条⽬的前20个字符即可。将⽇期和时间单独保存为creationTime。
#提取⽇期和时间
creationTime=[]react18出来了17还要学么
for d in creationTime1:
date=d[1:20]
creationTime.append(date)
在上⼀步⽇期和时间的基础上,我们再进⼀步提取出单独的⼩时信息,⽅法与前⾯类似,提取⽇期时间中的第11和12个字符,就是⼩时的信息。提取完保存在hour字段以便后续的分析和汇总⼯作。
#提取⼩时信息
hour=[]
sufferingfor h in creationTime:
date=h[10:13]
hour.append(date)
最后要提取的是评论内容信息,页⾯代码中包含图⽚的评论信息是重复的,因此在使⽤正则提取完后还需要对评论信息进⾏去重。
#使⽤正则提取评论信息
content=re.findall(r'"guid".*?,"content":(.*?),',html)
使⽤if进⾏判断,排除掉所有包含图⽚的评论信息,已达到评论去重的⽬的。
#对提取的评论信息进⾏去重
content_1=[]
for i in content:
if not "img" in i:
conten_1.append(i)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。