欢迎关注公众号「月小水长」,唯一笔者是 BuyiXiao,又名小布衣、肖不已。 BuyiXiao,何许人也?本衡州一乡野村夫,身高八尺不足,年方二十有余;弱冠之年曾求学于潭州,为谋生计,背井离乡,远赴京畿,我本南人,不习北土,兼有故友,威逼利诱,急于星火,遂下岭南,打工未半,中道创业,所为何业?赛博朋克,智能硬件;假工程师之名,行农民工之实,满腹经纶,无用书生,善于自黑,贻笑大方。 另外,文末点下「赞」和「在看」,这样每次新文章推送,就会第一时间出现在你的订阅号列表里。
当时的重点只是讲 hook 这种方法,并不是采集抖音评论,有点为了这瓶醋包了这碗饺子的意思在里面。
而且收到不少反馈说配置麻烦,于是就有了今天这期使用纯 Python 采集抖音评论,配置相对简单。
目标站点还是抖音网页版,其实抖音网页评论没啥反爬,访问接口时携带登录 cookie 和适当休眠时间即可获取到数据,然后使用返回数据里面的 cursor 获取下一页的偏移量(一般是 20)来控制翻页。
下面就以下面这个视频为例,简述下如何获取 cookie
https://www.douyin.com/video/7314079677939830068
1、在 Chrome 浏览器中打开上面这个视频地址。
2、F12 或者右键检(审)查打开网页开发者工具,切换到 Network 栏。
3、点开视频评论区,在 Network 栏下找到请求 web/comment/list/
,点击,复制请求的 Headers(Cookie) 和 Payload(Params)。
虽然已经说了很多次,但是考虑到新手友好,这个请求 cookie 的复制我还是多说一嘴,如果觉得上面流程不明白的,建议先百度学习下 F12 开发者工具的使用,5 分钟就能搞定。
走完上面流程,你应该得到的 headers 和 params 格式如下:
代码语言:javascript复制headers = {
'authority': 'www.douyin.com',
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9,en-CN;q=0.8,en;q=0.7,es-MX;q=0.6,es;q=0.5',
'cookie': '替换成你自己的 cookie',
'referer': 'https://www.douyin.com/user/MS4wLjABAAAAlfFujj6wKxN1TqrqqJu4XBaZqek6XwvvA_afAojNvWr1E4ZO_nadPC1Ku7XMpzfj?modal_id=7316808340519030055',
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
}
params = {
'device_platform': 'webapp',
'aid': '6383',
'channel': 'channel_pc_web',
'cursor': '0',
'count': '20',
'item_type': '0',
'insert_ids': '',
'whale_cut_token': '',
'cut_version': '1',
'rcFT': '',
'pc_client_type': '1',
'version_code': '170400',
'version_name': '17.4.0',
'cookie_enabled': 'true',
'screen_width': '1707',
'screen_height': '960',
'browser_language': 'zh-CN',
'browser_platform': 'Win32',
'browser_name': 'Chrome',
'browser_version': '120.0.0.0',
'browser_online': 'true',
'engine_name': 'Blink',
'engine_version': '120.0.0.0',
'os_name': 'Windows',
'os_version': '10',
'cpu_core_num': '16',
'device_memory': '8',
'platform': 'PC',
'downlink': '10',
'effective_type': '4g',
'round_trip_time': '150',
'webid': 'xxx替换',
'msToken': 'yyy替换',
'X-Bogus': 'zzz替换',
}
一般来说,只需要替换代码中 headers 的 cookie 和 params 中的xxx、yyy、zzz ,其余部分可保持不变。
有了 headers 和 params,就可以很方便地请求数据了,核心请求 翻页逻辑代码如下:
代码语言:javascript复制while True:
root_params['cursor'] = cursor
response = requests.get('https://www.douyin.com/aweme/v1/web/comment/list/', params=root_params,
headers=headers)
resp_json = response.json()
save_comments(resp_json, result_file)
cursor = str(resp_json['cursor'])
has_more = int(resp_json['has_more'])
if has_more <= 0:
print_with_time('root has no more')
break
sleep(slp_per_req)
其中 save_comments
是解析保存数据到 csv 文件,核心代码如下:
def save_comments(json_data, result_file):
comments = json_data.get('comments', None)
if not comments or len(comments) == 0:
return
if os.path.exists(result_file):
df = pd.read_csv(result_file)
else:
save_cols = ['aweme_id', 'cid', 'create_time', 'digg_count', 'is_author_digged', 'reply_comment_total',
'ip_location', 'text', 'reply_id', 'reply_to_reply_id', 'reply_to_username', 'reply_to_userid',
'userid', 'user_name', 'signature', 'verification_type', 'verify_info', 'user_short_id']
df = pd.DataFrame({key: [] for key in save_cols})
for comment in comments:
# to_parse_a_comment
采集完根评论后,几乎只需要在参数字典中新增comment_id
为根评论 id,就可以采集根评论的回复了,其请求翻页逻辑完全可以复用根评论请求,保存逻辑亦然。
实测单条视频最多可以采集到 几千-上万评论,10w 尚未测试,最后解析保存的字段有评论 id、回复的根评论 id(为 0 表示本身是根评论)、回复的二级评论 id(为 0 表示本身是根评论)、评论内容、评论时间、ip 属地、点赞数、回复数、评论用户名等等十余个字段,结果 csv 如下图所示: