首先目标是爬虫电影评论和评分,随机点开最近大火的
《狮子王》的猫眼评论
,确定评论所在html元素位置:
具体是:
<div class="main">
<div class="main-header clearfix">
<div class="user">
<span class="name">影子内阁、</span>
<span class="tag">购</span>
</div>
<div class="time" title="2019-07-12 03:02:48">
<span title="2019-07-12 03:02:48">4天前</span>
<ul class="score-star clearfix" data-score="4">
<li>
<i class="half-star left active"></i><i class="half-star right active"></i> </li>
<li>
<i class="half-star left active"></i><i class="half-star right active"></i> </li>
<li>
<i class="half-star left "></i><i class="half-star right "></i> </li>
<li>
<i class="half-star left "></i><i class="half-star right "></i> </li>
<li>
<i class="half-star left "></i><i class="half-star right "></i> </li>
</ul>
</div>
<div class="approve " data-id="1071060270">
<i data-act="comment-approve-click" class="approve-icon"></i><span class="num">345</span>
</div>
</div>
<div class="comment-content">
给个中肯分,毕竟迪斯尼在对于动物表情语言研究上面花了大功夫,为了这两个小时的CG动物世界,迪士尼也够拼了的,childish,和碧姐等歌星撑起歌声,黑人兄弟撑起诙谐片段,已经把声音的枯燥感压到最低,但是也会有汉斯季默救不回来片子,一切就毁在过度追求CG实感,而忽略了真正的狮子王原版动画中很多的有点,看得要睡着了。而成功事例就是阿拉丁,任务定位和感情线,都很完美,盖里奇完全用原本的风格,用自己的语言,又说了一边阿拉丁的故事,但这次这个故事,多多少少有盖里奇的影子,也很完整~
</div>
</div>
根据网页中html元素的定位来获取我们需要的值,我们需要了解
1).
? 是一个固定的搭配,.和
代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配(. * ?)代表一个分组
2)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符
3)(\d{1,2})表示匹配1到2个数字,因为评分是1~10,这里不用(. * ?)是因为会匹配到空值
以下是完整代码:
# -*- coding: utf-8 -*-
# import requests
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
soup = BeautifulSoup(urlopen('https://maoyan.com/films/1189879'),'lxml')
for data in soup.select('.main'):
data = str(data)
#不转换成str会报错:TypeError: expected string or bytes-like object
pattern3 = re.compile(r'<span.*?class=\"name\">(.*?)</span>',re.S)
name=re.findall(pattern3,data)
print("评论人:%s"%name)
pattern1 = re.compile(r'<ul.*?class=\"score-star.*?clearfix\".*?data-score=\"(\d{1,2})\">',re.S)
score=re.findall(pattern1,data)
print("评分是:%s"%score)
pattern2 = re.compile(r'<div.*?class=\"comment-content\">(.*?)</div>',re.S)
comment=re.findall(pattern2,data)
print("评论是:%s\n"%comment)
输出结果:
现在需要将获得的评分通过图表来显示,决定用评论人为x轴,评分为Y轴的柱状图显示,
修改后代码如下:
# -*- coding: utf-8 -*-
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'] # 用来正常显示中文标签
soup = BeautifulSoup(urlopen('https://maoyan.com/films/1189879'),'lxml')
soup=str(soup)
pattern1 = re.compile(r'<ul.*?class=\"score-star.*?clearfix\".*?data-score=\"(\d{1,2})\">',re.S)
score=re.findall(pattern1,soup)
score = list(map(int, score))#将list数据转换成int类型
print(score)
pattern3 = re.compile(r'<div.*?class=\"user\">.*?<span.*?class=\"name\">(.*?)</span>',re.S)
name=re.findall(pattern3,soup)
print(name)
plt.xticks(rotation=60)#rotation表示标签逆时针旋转60度
sns.barplot(x=name, y=score)
输出图片如下:
版权声明:本文为qq_32392597原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。