大数跨境
0
0

Python爬虫实战,《哪吒2》豆瓣短评爬取

Python爬虫实战,《哪吒2》豆瓣短评爬取 大话数据分析
2025-03-25
2
导读:豆瓣评论数据爬取实战,建议收藏并实践!

春节档向来是影视圈的兵家必争之地,而今年,一部《哪吒 2》强势闯入大众视野,瞬间点燃了观众们的热情。社交媒体上,关于哪吒新冒险的讨论铺天盖地,大家对这部续作的评价褒贬不一。

你是否好奇,在豆瓣这个影视评分的重要阵地,广大影迷们究竟给出了怎样的短评?是对特效的惊艳赞叹,还是对剧情的深度剖析?

今天,我们就将借助 Python 爬虫这一强大工具,深入豆瓣,揭开《哪吒 2》短评数据的神秘面纱,看看这些数据背后,藏着怎样的观众心声。

评论字段解析

《哪吒 2》评论数据的地址如下,主要包含"用户昵称"、 "评分"、 "评论时间"、 "用户地址"、 "评论内容"这些字段,我们要爬取的是这些内容。

熟悉爬虫的同学应该知道,一个完整的爬虫应该包含以下几个过程:

爬虫基本流程

数据抓取

  • 使用随机延时(3-5秒)规避反爬机制

  • 模拟浏览器请求头

  • 支持分页抓取(每页20条,共抓100条)

数据解析

  • 精确提取五个关键字段:

  • 用户昵称(.comment-info a)

  • 星级评分(allstar开头的class值转换)

  • 评论时间(.comment-time的title属性)

  • 用户地址(.comment-location)

  • 评论内容(.comment-content)

数据存储

  • 通过pandas构建结构化数据表

  • 按指定字段顺序导出Excel(无索引列)

1.requests发送请求

电影网址:

https://movie.douban.com/subject/34780991/comments?status=P

requests返回常见状态码示例:

  • 200:爬虫成功获取页面内容。

  • 403:爬虫被反爬机制拦截,需要添加请求头或使用代理。

  • 404:目标页面不存在,检查 URL 是否正确。

  • 500:服务器内部错误,可能是目标网站的问题。

import requests# 目标URLurl = "https://movie.douban.com/subject/34780991/comments?status=P"# 设置请求头,模拟浏览器访问headers = {    "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}# 发送GET请求response = requests.get(url, headers=headers)# 返回状态码print("状态码:", response.status_code)

状态码: 200

2.BeautifulSoup数据解析

在数据解析方面,需要注意在检查元素里面的位置,依次右键网页➔检查➔Elements➔鼠标悬停文本内容➔找到元素的位置➔使用BeautifulSoup解析。

3.数据保存

构建一个空表用来保存数据。

import pandas as pd# 创建空DataFrame(带表头)columns = ["用户昵称""评分""评论时间""用户地址""评论内容"]df = pd.DataFrame(columns=columns)# 保存为Excel文件df.to_excel("comments.xlsx", index=False)

同时,通过点击菜单,发现了该网页的点击规律,该网页的

第一页:https://movie.douban.com/subject/34780991/comments?limit=20&status=P&sort=new_score第二页:https://movie.douban.com/subject/34780991/comments?start=20&limit=20&status=P&sort=new_score第三页:https://movie.douban.com/subject/34780991/comments?start=40&limit=20&status=P&sort=new_score

网页的翻页规律是通过start=0,start=20,start=40,每翻一页,start递增20的翻页规律,这样方便我们构造翻页规律。

综上,我们写出完整版代码如下,注意,这里为了避免被反爬,设置了请求头以及延时数据爬取,这样避免被反爬。

import requestsimport randomimport timeimport pandas as pdfrom bs4 import BeautifulSoup# 使用 User-AgentUSER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"def get_headers():    """固定请求头"""    return {        'User-Agent': USER_AGENT,        'Referer''https://movie.douban.com/',        'Host''movie.douban.com'    }def parse_comment(item):    """解析单个评论条目"""    comment = {}        # 用户昵称    username_tag = item.select_one('.comment-info a')    comment['用户昵称'] = username_tag.text.strip() if username_tag else ''        # 评分    rating_tag = item.select_one('span[class^="allstar"]')    if rating_tag:        rating_class = rating_tag.get('class', [''])[0]        comment['评分'] = int(rating_class.replace('allstar''')) // 10    else:        comment['评分'] = '无评分'        # 评论时间    time_tag = item.select_one('.comment-time')    comment['评论时间'] = time_tag.get('title').strip() if time_tag else ''        # 用户地址    location_tag = item.select_one('.comment-location')    comment['用户地址'] = location_tag.text.strip() if location_tag else ''        # 评论内容    content_tag = item.select_one('.comment-content')    comment['评论内容'] = content_tag.text.strip() if content_tag else ''        return commentdef get_comments(url):    """获取单页评论数据"""    try:        response = requests.get(url, headers=get_headers(), timeout=10)        response.raise_for_status()        soup = BeautifulSoup(response.text, 'lxml')        items = soup.select('.comment-item')        return [parse_comment(item) for item in items]    except Exception as e:        print(f'请求失败:{url},错误:{e}')        return []def main():    base_url = 'https://movie.douban.com/subject/34780991/comments'    all_comments = []        for page in range(5):        # 构造分页URL        start = page * 20        url = f'{base_url}?start={start}&limit=20&status=P&sort=new_score'                # 获取数据        print(f'正在爬取第 {page + 1} 页...')        comments = get_comments(url)        all_comments.extend(comments)                # 随机延时        sleep_time = random.uniform(35)        print(f'等待 {sleep_time:.2f} 秒...')        time.sleep(sleep_time)        # 保存数据,按指定顺序排列字段    columns_order = ['用户昵称''评分''评论时间''用户地址''评论内容']    df = pd.DataFrame(all_comments, columns=columns_order)    df.to_excel('豆瓣电影评论数据.xlsx', index=False)    print('数据已保存到 豆瓣电影评论数据.xlsx')if __name__ == '__main__':    main()

爬取后的评论数据在文件树的project文件夹下,将影评数据导入以后,可以看到每一个用户的评价,基于该文本评论数据,可以进一步的做文本分析,研究观众对于该电影的口碑情况。

import pandas as pddf = pd.read_excel('/home/mw/project/豆瓣电影评论数据.xlsx')df.head()

以上,我们成功获取了《哪吒 2》的豆瓣短评数据,这不仅是一次有趣的爬虫实战,更是一次数据驱动的影视分析探索,希望大家能从这次实践中,感受到Python爬虫在信息获取的能力。

后台回复数据分析入门,获取数据分析入门资料
加入数据分析资料群,一起交流数据分析知识

关注和星标『大话数据分析』

和作者一起学习数据分析!

👆点击关注|设为星标|干货速递👆

前蚂蚁金服数据运营,现京东经营分析,公众号、知乎、头条「大话数据分析」主理人,专注于数据分析的实践与分享,掌握Python、SQL、PowerBI、Excel等数据分析工具,擅长运用技术解决企业实际问题。

【声明】内容源于网络
0
0
大话数据分析
数据分析的收集者、整理者、分享者、实践者
内容 408
粉丝 0
大话数据分析 数据分析的收集者、整理者、分享者、实践者
总阅读0
粉丝0
内容408