
在信息爆炸的时代,社交媒体上的用户讨论蕴含着巨大的价值。无论是影视宣发效果评估,还是受众情感倾向分析,都需要从海量的社交媒体内容中提取有效信息。《疯狂动物城》作为一部兼具口碑与热度的经典动画电影,其相关社交媒体讨论至今仍保持着一定活跃度。本文将通过 Python 爬虫实战,详细讲解如何抓取微博平台上《疯狂动物城》的相关讨论数据,包括技术选型、核心逻辑实现、反爬规避及数据保存等关键环节,帮助读者掌握实用的爬虫开发技能。
爬虫开发的核心需求是发送网络请求、解析页面内容和数据存储,本次实战选用以下成熟工具库:
首先确保本地已安装 Python 3.7 及以上版本(推荐 3.9 版本)
本次抓取的目标是微博搜索结果页,其核心特征如下:
https://s.weibo.com/weibo?q=关键词&page=页码,其中q参数为搜索关键词(需 URL 编码,requests 库会自动处理),page参数为分页页码。爬虫的整体工作流程遵循 "请求 - 解析 - 存储" 的经典模式,具体步骤如下:
首先导入所需库并配置核心参数,其中请求头(Headers)是规避反爬的关键:
python
运行
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
# 全局配置参数(可根据需求调整)
KEYWORD = "疯狂动物城" # 搜索关键词
PAGE_NUM = 10 # 计划抓取的页数(建议≤20,避免反爬)
SAVE_PATH = "zootopia_social_media_data.csv" # 数据保存路径
# 伪装浏览器请求头(关键!模拟真实用户访问)
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Referer": "https://s.weibo.com/", # Referer字段,表明请求来源
"Cookie": "请替换为你的微博Cookie(登录后获取,可选但推荐)"
}关键说明:
负责发送 HTTP 请求,获取单页 HTML 内容,并处理异常情况:
python
运行
def fetch_weibo_page(page):
"""
发送请求获取指定页码的微博搜索结果页面
:param page: 页码(int)
:return: 页面HTML内容(str)或None(请求失败)
"""
# 拼接完整URL,requests会自动对关键词进行URL编码
url = f"https://s.weibo.com/weibo?q={KEYWORD}&page={page}"
try:
# 随机延迟1-3秒,避免高频请求触发反爬
time.sleep(random.uniform(1, 3))
# 发送GET请求,设置超时时间10秒
response = requests.get(
url=url,
headers=HEADERS,
timeout=10,
allow_redirects=True # 允许重定向
)
# 检查响应状态码,非200则抛出异常
response.raise_for_status()
# 自动识别页面编码,避免中文乱码
response.encoding = response.apparent_encoding
print(f"第{page}页请求成功,状态码:{response.status_code}")
return response.text
except requests.exceptions.HTTPError as e:
print(f"第{page}页请求失败,HTTP错误:{e}")
except requests.exceptions.ConnectionError:
print(f"第{page}页请求失败,网络连接错误")
except requests.exceptions.Timeout:
print(f"第{page}页请求失败,超时未响应")
except Exception as e:
print(f"第{page}页请求失败,未知错误:{str(e)}")
return None异常处理设计:
random.uniform(1,3)生成 1 到 3 秒的随机延迟,模拟人类浏览行为,降低被识别为爬虫的概率。使用 BeautifulSoup 解析 HTML,提取核心数据,这是爬虫的核心环节:
python
运行
def parse_weibo_content(html):
"""
解析微博页面HTML,提取核心数据
:param html: 页面HTML内容(str)
:return: 解析后的数据集(list of dict)
"""
# 初始化BeautifulSoup对象,使用html.parser解析器(内置无需额外安装)
soup = BeautifulSoup(html, "html.parser")
# 定位所有微博卡片容器(通过CSS选择器,可通过浏览器开发者工具查看)
weibo_cards = soup.select(".card-wrap")
parsed_data = []
for card in weibo_cards:
# 过滤非微博内容卡片(如广告、推荐关注、话题卡片等)
content_container = card.select_one(".content")
if not content_container:
continue
# 1. 提取用户名(class="name"下的a标签文本)
username_elem = content_container.select_one(".name a")
username = username_elem.get_text(strip=True) if username_elem else "未知用户"
# 2. 提取发布时间(class="time"的span标签文本)
time_elem = content_container.select_one(".time")
pub_time = time_elem.get_text(strip=True) if time_elem else "未知时间"
# 3. 提取微博内容(class="txt"的div标签,去除多余空格和换行)
content_elem = content_container.select_one(".txt")
if content_elem:
# 清除内容中的多余标签(如em、a等),保留纯文本
for extra_tag in content_elem.select("em, a[target='_blank']"):
extra_tag.extract()
content = content_elem.get_text(strip=True, separator=" ")
else:
content = "无有效内容"
# 4. 提取互动数据(点赞、评论、转发)
# 互动数据容器:class="card-act"的div标签
act_container = card.select_one(".card-act")
if act_container:
# 转发数(class="repost"的span标签)
repost_elem = act_container.select_one(".repost")
repost_num = repost_elem.get_text(strip=True) if repost_elem else "0"
# 评论数(class="comment"的span标签)
comment_elem = act_container.select_one(".comment")
comment_num = comment_elem.get_text(strip=True) if comment_elem else "0"
# 点赞数(class="like"的span标签)
like_elem = act_container.select_one(".like")
like_num = like_elem.get_text(strip=True) if like_elem else "0"
else:
repost_num = comment_num = like_num = "0"
# 处理互动数据格式(将"万"转换为数字,如"1.2万"→12000)
def format_interaction_num(num_str):
if "万" in num_str:
try:
return str(int(float(num_str.replace("万", "")) * 10000))
except:
return num_str
return num_str
repost_num = format_interaction_num(repost_num)
comment_num = format_interaction_num(comment_num)
like_num = format_interaction_num(like_num)
# 整理单条微博数据为字典
weibo_item = {
"用户名": username,
"发布时间": pub_time,
"微博内容": content,
"转发数": repost_num,
"评论数": comment_num,
"点赞数": like_num
}
parsed_data.append(weibo_item)
return parsed_data解析逻辑关键点:
将解析后的多页数据整合,导出为 CSV 文件:
python
运行
def save_crawled_data(all_data):
"""
将抓取的所有数据保存为CSV文件
:param all_data: 整合后的数据集(list of dict)
:return: 无返回值
"""
if not all_data:
print("无有效数据可保存")
return
# 转换为DataFrame格式(pandas核心数据结构)
df = pd.DataFrame(all_data)
# 保存为CSV文件,encoding="utf-8-sig"支持中文正常显示
df.to_csv(
path_or_buf=SAVE_PATH,
index=False, # 不保存索引列
encoding="utf-8-sig",
sep="," # 字段分隔符
)
# 输出保存结果统计信息
print(f"\n数据保存完成!文件路径:{SAVE_PATH}")
print(f"共抓取有效讨论:{len(all_data)} 条")
print(f"数据字段:{list(df.columns)}")
# 输出前5条数据预览
print("\n数据预览:")
print(df.head())数据保存优势:
utf-8-sig编码,解决 CSV 文件中文乱码问题,兼容 Excel 和 WPS 打开。整合上述函数,实现批量抓取逻辑:
python
运行
def main():
"""主程序:协调请求、解析、保存流程"""
print(f"===== 开始抓取【{KEYWORD}】相关微博讨论 =====")
print(f"计划抓取页数:{PAGE_NUM} 页")
print(f"数据保存路径:{SAVE_PATH}")
print("=" * 50)
# 存储所有页面的抓取数据
total_data = []
# 循环抓取指定页数
for page in range(1, PAGE_NUM + 1):
print(f"\n正在抓取第{page}页...")
# 1. 请求页面
html_content = fetch_weibo_page(page)
if not html_content:
print(f"第{page}页抓取跳过")
continue
# 2. 解析页面
page_data = parse_weibo_content(html_content)
# 3. 整合数据
total_data.extend(page_data)
print(f"第{page}页解析完成,新增 {len(page_data)} 条数据")
# 4. 保存数据
save_crawled_data(total_data)
print("\n===== 抓取任务结束 =====")
# 程序入口(仅当直接运行该脚本时执行)
if __name__ == "__main__":
main()fake-useragent库自动生成随机 User-Agent。threading(多线程)或aiohttp(异步)替代单线程请求,提升抓取效率(注意控制并发数,避免给服务器造成压力)。hash(content))或微博 ID 去重,避免抓取到重复内容。response.encoding = response.apparent_encoding),保存文件时使用utf-8-sig编码。jieba分词和snownlp库对微博内容进行情感倾向判断,分析用户对《疯狂动物城》的正面 / 负面 / 中性评价占比。jieba.analyse提取高频关键词,了解用户讨论的核心话题(如角色、剧情、台词等)。本文以微博为例,可快速扩展到其他社交媒体平台:
https://www.zhihu.com/search?q=疯狂动物城&type=content,解析时定位.List-item类的回答卡片。https://search.bilibili.com/all?keyword=疯狂动物城,解析视频评论区时需处理 AJAX 请求(推荐使用requests模拟接口请求)。https://www.xiaohongshu.com/search_result?keyword=疯狂动物城,需处理登录态和动态渲染(可使用Selenium模拟浏览器)。爬虫开发需严格遵守以下原则,避免法律风险和道德问题:
robots.txt协议(可通过https://s.weibo.com/robots.txt查看),不抓取禁止访问的内容。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。