抖音数据采集分析工具python源码开放-抖音视频视频信息、评论信息、直播弹幕信息采集

# 基于Python的抖音数据采集工具开发实践

## 引言

随着短视频平台的快速发展,抖音作为国内最大的短视频平台之一,已经成为数据分析和内容运营的重要研究对象。本文将通过一个实际项目案例,详细介绍如何使用Python开发一个功能完善的抖音数据采集工具。该项目结合了多个Python库,实现了抖音视频和评论数据的自动化采集、数据存储和可视化展示等功能。

## 项目概述

本项目旨在开发一个桌面应用程序,能够实现以下功能:

1. **用户登录与认证**:通过卡密验证实现用户登录,确保工具的安全性。
2. **视频数据采集**:根据关键词搜索采集抖音视频信息,包括视频ID、描述、发布时间、点赞数、评论数等。
3. **评论数据采集**:根据视频ID采集相关评论信息,包括评论内容、发布时间、点赞数、作者信息等。
4. **数据展示与导出**:通过表格形式展示采集到的数据,并支持导出为Excel或CSV格式。
5. **日志记录与监控**:实时记录程序运行日志,便于问题排查和监控。

## 技术栈

本项目主要使用了以下技术栈:

• **Python**:作为主要开发语言。
• **Tkinter**:用于构建图形用户界面(GUI)。
• **Pandas**:用于数据处理和导出。
• **DrissionPage**:用于模拟浏览器操作,实现数据采集。
• **Loguru**:用于日志记录。
• **PJYSDK**:用于用户认证和卡密验证。

## 核心功能实现

### 1. 用户登录与认证

用户登录功能通过卡密验证实现,确保只有授权用户才能使用工具。核心代码如下:

```python
def gui_login(self):
    """处理卡密验证逻辑"""
    card = self.card_entry.get()
    if not card:
        messagebox.showinfo("提示", "请输入卡密")
        return
    pjysdk.on_heartbeat_failed = on_heartbeat_failed # 设置心跳失败回调函数
    device_id=get_device_id()
    pjysdk.set_device_id(device_id)  # 设置设备唯一ID
    pjysdk.set_card(card)  # 设置卡密
    ret = pjysdk.card_login()  # 卡密登录
    if ret.code == 0:  # 登录成功
        messagebox.showinfo("提示", "验证成功,正在加载主界面...")
        self.login_status = True
        self.setup_main_ui()
    else:
        messagebox.showinfo("错误", "卡密错误,请重试")
```

### 2. 视频数据采集

视频数据采集功能通过模拟浏览器操作,获取抖音视频的详细信息。核心代码如下:

```python
def collect_video(self, keyword):
    self.page.listen.start('https://www.douyin.com/aweme/v1/web/search/item/?device_platform=webapp')
    self.page.get(f'https://www.douyin.com/search/{keyword}?type=video')
    res = self.page.listen.wait()
    video_list = self.parse_video_response(res)
    self.update_table(video_list)
    while not self.stop_event.is_set():
        try:
            self.page.scroll.to_bottom()
            time.sleep(2)
            res = self.page.listen.wait(timeout=5)
            data = res.response.body
            items = data['data']
        except Exception as e:
            log.info(f"采集完成")
            break
        else:
            video_list = self.parse_video_response(res)
            self.update_table(video_list)
```

### 3. 评论数据采集

评论数据采集功能通过视频ID获取相关评论信息。核心代码如下:

```python
def collect_comments(self, video_ids):
    """评论采集方法框架(待实现)"""
    for video_id in video_ids:
        if self.stop_event.is_set():
            log.info("采集已暂停")
            break
        link=f'https://www.douyin.com/video/{video_id}'
        self.page.listen.start('https://www-hj.douyin.com/aweme/v1/web/comment/list/?device_platform=webapp')
        self.page.get(link)
        self.page.ele('x://*[@id="douyin-right-container"]/div[2]/div/div/div[1]/div[2]/div/xg-video-container/video').click()
        log.info('视频暂停成功')
        res=self.page.listen.wait()
        comments_list=self.parse_comments_response(res)
        self.update_table(comments_list, mode='comment')
        while not self.stop_event.is_set():
            try:
                self.page.ele('@class=parent-route-container route-scroll-container h5AVrOfS').scroll.to_bottom()
                time.sleep(2)
                res = self.page.listen.wait(timeout=5)
                data = res.response.body
                items = data['comments']
            except :
                log.info(f"{video_id}采集完成")
                break
            else:
                comments_list = self.parse_comments_response(res)
                self.update_table(comments_list, mode='comment')
```

### 4. 数据展示与导出

采集到的数据通过表格形式展示,并支持导出为Excel或CSV格式。核心代码如下:

