DrissionPage采集抖音搜索结果详情信息及各视频的评论详情

目前正在做的一个项目,因为涉及到社交媒体的相关数据,在采集douyin数据的时候接触到了DrissionPage这个库,相对于该帖子发布的时间来说,该库的时效性较新,且目前在数据采集领域也属于较为新颖的方法。

DissionPage官网:🛸 概述 | DrissionPage官网 是国内大神开源的项目,有能力可以多多支持,目前作者还有在不断维护

代码参考:

参考了b站@时一十一姐呀 的讲解视频 p0一个暂时放弃逆向奔向爬虫自动化数据采集的故事_哔哩哔哩_bilibili 

还有一个不知道是哪位老师的课:https://www.bilibili.com/video/BV1LJ4m1L7nB/?spm_id_from=333.337.search-card.all.click

 

话不多说,现在开始。


 

第一章 DrissionPage采集douyin搜索结果详情信息

目的:根据关键词在douyin搜索相关短视频,记录短视频的相关信息,包括视频ID、标题、点赞评论数,作者信息等。

实现:

1、一些需要了解的前置知识

①了解douyin搜索机制

这里有一个大坑,我个人在这里卡了好久;作者第一时间想到的是进入douyin首页,然后通过DrissionPage的ele().input()方法输入关键词,但是这里如果按照这种方法进入搜索结果详情页会导致接下来DrissionPage的scroll.to_bottom()方法失效;

解决方法:douyin搜索可以直接在地址后面加video/tag? 即可,如:将url设置为:https://www.douyin.com/video/黄山旅游? ;再通过DrissionPage的get方法获取该页面后,即可成功使用scroll.to_bottom()方法,具体原因作者才疏学浅也搞不懂为啥。

代码:

from DrissionPage import ChromiumPage
page = ChromiumPage()
page.set.timeouts(3)
page.get('https://www.douyin.com/video/黄山旅游?') page.wait(3)
page.scroll.to_bottom()

②了解搜索结果json数据包

douyin搜索结果的json数据包为aweme/v1/web/general/search/single/,使用DrissionPage监听数据包并采集,即可实现搜索结果数据采集。

 知道具体要监听的json数据包后,即可使用DrissionPage采集啦,然后解析一下数据包格式就可以获得想要的信息啦。

 

2、具体代码实现

不多说,直接上完整代码,这里只展示获取一个tag的搜索结果,想获取更多的话自己改改就行,不会改可以带价私我:

from DrissionPage import ChromiumPage
import datetime
import csv 
#社交媒体
##douyin,按搜索结果收集涉及视频。
page = ChromiumPage()
page.set.timeouts(3)

page.get('https://www.douyin.com/search/药水哥?')
page.listen.start('aweme/v1/web/general/search/single/')


f = open('data.csv', mode='a',encoding='utf-8',newline='')
csv_writer = csv.DictWriter(f,fieldnames=['vd_id',"vd_title","create_time","author"])
csv_writer.writeheader()   

#采集多少页,循环多少次就行
for i in range(10):
    print(f'正在采集{i+1}页内容')
    resp = page.listen.wait()
    json_data = resp.response.body
    # print(json_data)

    for i in range(len(json_data['data'])):
        
        if json_data['data'][i]['type'] == 1:
            
            vd_id = json_data['data'][i]['aweme_info']['aweme_id']
            vd_title = json_data['data'][i]['aweme_info']['desc']
        
            create_time = str(datetime.datetime.fromtimestamp(json_data['data'][i]['aweme_info']['create_time']))
        
            author_nickname = json_data['data'][i]['aweme_info']['author']['nickname']
            enterprise_verify = json_data['data'][i]['aweme_info']['author']['enterprise_verify_reason']
        
            vd_info = {
                "vd_id":vd_id,
                "vd_title":vd_title,
                "create_time":create_time,
                "author":{
                    "author_nickname":author_nickname,
                    "enterprise_verify":enterprise_verify
                }
            }
            csv_writer.writerow(vd_info)
        else:
            continue
    page.scroll.to_bottom()
    print(f'A total of {i+1} data pieces were collected!————————————————————————————————————————————————————')

  比较懒,不喜欢标注释,有问题直接评论找我。


 

第二章 DrissionPage采集douyin视频评论信息

