爬取豆瓣电影影评并分析

1. 爬虫爬取电影影评

1.1 使用xpath爬取电影影评

import os

import requests
from lxml import etree

# 设置头部信息,防止被检测出是爬虫
headers = {
    'Host': 'movie.douban.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
}

id = input('请输入电影id:')
page = int(input('请输入爬取的页数:'))

# 循环请求接口
for i in range(0, page):
    # 循环请求每页的数据
    re = requests.get(
        url='https://movie.douban.com/subject/%s/comments?start=%d&limit=20&sort=new_score&status=P' % (id, 20 * i),
        headers=headers).text
    # 构造了一个XPath解析对象并对HTML文本进行自动修正
    html = etree.HTML(re)
    # XPath使用路径表达式来选取用户名
    comment = html.xpath('//div[@class="comment"]')
    for content in comment:
        names = content.xpath('.//a[@class=""]')
        grades = content.xpath('.//span[contains(@class,"rating")]')
        texts = content.xpath('.//span[@class="short"]')
        name = names[0].xpath('./text()')[0]
        if len(grades) > 0:
            grade = grades[0].xpath('./@class')[0][7:8] + '星'
        else:
            grade = '暂无评价'
        text = texts[0].xpath('./text()')[0]
        # 文件夹不存在,则创建文件夹
        save_path = './douban'
        folder = os.path.exists(save_path)
        if not folder:
            os.makedirs(save_path)
        with open('./douban/影评.text', 'a+', encoding='utf-8') as f:
            f.write('用户名:%s\n' % name)
            f.write('评价:%s\n' % grade)
            f.write('评论内容:%s\n' % text)
            f.write('==========================================================================\n')

1.2 xpath爬取电影影评有什么好处?

①灵活性:XPath提供了一种简洁、灵活的语法,可以针对HTML或XML文档中的特定元素或节点进行精确的定位和提取。可以根据需要自定义XPath表达式,轻松地根据网页结构进行数据抽取。

②简洁性:相比正则表达式或其他复杂的文本处理方法,XPath语法更加简洁易懂。它能够快速解析网页结构,提取所需信息,减少开发和调试的时间和工作量。

③可维护性:使用XPath可以更好地隔离爬虫代码和网页结构。当网页结构发生变化时,只需要修改XPath表达式,而不需要修改大量的爬虫逻辑。

④高效性:XPath在底层实现上使用了高效的索引和查询技术,因此在处理大规模数据集时具有较高的效率,能够快速提取所需信息。

⑤跨平台兼容性:XPath是一种通用的数据提取语言,可以用于不同的编程语言和操作系统。无论是Python、Java还是其他语言,都可以使用XPath来进行网页数据抽取。

1.3 代码的说明和不足

1.2.1代码解析

1.2.1代码解析

①代码开始导入需要的库:os、requests和xpath的etree

②设置headers伪装,以防被认为是爬虫被禁止此次操作

③发送请求到目标网站后,这里构造了一个XPath解析对象并对HTML文本进行自动修正

④随后就是对各种信息的定义和对应爬取,而后设置一个保存路径来存放该影评文件,这里使用了一种写法,以防止没有该文件路径的时候创建一个文件夹来存放问文件

⑤最后就是写入文件,使用了a+模式,其具体解释如下:

a表示以“追加模式”打开文件。如果文件不存在,将会创建新文件。如果文件已存在,写入的内容将会被追加到文件的末尾,而不会覆盖原有内容。

+表示该文件可读可写。在追加模式下,+允许在文件中进行读取操作。

1.2.2代码的不足之处

①代码需要匹配的是豆瓣电影的id,但是id号一般不好获得,这是一个不足之处

②代码会一同保存用户名、评价、评论、内容、电影这几个元素,会影响后续的分析结果

③虽然完善了没有文件夹创建文件夹的问题,但是如果已经爬取即保存一次影评之后,第二次更改了id之后需要手动删除之前文件内的内容(后续爬虫不会替换掉原文件内的内容)

2. 豆瓣电影影评的分析

2.1 使用Counter处理数据

import os
from collections import Counter

# 读取影评文件
file_path = './douban/影评.text'
if not os.path.exists(file_path):
    print('影评文件不存在')
    exit()

# 读取影评内容
with open(file_path, 'r', encoding='utf-8') as f:
    content = f.read()

# 统计评分分布
grades = []
lines = content.split('==========================================================================')
for line in lines:
    if line.strip():
        grade_line = line.split('\n')[1]  # 评分行
        grade = grade_line.split(':')[1]  # 提取评分
        grades.append(grade)
grade_counts = Counter(grades)
print('评分统计:')
for key, value in grade_counts.items():
    print(f'{key}评分:{value}')


# 词频统计
import jieba.analyse
jieba.analyse.set_stop_words('./stopwords.txt')
keywords = jieba.analyse.extract_tags(content, topK=10)
print('\n关键词统计:')
for keyword in keywords:
    print(keyword)

2.2 代码解析

①导入需要的库:Counter类可以用来快速统计可迭代对象(如列表、字符串等)中元素的数量,并以字典的形式返回结果;jieba库是一个中文文本处理的常用工具,其中的jieba.analyse模块专门提供了关键词提取的功能

②匹配到准备的stopwords.txt分词文件,来对各项数进行处理,最后输出对应的处理结果

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值