1.使用urllib库对网页进行爬取,其中'https://movie.douban.com/cinema/nowplaying/guangzhou/'是豆瓣电影正在上映的电影页面, 定义html_data变量,存放网页html代码,输入 print(html_data)
可以查看输出结果。
from urllib import request
resp = request.urlopen('https://movie.douban.com/cinema/nowplaying/guangzhou/')
html_data = resp.read().decode('utf-8')
输入print(html_data)
,其输出结果如下图所示:
2.得到的html代码后,使用BeautifulSoup库进行html代码的解析。获取需要的数据。
1).获取我们想要色数据。如:“狂暴巨兽”电影的名称、主演、评分等信息。f12查看元素可以获取到div id="nowplaying"
标签开始是我们想要的数据。
2)代码编写。使用 print(nowplaying_movie_list[0])
查看内容。
from bs4 import BeautifulSoup as bs
soup = bs(html_data, 'html.parser')
nowplaying_movie = soup.find_all('div', id='nowplaying')
nowplaying_movie_list = nowplaying_movie[0].find_all('li', class_='list-item')
# print(nowplaying_movie_list[0])
其运行结果如下图所示:
3.电影评论需要电影id及电影名称等信息,因此需要通过python编码爬取电影id及名称。
1).电影id可以通过data-subject属性获取,电影名称可以通过img标签的alt属性获取,可以参照下图:
2).解析电影名称与id,通过print(nowplaying_list)查看结果。
nowplaying_list = []
for item in nowplaying_movie_list:
nowplaying_dict = {}
nowplaying_dict['id'] = item['data-subject']
for tag_img_item in item.find_all('img'):
nowplaying_dict['name'] = tag_img_item['alt']
nowplaying_list.append(nowplaying_dict)
print(nowplaying_list)
其运行结果如下图所示:
4.《狂暴巨兽》的短评网址为: https://movie.douban.com/subject/26430636/comments?start=0&limit=20。其中
26430636
是电影id,start=0
是第0条评论。
1).短评页面的html代码,其中评论的数据是 div
标签的comment
属性,如下图所示:
2).对此标签进行解析,代码如下:
requrl = 'https://movie.douban.com/subject/' + nowplaying_list[0]['id'] + '/comments' +'?' +'start=0' + '&limit=20'
resp = request.urlopen(requrl)
html_data = resp.read().decode('utf-8')
soup = bs(html_data, 'html.parser')
comment_div_lits = soup.find_all('div', class_='comment')
eachCommentList = [];
for item in comment_div_lits:
if item.find_all('p')[0].string is not None:
eachCommentList.append(item.find_all('p')[0].string)
print(eachCommentList)
其运行结果如下图所示:
5.对获取的短评数据进行处理并清除标点符号、英文等无用信息。使用python中正则表达式的re库实现。
import re
filterdata=re.findall(u'[\u4e00-\u9fff]+', comments)
cleaned_comments= ''.join(filterdata)
print(cleaned_comments)
其运行结果如下图所示:
6.接着进行词频统计,使用结巴分词jieba库进行中文分词操作。可以使用print( words_df.head())
查看分词之后的结果。
import jieba #分词包
import pandas
segment = jieba.lcut(cleaned_comments)
words_df=pandas.DataFrame({'segment':segment})
print(words_df.head())
其运行效果如下图所示:
7.进行词频统计,使用numpy计算包。
import numpy #numpy计算包
words_stat=words_df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
words_stat=words_stat.reset_index().sort_values(by=["计数"],ascending=False)
print(words_stat.head())
其结果如下图所示:
8.对上面爬取的数据进行文本分析,生成词云。
# 生成词云
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import codecs
import numpy as np
from PIL import Image
file = codecs.open('dianying.txt', 'r', 'utf-8')
image=np.array(Image.open('F:/pei.jpg'))
font=r'C:\Windows\Fonts\simkai.ttf'
word=file.read()
print(word)
my_wordcloud = WordCloud(font_path=font,mask=image,background_color='white',max_words = 100,max_font_size = 100,random_state=50).generate(word)
#根据图片生成词云
iamge_colors = ImageColorGenerator(image)
#显示生成的词云
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
#保存生成的图片,当关闭图片时才会生效,中断程序不会保存
my_wordcloud.to_file('pei.jpg')
其结果如下图所示:
9.爬取数据的源代码
import re #正则表达式
import jieba #分词包
import pandas
import numpy #numpy计算包
from urllib import request
from bs4 import BeautifulSoup as bs
resp = request.urlopen('https://movie.douban.com/cinema/nowplaying/guangzhou/')
html_data = resp.read().decode('utf-8')
soup = bs(html_data, 'html.parser')
nowplaying_movie = soup.find_all('div', id='nowplaying')
nowplaying_movie_list = nowplaying_movie[0].find_all('li', class_='list-item')
# print(nowplaying_movie_list[0])
nowplaying_list = []
for item in nowplaying_movie_list:
nowplaying_dict = {}
nowplaying_dict['id'] = item['data-subject']
for tag_img_item in item.find_all('img'):
nowplaying_dict['name'] = tag_img_item['alt']
nowplaying_list.append(nowplaying_dict)
# print(nowplaying_list)
requrl = 'https://movie.douban.com/subject/' + nowplaying_list[0]['id'] + '/comments' +'?' +'start=0' + '&limit=20'
resp = request.urlopen(requrl)
html_data = resp.read().decode('utf-8')
soup = bs(html_data, 'html.parser')
comment_div_lits = soup.find_all('div', class_='comment')
eachCommentList = [];
for item in comment_div_lits:
if item.find_all('p')[0].string is not None:
eachCommentList.append(item.find_all('p')[0].string)
# print(eachCommentList)
comments = ''
for k in range(len(eachCommentList)):
comments = comments + (str(eachCommentList[k])).strip()
# print(comments)
filterdata=re.findall(u'[\u4e00-\u9fff]+', comments)
cleaned_comments= ''.join(filterdata)
# print(cleaned_comments)
segment = jieba.lcut(cleaned_comments)
words_df=pandas.DataFrame({'segment':segment})
# print(words_df.head())
words_stat=words_df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
words_stat=words_stat.reset_index().sort_values(by=["计数"],ascending=False)
print(words_stat)
10.总结
通过对豆瓣电影官网中广州站正在上映的《狂暴巨兽》电影的短评的数据爬取实战,一方面巩固了老师课堂上所讲的基础知识,另一方面,增强了自己的实战技能。但是,在此次实践过程中,遇到许多问题,一方面问题是,对python这门语言不熟悉,需要学习。再次就是这次做实验用到了老师一些在课堂上没有涉及到的知识,如:词云,需要查阅与参考资料。最后就是在这一过程中遇到了如下一下问题(如下图所示),最后通过安装wordcloud-1.4.1-cp36-cp36m-win32.whl即可。