Python爬取豆瓣《波西米亚狂想曲》短评
2019-04-02 本文已影响5人
JairusTse
上周六看了《波西米亚狂想曲》,还挺好看的,好像听了一场演唱会一样。原来对皇后乐队没怎么了解的我也被圈粉了一波。那就到豆瓣上面看看大家对这部电影的评价咯。
思路如下:
- 找到《波西米亚狂想曲》短评的网址,分析翻页规律;
- 使用Requests库循环获取页面HTML代码;
- 使用Xpath库解析页面代码,得到想要的短评数据;
- 使用WordCloud库绘制短评词云
首先,很容易在豆瓣上找到电影短评的网址:
https://movie.douban.com/subject/5300054/comments?start=0&limit=20&sort=new_score&status=P
前后翻几页,观察URL的变化,很容易就知道是通过start=0这个参数来控制翻页,但是start最大只能到480,就是说豆瓣最多允许我们查看500条短评(估计是被爬虫大军吓怕了)。
知道翻页规则和短评总数,我们就可以用一个循环来获取全部的页面代码:
import requests
import time
import random
# 根据翻页规则得到所有网页的URL
urls=['https://movie.douban.com/subject/5300054/comments?start={}&limit=20&sort=new_score&status=P'.format(str(i)) for i in range(0, 480, 20)]
# 循环爬取所有网页代码,每页间有个随机的间隔时间
for url in urls:
time.sleep(random.uniform(0, 1))
html = getHTML(url)
# 获取页面HTML代码
def getHTML(url):
try:
r = requests.get(url, timeout=20) #设置超时
return r.text
except: #异常处理
return "产生异常"
爬取到页面数据之后,就需要解析页面和抽取我们需要的数据,使用的是Xpath库,
from lxml import etree
s = etree.HTML(html) # 解析html数据
file = s.xpath('//*[@id="comments"]/div/div[2]/p/span/text()') # 使用.xpath()
Xpath的规则可以这样获取:右键我们想要的数据(短评)➡️ 检查 ➡️选中短评的css标签 ➡️ Copy ➡️ Copy Xpath :
Copy Xpath
最后,使用WordCloud库绘制短评词云:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 绘制词云
def drawWorkCloud(f):
wordcloud = WordCloud(background_color="white", width=1000, height=860, margin=2, font_path='SimHei.ttf').generate(
f)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
wordcloud.to_file('kuangxiangqu.png')
if(file):
pinglun = ', '.join(file)
print(pinglun)
drawWorkCloud(pinglun)
得到的短评词云:
波西米亚狂想曲.png
最后附上完整的代码:
import requests
from lxml import etree
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import time
import random
urls=['https://movie.douban.com/subject/5300054/comments?start={}&limit=20&sort=new_score&status=P'.format(str(i)) for i in range(0, 480, 20)]
# 获取页面HTML代码
def getHTML(url):
try:
r = requests.get(url, timeout=20) #设置超时
return r.text
except: #异常处理
return "产生异常"
# 绘制词云
def drawWorkCloud(f):
wordcloud = WordCloud(background_color="white", width=1000, height=860, margin=2, font_path='SimHei.ttf').generate(
f)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
wordcloud.to_file('kuangxiangqu.png')
if __name__ == '__main__':
pinglun = ''
for url in urls:
time.sleep(random.uniform(0, 1))
html = getHTML(url)
s = etree.HTML(html) # 解析html数据
file = s.xpath('//*[@id="comments"]/div/div[2]/p/span/text()') # 使用.xpath()"
if(file):
pinglun = ', '.join(file)
print(pinglun)
drawWorkCloud(pinglun)