首先我们要了解一下,我们用requests包爬取的都只是写在HTML页面上的数据,但是呢,现在很多网站的数据都是通过js代码生成的,除非你找到它,不然是爬取不到的。
首先我随意打开一个京东的商品的详情页面:
然后打开谷歌的调试工具,点开network,京东的商品评论信息是存放json包中的,我们点击JS:
我们发现了productPageComment…,这也太像了吧,点开:
找到他的Request URL,复制下来,打开这个链接:
的确是我们想要的评论信息,下面我们来爬去它,爬去之前,我们要注意,这只是一页信息,那其他页呢,仔细看:
中间有一个page=0,这就是第一页的标志,那page=1就是第二页,page=2就是第三页了吧?试验一下:
打开看,果然是这样。那我们就可以来爬取了!
这里用到三个工具包:requests、json、pandas
可以通过 pip install -U指令来安装,不过国内某些站点的下载速度被限制了,大家可以通过使用镜像站点来下载,比如:
这是清华大学的站点,本人试过了,贼快,突突的。
爬取开始
首先导入需要的包:
第一步,创建一个方法获取网页信息:
第二步:创建一个方法将评论信息添加到列表中:
最后,设置爬取页数,对前两个方法的参数进行传值,
并建一个循环对页数进行遍历:
完整爬取代码:
importrequests
importjson
importpandas aspd
# 获取网页信息defgetHTMLText(url):
try:
# 设置请求头
headers ={'user-agent':'Mozilla/5.0'}
r =requests.get(url, headers=headers, timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
returnr.text # 返回到json数据页面
except:
print("发生异常,获取页面失败")
print(r.status_code)# 查看访问状态
# 将HTML信息放到列表中deffillComList(cList, cJson):
try:
#
去掉多余字符
start_Loc =cJson.find('{')
cJson =cJson[start_Loc:-2]
cJson =json.loads(cJson)# 字典数据
pagelen =len(cJson['comments'])
forj inrange(pagelen):
cList.append(cJson['comments'][j]['content'])
# data = {'评论内容': cList} #用字典封装数据
# print(data)
# print(cList)
except:
print("数据封装异常")
returncList
if__name__ =='__main__':
pages =10
# 声明一个列表,存储评论信息
comList = []
# 爬取页数
fori inrange(pages):
try:
url ="https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=6708133&score=0&sortType=5&page="+str(i)+"&pageSize=10&isShadowSku=0&fold=1"
comjson =getHTMLText(url)
print("正在爬取第"+str(i+1)+"页")
fillComList(comList, comjson)
except:
print("发生异常1")
continue
data ={'评论内容':comList}# 用字典封装数据
df =pd.DataFrame(data)# 将二维表结构的数据
#
将数据封装在txt文件中
df["评论内容"].to_csv(r'你的保存路径\content.txt', sep='\t', index=False)
爬取成功:
对数据进行加工处理,生成关键字云:
首先导入的需要的包:
创建一个方法生成关键字云:
在main方法中对参数传值:
结果:
关键字云完整代码:
importmatplotlib.pyplot asplt
fromwordcloud importWordCloud
importjieba
defcreateWordcloud(path):
# 打开content.txt文件,并将编码设为utf-8
f =open(path, 'r', encoding='utf-8').read()
# jieba分词
cut_text =''.join(jieba.cut(f))
wc=WordCloud(
# 设置字体
font_path='C://Windows//Fonts//msyh.ttc',
# 设置背景
background_color="white", width=3000, height=2500).generate(cut_text)
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
wc.to_file('你的保存路径//1.jpg')
if__name__ =='__main__':
# 要读取的文件
path_txt ='你的文件路径//content.txt'
createWordcloud(path_txt)
生成情感分析:
首先导入需要的包:
创建一个方法生成情感分析图,并在main方法中对参数传值:
结果:
情感分析完整代码:
importmatplotlib.pyplot asplt
fromsnownlp importSnowNLP
importpandas aspd
defcreateSnowNLO(path):
txt =open(path, 'r', encoding='UTF-8')
text =txt.readlines()
txt.close()
print('读入成功')
sentences = []
senti_score = []
fori intext:
a1 =SnowNLP(i)
a2=a1.sentiments
sentences.append(i)
# 语序...
senti_score.append(a2)
table =pd.DataFrame(sentences, senti_score)
plt.plot(senti_score, linestyle='-')
plt.show()
if__name__ =='__main__':
path_txt =r'你的文件路径\content.txt'
createSnowNLO(path_txt)