豆瓣图书评论数据分析与可视化 -2025/6/4


📚 豆瓣图书短评爬取与分析:以《都挺好》为例

📝 题目描述

以《平凡的世界》《都挺好》等图书为对象,编写爬虫程序抓取豆瓣读书上前 3 页短评信息,并完成如下功能:

功能要求:

  1. 跨页连续爬取短评信息(前 3 页)。

  2. 爬取字段包括:用户名、短评内容、评论时间、评分、点赞数(有用数)

  3. 支持按排序方式(热门或最新)抓取,分别输出前 10 条短评信息。

  4. 按照点赞数降序输出前 10 条短评信息。

  5. (附加)结合中文分词与词云,对前 3 页短评文本内容进行分析:

    • 输出词频最高的前 10 个词语
    • 生成词云图

🔍 分析目标页面 URL

示例 URL:

https://book.douban.com/subject/20492971/comments/?start=20&limit=20&status=P&sort=score

URL 参数解释:

参数部分 含义
/subject/20492971 图书 ID:20492971
/comments/ 评论页面
start=20 分页参数,从第 20 条开始
limit=20 每页显示 20 条评论
status=P 评论状态:P 表示已发布
sort=score 排序方式:按有用数排序
sort=time 排序方式:按评论时间(需要登录)

⚙️ Headers 和 Cookies 配置

豆瓣反爬机制较强,需模拟浏览器请求:

  • 必须配置完整的 HeadersCookies
  • 可选:添加 代理 IP 池
  • 建议:设置请求间隔,避免频繁访问

🧰 推荐工具:Convert curl to Python

可将浏览器复制的 cURL 请求一键转换为 Python 代码!


🐍 Python 实现代码

import matplotlib
import requests
from lxml import etree
import jieba
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt

matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
matplotlib.rcParams['axes.unicode_minus'] = False    # 正确显示负号

cookies = {
    # 请替换为你自己的 cookies
}

headers = {
    # 请替换为你自己的 headers
    'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'

}

def get_comment(page, sort_type, comment_list):
    url = f'https://book.douban.com/subject/20492971/comments/?start={page * 20}&limit=20&sort={sort_type}&status=P'
    response = requests.get(url, cookies=cookies, headers=headers)
    response.encoding = 'utf-8'
    tree = etree.HTML(response.text)
    li_list = tree.xpath('//*[@id="comments"]/div[1]/ul/li')
    for li in li_list:
        try:
            like_count = li.xpath('./div[2]/h3/span[1]/span/text()')[0].strip()
            name = li.xpath('./div[2]/h3/span[2]/a[1]/text()')[0].strip()
            score = li.xpath('./div[2]/h3/span[2]/span/@title')[0].strip()
            time = li.xpath('./div[2]/h3/span[2]/a[2]/text()')[0].strip()
            comment = li.xpath('./div[2]/p/span/text()')[0].strip()
            comment_list.append({
                'name': name,
                'score': score,
                'time': time,
                'like_count': like_count,
                'comment': comment
            })
        except Exception:
            continue
    print(f'第{page + 1}页爬取成功')

def analyze_text(comment_list):
    all_text = ''.join([c['comment'] for c in comment_list])
    words = jieba.lcut(all_text)

    stop_words = set(['的', '了', '和', '是', '我', '也', '就', '都', '很', '在', '有', '不', '人'])
    words = [word for word in words if len(word) > 1 and word not in stop_words]

    word_counts = Counter(words)
    top_words = word_counts.most_common(10)

    print("词频前10名:")
    for i, (word, count) in enumerate(top_words, 1):
        print(f"{i}. {word}:{count} 次")

    wc = WordCloud(
        font_path='simhei.ttf',
        background_color='white',
        width=800,
        height=600
    ).generate_from_frequencies(word_counts)

    plt.figure(figsize=(10, 6))
    plt.imshow(wc, interpolation='bilinear')
    plt.axis('off')
    plt.title("豆瓣短评词云", fontsize=18)
    plt.show()
    wc.to_file("wordcloud.png")

def main():
    choice = input("请输入查看类型(1:热门评论,2:最新评论):")
    if choice == '1':
        sort_type = 'score'
    elif choice == '2':
        sort_type = 'time'
    else:
        print("无效输入,默认使用热门评论。")
        sort_type = 'score'

    comment_list = []
    for i in range(3):
        get_comment(i, sort_type, comment_list)

    print("\n前10条评论:\n")
    for i, c in enumerate(comment_list[:10], 1):
        print(f"{i}. {c['name']} | {c['score']} | {c['time']} | 赞:{c['like_count']}\n评论:{c['comment']}\n")

    analyze_text(comment_list)

if __name__ == '__main__':
    main()

🔧 安装依赖

# 基础请求与解析库
pip install requests lxml jieba

# 词云与可视化
pip install wordcloud matplotlib

🔑 技术要点解析

分类 要点说明
反爬策略 模拟浏览器行为(Headers + Cookies)
可选使用代理 IP
控制访问频率(如 time.sleep(random.uniform(1,3))
数据提取 使用 lxml.etree + XPath 精准定位评论内容
数据清洗 异常处理健壮、去空白、排除无效词
文本分析 基于 jieba 分词 + 自定义停用词
统计高频词并生成词云图

🚨 注意事项

  • 本代码仅用于学习交流,请勿用于商业或大规模抓取
  • 尊重豆瓣 Robots 协议
  • 大规模访问可能会封 IP,建议使用代理池和限速策略

🧠 结语

本项目完整演示了从数据爬取、结构化存储、文本分析可视化输出的全过程,适合作为数据分析入门或课程实践项目的案例。

如需扩展,可进一步实现:

  • 图书信息批量爬取
  • 评论情感倾向分析(正面/负面)
  • 评论时间趋势图可视化

posted @ 2025-06-04 14:36  XYu1230  阅读(77)  评论(0)    收藏  举报