Python 爬虫实战:抓取猫眼电影详情(评论情感分析 + 评分预测模型)

一、前言

在互联网时代,数据成为了宝贵的资源。猫眼电影作为国内知名的电影信息平台,拥有海量的电影数据和用户评论,这些数据蕴含着丰富的信息,对于电影爱好者、研究人员以及相关行业从业者都具有极高的价值。通过 Python 爬虫技术,我们可以抓取猫眼电影的详细信息,包括电影评论,并进行情感分析和评分预测,从而深入挖掘数据背后的价值。本文将详细讲解如何实现这一过程,从环境搭建到数据处理与分析,助你轻松掌握 Python 爬虫在电影数据领域的应用。

二、准备工作

1. 环境搭建

在开始爬虫实战之前,确保已安装 Python 3.6 或以上版本。推荐使用 Visual Studio Code 作为开发工具,可通过VS Code 官网下载安装。

2. 安装必要的库

在命令行工具中输入以下命令,安装爬虫所需的库:

pip install requests beautifulsoup4 fake-useragent pandas scikit-learn matplotlib
  • requests:发送 HTTP 请求,获取网页内容。
  • beautifulsoup4:解析 HTML 和 XML 文档,提取所需数据。
  • fake-useragent:生成随机的用户代理,模拟不同浏览器访问。
  • pandas:数据处理和分析,提供便捷的数据结构和操作方法。
  • scikit-learn:机器学习库,用于构建评分预测模型。
  • matplotlib:数据可视化,绘制图表展示分析结果。

三、分析网页结构

打开猫眼电影网站,以“正在热映”页面为例(https://www.maoyan.com/films?showType=1),使用浏览器的开发者工具(F12)查看网页的 HTML 结构,找到电影信息和评论所在的标签和类名。

四、爬虫实现

1. 发送请求

使用 requests 库向猫眼电影页面发送请求,获取网页内容。注意设置请求头,包括用户代理和 Referer,以模拟真实浏览器访问,避免被反爬虫机制识别。

import requests
from fake_useragent import UserAgent

def get_movie_page(url):
    ua = UserAgent()
    headers = {
        'User-Agent': ua.random,
        'Referer': 'https://www.maoyan.com/'
    }
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # 检查请求是否成功
        return response.text
    except Exception as e:
        print(f'请求失败:{e}')
        return None

2. 解析电影列表

利用 BeautifulSoup 解析网页内容,提取电影的关键信息,如电影名称、评分、类型、主演、上映时间等。

from bs4 import BeautifulSoup

def parse_movie_list(html):
    soup = BeautifulSoup(html, 'html.parser')
    movies = []
    movie_items = soup.select('div.movie-list dd')
    for item in movie_items:
        movie = {}
        movie['名称'] = item.select_one('div.channel-detail.movie-item-title').get_text(strip=True)
        movie['评分'] = item.select_one('i.integer').get_text(strip=True) + item.select_one('i.fraction').get_text(strip=True)
        movie['类型'] = item.select_one('div.movie-hover-title').get_text(strip=True).split('\n')[0]
        movie['主演'] = item.select_one('div.movie-hover-title').get_text(strip=True).split('\n')[1].replace('主演:', '')
        movie['上映时间'] = item.select_one('div.movie-hover-title').get_text(strip=True).split('\n')[-1].replace('上映时间:', '')
        movies.append(movie)
    return movies

3. 获取电影详情页

通过电影的详情页链接,进一步抓取电影评论数据。同样需要构建请求并解析页面。

def get_movie_comments(movie_id, page=1):
    url = f'https://www.maoyan.com/ajax/movie/{movie_id}/comments?userId=&offset={page * 10}&limit=10'
    html = get_movie_page(url)
    if not html:
        return None
    soup = BeautifulSoup(html, 'html.parser')
    comments = []
    comment_items = soup.select('div.comment-item')
    for item in comment_items:
        comment = {}
        comment['用户名'] = item.select_one('span.name').get_text(strip=True)
        comment['评论'] = item.select_one('div.text').get_text(strip=True)
        comment['评分'] = item.select_one('div.score').get_text(strip=True) if item.select_one('div.score') else '无评分'
        comments.append(comment)
    return comments

4. 处理分页

猫眼电影的评论通常是分页展示的,需要通过循环请求不同页码来获取全部评论。

def get_all_comments(movie_id, max_page=10):
    all_comments = []
    for page in range(1, max_page + 1):
        comments = get_movie_comments(movie_id, page)
        if not comments:
            break
        all_comments.extend(comments)
    return all_comments

五、情感分析

使用情感分析算法,对抓取的电影评论进行情感倾向判断,分析评论是正面、负面还是中性。

from snownlp import SnowNLP

def sentiment_analysis(comments):
    sentiments = []
    for comment in comments:
        text = comment['评论']
        s = SnowNLP(text)
        sentiment = s.sentiments  # 返回情感倾向值,0-1之间,值越大表示越正面
        sentiments.append({'评论': text, '情感倾向': sentiment})
    return sentiments

6. 评分预测模型

基于历史数据构建评分预测模型,可采用线性回归、决策树等算法。以下为线性回归模型的示例:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

def build_rating_prediction_model(data):
    # 数据预处理与特征提取
    df = pd.DataFrame(data)
    # 假设我们有电影的特征数据,如类型、时长、导演等
    # 这里仅为示例,实际需根据数据进行特征工程
    # 将分类变量进行编码
    df['类型'] = df['类型'].apply(lambda x: 1 if '喜剧' in x else 0)
    df['时长'] = df['时长'].str.extract(r'(\d+)').astype(float)
    X = df[['类型', '时长']]
    y = df['评分'].astype(float)

    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # 训练模型
    model = LinearRegression()
    model.fit(X_train, y_train)

    # 预测
    y_pred = model.predict(X_test)

    # 评估模型
    mse = mean_squared_error(y_test, y_pred)
    print(f'模型均方误差(MSE):{mse}')
    return model

六、数据存储

将爬取到的电影数据和评论数据以 JSON 或 CSV 格式存储,方便后续的数据处理和分析。

import json
import csv

def save_to_json(data, file_path):
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

def save_to_csv(data, file_path):
    if not data:
        return
    headers = data[0].keys()
    with open(file_path, 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=headers)
        writer.writeheader()
        writer.writerows(data)

七、数据可视化

利用 matplotlib 绘制图表,直观展示电影评分分布、评论情感倾向等分析结果。例如,绘制情感倾向分布的直方图:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 绘制情感倾向分布直方图
def plot_sentiment_distribution(sentiments):
    sentiment_values = [item['情感倾向'] for item in sentiments]
    plt.hist(sentiment_values, bins=20, alpha=0.7, color='skyblue', edgecolor='black')
    plt.xlabel('情感倾向')
    plt.ylabel('评论数量')
    plt.title('电影评论情感倾向分布')
    plt.show()

八、总结与展望

通过本文的详细讲解和完整代码示例,我们成功实现了抓取猫眼电影详情的 Python 爬虫,并完成了评论情感分析和评分预测模型的构建。从环境搭建到数据处理与分析,我们学习了如何运用多种 Python 库和技术,从猫眼电影网站中提取有价值的信息,并进行深度挖掘。

python爬虫图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值