游客发表
微博评论区的取微数据量比你想的要有价值得多。一条热门微博底下几千条评论,博评藏着用户情绪、取微产品反馈、博评舆论走向,取微甚至竞品动向。博评手动翻?取微翻到第三页你就想砸键盘了。用Python把评论抓下来,博评存成结构化数据,取微才是博评正经做法。
我上周盯上了一个话题,取微某品牌新品发布后微博底下骂声和夸声各占一半。博评想搞清楚用户到底在不满什么,取微靠肉眼刷根本不现实。博评于是取微写了个爬虫,半小时把三千多条评论全拉了下来。
微博移动端(m.weibo.cn)的评论接口比PC端友好太多。打开Chrome开发者工具,切到Network面板,在手机版微博里点开一条微博的评论区,往下滚动加载更多,你会看到一个反复出现的请求:
https://m.weibo.cn/comments/hotflow?id=微博ID&mid=微博ID&max_id_type=0 返回的是JSON,结构清晰。每条评论包含用户昵称、用户ID、评论内容、点赞数、发布时间、回复数。翻页靠返回数据里的max_id,下一次请求把它带上就行。
这里有个坑:不带Cookie请求几次之后会被限流,返回的ok字段变成0。解决办法是登录后从浏览器复制Cookie,塞进请求头里。
先装依赖:
pip install requests pandas 核心代码不复杂,我拆成三步走。
第一步,构造请求。关键是headers里带上Cookie和User-Agent,不然拿不到数据。
import requests import time import pandas as pd headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)', 'Cookie': '你的Cookie' } def get_comments(weibo_id, max_id=0): url = 'https://m.weibo.cn/comments/hotflow' params = { 'id': weibo_id, 'mid': weibo_id, 'max_id': max_id, 'max_id_type': 0 } r = requests.get(url, headers=headers, params=params) return r.json() 第二步,循环翻页。每次请求间隔1到2秒,别太猛。微博的风控不是摆设,请求频率高了直接给你返回空数据。
def crawl_all(weibo_id, pages=20): all_comments = [] max_id = 0 for i in range(pages): data = get_comments(weibo_id, max_id) if data.get('ok') != 1: print(f'第{ i+1}页被限流,停') break comments = data['data']['data'] for c in comments: all_comments.append({ '用户': c['user']['screen_name'], '内容': c['text'].replace('', ''), '点赞': c['like_count'], '时间': c['created_at'] }) max_id = data['data']['max_id'] print(f'第{ i+1}页拿到{ len(comments)}条') time.sleep(1.5) return all_comments 第三步,存下来。直接扔进DataFrame,导出CSV,后面想怎么分析都行。
comments = crawl_all('你的微博ID') df = pd.DataFrame(comments) df.to_csv('weibo_comments.csv', index=False, encoding='utf-8-sig') 跑完之后打开CSV,三千多条评论整整齐齐。我拿那个品牌的数据做了个词频统计,“卡顿”出现了217次,“发热”183次,“退货”96次。这比看十条测评视频都直观。
Cookie会过期。一般两三个小时就得换一次,写脚本的时候最好把Cookie单独放配置文件里,别硬编码。
评论内容里带HTML标签。微博的text字段里经常混着<a>标签和表情代码,用正则清一下更干净:
import re def clean_text(text): text = re.sub(r'<.*?>', '', text) text = re.sub(r'回复.*?:', '', text) return text.strip() 还有,热门评论和全部评论是两个不同的接口。上面用的是hotflow,拿的是热门评论。要拿全部评论得用comments/show接口,参数稍微不同,但逻辑一样。
爬数据这事,技术门槛不高,难的是搞清楚你要什么。别为了爬而爬,先想明白拿到数据要回答什么问题。我见过有人爬了几万条评论存着吃灰,那还不如直接刷微博。
随机阅读
热门排行
友情链接