上述实现按tag获取douyin搜索的结果,不包含视频下载,因为这次涉及的项目主要做的文本分析,所以上述代码中没涉及到视频获取,想要获取视频也比较简单,找到视频对应的地址下载就行,有兴趣的可以在网上找找看看。

接下来要介绍一下收集到的视频的评论数据如何获取,依旧按上述的讲解步骤进行。

目的:获取各视频的评论信息。

实现:

1、需要了解的前置知识

①视频评论数据获取不建议和检索结果一同采集

为什么会有这个见意呢?主要出于如下原因:1)如果从检索结果页点击进入视频详情页,视频详情页会较为复杂,且涉及局部滚动,有点点繁琐;2)直接从视频id进入详情页会简单些,且上一步我们已经获取到了检索结果的各视频id。

②评论数据的json数据包

获取方法和上面1中所述是一样的,就先在开发者模式下搜索评论,再找到对应的json,观察一下json的数据格式,按需提取想要的信息就行,不截图也不再演示了,直接给出需要监听的json地址:'aweme/v1/web/comment/list/'

③详情页滚动如何实现

进入详情页后,如果直接运行page.scroll.to_bottom()会发现根本无法实现评论也翻页,也就没法加载出新的评论Json数据,这里我在b站看的视频就是直接用的这行代码,不知道是因为douyin这边更新了还是说怎么滴,反正我按他视频里的方法就是没法实现翻页。于是我看了b站@时一十一姐呀 的视频,私信请教了她,她的回复解决了我疑问,我这边就不说为啥了,直接给出解决方案:找到滚动条定义为一个元素,然后再使用DrissionPage的actions.scroll()方法对定义的元素进行翻页操作即可;

button = page.ele('.:parent-route-container route-scroll-container IhmVuo1S')
page.actions.scroll(500,0,button)

但是这里的翻页操作只能定义翻页距离,不能像scroll.to_bottom() 方法那样直接翻页到底部,所以这里coding时就需要调整一下思路了,这里也是参考了十一姐的思路进行修改的。

2、代码实现

不说废话,直接上代码,这里也是仅展示提取一条视频评论时的代码,想要提取多条的话自己改改就行,不会改可以带价私信我。

##按视频编号收集评论数据
import pandas as pd

data = pd.read_csv('./data.csv')

page = ChromiumPage()
page.set.timeouts(3)

url='https://www.douyin.com/video/'+str(data['vd_id'][0])
page.listen.start('aweme/v1/web/comment/list/')
button = page.ele('.:parent-route-container route-scroll-container IhmVuo1S')

import time
time.sleep(5)

# f = open('comments.csv', mode='a',encoding='utf-8',newline='')
# csv_writer = csv.DictWriter(f,fieldnames=['昵称',"地区","时间","评论"])
# csv_writer.writeheader()

print(f'page 1 is collected')
resp = page.listen.wait()
json_data = resp.response.body
#print(json_data)
comments = json_data['comments']
comments_old = comments
for index in comments:
    text = index['text']
    nickname = index['user']['nickname']
    create_time = index['create_time']
    date = str(datetime.datetime.fromtimestamp(create_time))
    ip_label = index['ip_label']
    dit = {
        "昵称": nickname,
        "地区": ip_label,
        "时间": date,
        "评论": text
    }
    # csv_writer.writerow(dit)
    print(dit)
    
i=0
while True:
    page.actions.scroll(500,0,button)
    resp = page.listen.wait()
    json_data = resp.response.body
    #print(json_data)
    comments = json_data['comments']
    
    if comments == comments_old:
        continue
    else:
        i += 1
        for index in comments:
            text = index['text']
            nickname = index['user']['nickname']
            create_time = index['create_time']
            date = str(datetime.datetime.fromtimestamp(create_time))
            ip_label = index['ip_label']
            dit = {
                "昵称": nickname,
                "地区": ip_label,
                "时间": date,
                "评论": text
            }
            # csv_writer.writerow(dit)
            print(dit)
    if i >= 5:
        #想要获取多少页可以在这里设置
        print(f'已收集{i+1}页评论,现在停止!')
        break

和上面一样,比较懒不喜欢注释,有问题可以直接问,想要定制带价私。

 

posted on 2024-10-28 17:27  Dababao  阅读(810)  评论(2)    收藏  举报