一、抓取小丑的豆瓣短评
网址:https://movie.douban.com/subject/27119724/reviews?start=20
首先构造url,短评页面每页可以抓取20个评论,假如我们需要抓取第20-40个评论,我们便可以构造url:https://movie.douban.com/subject/27119724/reviews?start=40,
以此类推我们可以抓取前3060个评论:
分别抓取了评论用户的名称、短评的内容,点赞数目以及用户链接
抓取内容保存为文本格式,
代码如下:
import csv
import requests
from lxml import etree
class douban(object):
def __init__(self,headers):
self.url='https://movie.douban.com/subject/27119724/reviews?start={page}'
self.headers=headers
pass
def get_html(self,url):
response=requests.get(url,headers=headers)
html=etree.HTML(response.text)
return html
def get_comments(self,html):
short_comments=html.xpath('//h2/a/text()')#短评
return short_comments
def get_names(self,html):
names=html.xpath('//header/a[@class="name"]/text()')#用户姓名
return names
def get_thumbs(self,html):
thumb_ups=html.xpath('//div[@class="action"]/a[@title="有用"]/span/text()')#点赞情况
return thumb_ups
def get_userifo(self,html):
name_urls=html.xpath('//header/a[@class="name"]/@href')#用户链接
return name_urls
def save_csv(self,d):
with open('D:/douban.csv','a',encoding='utf-8',newline='') as f:
writer=csv.writer(f)
writer.writerow([d['名字'],d['评论'],d['点赞数目'],d['用户链接']])
def save_txt(self,d):
with open('D:/douban.txt','a',encoding='utf-8') as f:
f.write(d['名字']+';'+d['评论']+';'+d['点赞数目']+';'+d['用户链接']+'\n')
def main(self):
for page in range(0,3041,20):
url=self.url.format(page=page)
print('开始爬取'+url)
html=self.get_html(url)
short_comments=self.get_comments(html)
names=self.get_names(html)
thumb_ups=self.get_thumbs(html)
name_urls=self.get_userifo(html)
d={'评论':short_comments,'名字':names,'点赞数目':thumb_ups,'用户链接':name_urls}
for i in range(len(names)):
d={}
d={'评论':short_comments[i],'名字':names[i],'点赞数目':thumb_ups[i].strip('\n').strip(),'用户链接':name_urls[i]}
self.save_txt(d)
if __name__=='__main__':
douban=douban(headers)
douban.main()
用pandas进行读取后如下所示:
import pandas as pd
table=pd.read_table('D:/douban.txt',sep=';')
table.columns=['用户名','短评内容','点赞数目','用户链接']
table
二、对短评内容做词云图
1.制作停止词库:
因为我们在评论时会有很多的语气词、副词·等,对于我们展现词频热度是无意义的干扰词。
停止词库是从网上下载下来的,有近2000多个,我还向里面添加了小丑,观后感等词语:
def make_stopdict():
stopdict = set()
f = open("D:/stopwords.txt","r") #网上下载来的停止词文本,近2000个,可以自己往里面添加
lines = f.readlines()
for l in lines:
stopdict.add(l.strip())
f.close()
return stopdict
stopdict = make_stopdict()
2.分词:
将一句完整的短评语句分解成一个个词语,我使用的jieba进行分词
import jieba
import re
zhongwen_pat = re.compile(r'^[\u4e00-\u9fa5a-zA-Z]+$')#匹配中文、英文等
all_content = []
f = open("D:/douban_terms3.txt","w")
comments=table['短评内容']
for comment in comments: #tweets是从数据库中取出来的待制作词云图的文本源
cut_list = [terms for terms in jieba.cut(comment) if zhongwen_pat.search(terms)]
cut_set = set(cut_list)
res_set = cut_set - stopdict
res_list = list(res_set)
all_content.extend(res_list)
f.writelines(res_list)
f.close
分词之后的短评内容保存在了douban_terms3.txt文件中,格式如下所示:
3.提取关键词
使用的是 jieba.analyse.extract_tags来提取的关键词,关于提取 jieba.analyse.extract_tags的用法可以参照:https://blog.csdn.net/qq_40082282/article/details/103433612
import jieba.analyse
def get_top_keywords(file):
top_word=[]
with open(file,'r') as f:
texts=f.read()#读取文件为整个字符串
result=jieba.analyse.extract_tags(texts,topK=400,withWeight=True)#保留400个关键字
for r in result:
top_word.append(r[0])
return top_word
top_word=get_top_keywords('D:/douban_terms3.txt')
400个关键词如下所示:
4.绘制词云图
from scipy.misc import imread
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
import matplotlib.pyplot as plt
from os import path
def draw_wordcloud(txt):
#读入一个txt文件,基于此文本知错词云图
color_mask = imread("D:/th.jpg") #读取背景图片,
cloud = WordCloud(
#设置字体,不指定就会出现乱码,文件名不支持中文
font_path="D:/FZMiaoWuJW.TTF",
#font_path=path.join(d,'simsun.ttc'),
#设置背景色,默认为黑,可根据需要自定义为颜色
background_color='white',
#词云形状,
mask=color_mask,
#允许最大词汇
max_words=400,
#最大号字体,如果不指定则为图像高度
max_font_size=50,
#画布宽度和高度,如果设置了msak则不会生效
width=800,
height = 600,
margin = 2,
#词语水平摆放的频率,默认为0.9.即竖直摆放的频率为0.1
prefer_horizontal = 0.8
)
wc = cloud.generate(','.join(top_word)) #产生词云,直接从字符串文本中产生词云图
#wc = cloud.fit_words(txt) 跟以上是同一意思
wc.to_file("D:/xiaochou_cloud.jpg") #保存图片
#显示词云图片
plt.imshow(wc)
#不显示坐标轴
plt.axis('off')
#绘制词云
#plt.figure(dpi = 600)
image_colors = ImageColorGenerator(color_mask)
#plt.imshow(wc.recolor(color_func=image_colors)) #重新上色,
plt.show()
draw_wordcloud(top_word)
最后产生的词云图如下所示:
总结:做词云图共分四步:制作停止词库、分词、提取关键词、绘制词云图;基本用wordcloud和jieba就可以搞定。