Python爬取豆瓣《波西米亚狂想曲》短评

上周六看了《波西米亚狂想曲》,还挺好看的,好像听了一场演唱会一样。原来对皇后乐队没怎么了解的我也被圈粉了一波。那就到豆瓣上面看看大家对这部电影的评价咯。

思路如下:

  • 找到《波西米亚狂想曲》短评的网址,分析翻页规律;
  • 使用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 :


Python爬取豆瓣《波西米亚狂想曲》短评_第1张图片
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)

得到的短评词云:


Python爬取豆瓣《波西米亚狂想曲》短评_第2张图片
波西米亚狂想曲.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)

你可能感兴趣的:(Python爬取豆瓣《波西米亚狂想曲》短评)