```python
def export_selected(self, mode='video'):
    """导出选中数据"""
    if mode == 'video':
        tree = self.video_tree
        sheet_name = '视频数据'
    else:
        tree = self.comment_tree
        sheet_name = '评论数据'
        
    selected_items = tree.selection()
    if not selected_items:
        messagebox.showwarning("警告", "请先选择要导出的数据")
        return

    # 获取表头信息
    columns = tree['columns']
    headers = [tree.heading(col)['text'] for col in columns]
    
    # 过滤掉"选择"列
    data_columns = columns[1:]
    header_names = headers[1:]

    # 收集选中数据
    data = []
    for item in selected_items:
        values = tree.item(item)['values'][1:]  # 跳过选择列
        data.append(values)

    # 弹出保存对话框
    file_path = filedialog.asksaveasfilename(
        defaultextension='.xlsx',
        filetypes=[
            ('Excel 文件', '*.xlsx'),
            ('CSV 文件', '*.csv'),
            ('所有文件', '*.*')
        ],
        title="保存导出文件"
    )

    if not file_path:
        return  # 用户取消保存

    try:
        # 创建DataFrame
        df = pd.DataFrame(data, columns=header_names)

        # 根据文件类型保存
        if file_path.endswith('.xlsx'):
            # 添加日期格式化
            writer = pd.ExcelWriter(file_path, engine='xlsxwriter')
            df.to_excel(writer, index=False, sheet_name='视频数据')
            
            # 自动调整列宽
            worksheet = writer.sheets['视频数据']
            for idx, col in enumerate(df.columns):
                max_len = max(df[col].astype(str).map(len).max(), len(col)) + 2
                worksheet.set_column(idx, idx, max_len)
            
            writer.close()
        elif file_path.endswith('.csv'):
            df.to_csv(file_path, index=False, encoding='utf_8_sig')
        else:
            messagebox.showerror("错误", "不支持的文件格式")
            return

        # 显示导出结果
        export_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        success_msg = f"""
        导出成功!
        
        导出文件:{os.path.basename(file_path)}
        保存路径:{os.path.dirname(file_path)}
        导出时间:{export_time}
        导出记录:{len(data)} 条
        """
        messagebox.showinfo("导出完成", success_msg)
        log.info(f"成功导出 {len(data)} 条数据到 {file_path}")

    except PermissionError:
        messagebox.showerror("错误", "文件被占用,请关闭后重试")
        log.error("导出失败:文件权限被拒绝")
    except Exception as e:
        messagebox.showerror("错误", f"导出失败:{str(e)}")
        log.error(f"导出异常:{str(e)}")
```

### 5. 日志记录与监控

日志记录功能通过Loguru库实现,实时记录程序运行日志。核心代码如下:

```python
def setup_logging(self):
    log.remove()
    log.add(self.log_queue.put, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}")

def update_log_display(self):
    while not self.log_queue.empty():
        record = self.log_queue.get()
        self.log_area.configure(state='normal')
        
        # 解析日志记录
        if '| INFO |' in record:
            time_part = record.split(' | ')[0]
            msg_part = ' | '.join(record.split(' | ')[2:])
            
            # 插入带颜色的时间戳
            self.log_area.insert(tk.END, time_part + ' ', 'time')
            self.log_area.insert(tk.END, ' | ', 'separator')
            self.log_area.insert(tk.END, msg_part + '\n', 'info')
        elif '| ERROR |' in record:
            time_part = record.split(' | ')[0]
            msg_part = ' | '.join(record.split(' | ')[2:])
            
            self.log_area.insert(tk.END, time_part + ' ', 'time')
            self.log_area.insert(tk.END, ' | ', 'separator')
            self.log_area.insert(tk.END, msg_part + '\n', 'error')
        else:
            self.log_area.insert(tk.END, record + '\n')
        
        # 配置标签颜色
        self.log_area.tag_configure('time', foreground=self.log_time_color)
        self.log_area.tag_configure('info', foreground=self.log_info_color)
        self.log_area.tag_configure('error', foreground=self.log_error_color)
        self.log_area.tag_configure('separator', foreground=self.fg_color)
        
        self.log_area.configure(state='disabled')
        self.log_area.yview(tk.END)
    self.master.after(100, self.update_log_display)
```

## 项目总结

本项目通过结合多个Python库,实现了一个功能完善的抖音数据采集工具。该工具不仅能够自动化采集抖音视频和评论数据,还提供了友好的用户界面和丰富的功能,如数据展示、导出、日志记录等。通过本项目的开发,我们深入理解了Python在桌面应用开发和数据采集中的应用,也为后续的数据分析和内容运营提供了有力的支持。

弹幕采集:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛马程序员2025

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值