Python 源代码 | 2024 版抖音评论采集爬虫

2024-01-12 15:53:03 浏览数 (1)

欢迎关注公众号「月小水长」,唯一笔者是 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 文件,核心代码如下:

代码语言:javascript复制
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 如下图所示:

0 人点赞