基于Python的TikTok数据爬取与可视化分析实战项目
TikTok API 是开发者与 TikTok 平台进行数据交互的核心接口,广泛应用于短视频、用户行为、评论数据等信息的抓取与分析。本章将从 API 的基本组成结构入手,介绍其 RESTful 风格的设计原理,以及如何通过访问令牌(Access Token)进行身份验证与授权。我们将结合第三方库(如 TikTokApi)演示如何封装请求逻辑,提升调用效率,并讲解请求频率限制与反爬机制的应对策略。此
简介:本项目“tiktok_scrap”利用TikTok API进行数据抓取,结合Python实现数据处理与分析,并通过Power BI进行可视化展示。项目涵盖Python基础语法、API调用、数据清洗与转换、数据可视化等内容,使用了如requests、Pandas、Numpy、Matplotlib等关键技术工具,适合想要掌握社交媒体数据爬取与分析全流程的开发者学习与实践。 
1. TikTok API接口调用与数据抓取概述
TikTok API 是开发者与 TikTok 平台进行数据交互的核心接口,广泛应用于短视频、用户行为、评论数据等信息的抓取与分析。本章将从 API 的基本组成结构入手,介绍其 RESTful 风格的设计原理,以及如何通过访问令牌(Access Token)进行身份验证与授权。
在数据抓取方面,TikTok API 提供了丰富的接口资源,如获取用户主页信息、视频详情、评论列表、点赞数据等。我们将结合第三方库(如 TikTokApi)演示如何封装请求逻辑,提升调用效率,并讲解请求频率限制与反爬机制的应对策略。
此外,本章还将介绍 API 请求的常见参数,包括 user_id 、 video_id 、 cursor 分页机制等,为后续章节中使用 requests 库发起 HTTP 请求打下坚实基础。
2. Python基础语法与编程实践
Python 是一门广泛应用于数据抓取、自动化脚本、网络编程和机器学习等领域的高级编程语言。其语法简洁、可读性强,特别适合初学者入门,也深受专业开发者的青睐。本章将从 Python 的基础语法入手,逐步深入到面向对象编程、异常处理、文件操作等核心编程实践内容,为后续章节中调用 API 和数据抓取奠定坚实的基础。
2.1 Python语言核心语法
Python 的核心语法是构建任何程序的基石。掌握变量定义、控制结构、函数定义等基本语法结构,是进行后续高级编程的前提。
2.1.1 变量定义与基本数据类型
Python 是一种动态类型语言,变量无需声明类型即可直接使用。常见的基本数据类型包括整数(int)、浮点数(float)、字符串(str)、布尔值(bool)等。
# 示例:基本数据类型的定义与使用
age = 25 # 整数
height = 1.75 # 浮点数
name = "John" # 字符串
is_student = True # 布尔值
print(type(age)) # 输出: <class 'int'>
print(type(height)) # 输出: <class 'float'>
print(type(name)) # 输出: <class 'str'>
print(type(is_student)) # 输出: <class 'bool'>
逐行分析 :
- 第1~4行:定义变量并赋值。
- 第6~9行:通过type()函数查看变量类型。
-print()函数用于输出信息。
数据类型转换表:
| 数据类型 | 描述 | 示例 |
|---|---|---|
int |
整数 | x = 5 |
float |
浮点数 | y = 3.14 |
str |
字符串 | s = "hello" |
bool |
布尔值 | flag = True |
None |
空值 | value = None |
2.1.2 控制结构(条件语句、循环语句)
Python 提供了丰富的控制结构,包括条件判断(if-elif-else)和循环结构(for、while)。
# 示例:条件语句
score = 85
if score >= 90:
print("A")
elif score >= 80:
print("B")
else:
print("C")
逐行分析 :
- 第2行:设置变量score为 85。
- 第3~7行:根据分数判断成绩等级。
# 示例:for循环
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
逐行分析 :
- 第2行:定义一个列表fruits。
- 第3~4行:使用for循环遍历列表中的每一个元素。
# 示例:while循环
i = 1
while i <= 5:
print(i)
i += 1
逐行分析 :
- 第2行:初始化变量i为 1。
- 第3~5行:使用while循环打印数字 1~5。
2.1.3 函数定义与模块化编程
函数是组织代码的基本单元。通过定义函数,可以实现代码的复用和模块化。
# 示例:函数定义
def greet(name):
return f"Hello, {name}!"
print(greet("Alice"))
逐行分析 :
- 第2~3行:定义函数greet,接受一个参数name,返回字符串。
- 第5行:调用函数并输出结果。
graph TD
A[开始] --> B[定义函数greet]
B --> C[接收参数name]
C --> D[返回Hello消息]
D --> E[调用函数并输出]
E --> F[结束]
2.2 面向对象编程基础
面向对象编程(OOP)是 Python 的核心特性之一。它通过类和对象的方式组织代码,提升代码的可维护性和扩展性。
2.2.1 类与对象的基本概念
类是对具有相同属性和行为的对象的抽象,而对象是类的具体实例。
# 示例:定义一个简单的类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
return f"My name is {self.name}, I am {self.age} years old."
# 创建对象
p = Person("Tom", 30)
print(p.introduce())
逐行分析 :
- 第2~7行:定义Person类,包含构造函数__init__和方法introduce。
- 第10行:创建Person类的实例p。
- 第11行:调用方法并输出结果。
2.2.2 类的继承与多态性
继承是面向对象编程中的重要概念,它允许一个类继承另一个类的属性和方法。多态则允许不同类的对象对同一方法做出不同的响应。
# 示例:类的继承
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
def introduce(self):
return f"{super().introduce()} and my ID is {self.student_id}."
s = Student("Lucy", 20, "S12345")
print(s.introduce())
逐行分析 :
- 第2~8行:定义Student类继承Person类,并重写introduce方法。
- 第11~12行:创建Student实例并调用方法。
继承关系图:
classDiagram
class Person {
+name
+age
+introduce()
}
class Student {
+student_id
+introduce()
}
Student --|> Person
2.2.3 实例方法与静态方法
实例方法依赖于类的实例,而静态方法则不依赖于实例或类的状态。
# 示例:实例方法与静态方法
class MathUtils:
@staticmethod
def add(a, b):
return a + b
def multiply(self, a, b):
return a * b
# 静态方法调用
print(MathUtils.add(5, 3)) # 输出: 8
# 实例方法调用
mu = MathUtils()
print(mu.multiply(4, 6)) # 输出: 24
逐行分析 :
- 第2~7行:定义MathUtils类,包含静态方法add和实例方法multiply。
- 第10行:通过类名调用静态方法。
- 第13~14行:通过实例调用实例方法。
2.3 异常处理与文件操作
在实际开发中,程序可能会遇到各种运行时错误,如文件不存在、除以零等。Python 提供了强大的异常处理机制来应对这些情况。
2.3.1 异常捕获与处理机制
Python 使用 try-except 块来捕获和处理异常。
# 示例:异常处理
try:
result = 10 / 0
except ZeroDivisionError as e:
print("Error: Cannot divide by zero!", e)
finally:
print("Execution completed.")
逐行分析 :
- 第2行:尝试执行除以零的操作。
- 第3~4行:捕获ZeroDivisionError异常并输出提示。
- 第5~6行:无论是否发生异常,finally块都会执行。
常见异常类型对照表:
| 异常类型 | 描述 |
|---|---|
ZeroDivisionError |
除以零 |
FileNotFoundError |
文件未找到 |
ValueError |
值错误 |
TypeError |
类型错误 |
IndexError |
索引超出范围 |
2.3.2 文件的读写与JSON数据处理
文件操作是 Python 编程的重要部分。Python 支持多种文件操作模式,如读取(r)、写入(w)、追加(a)等。
# 示例:文件写入
with open('data.txt', 'w') as file:
file.write("Hello, World!\n")
file.write("This is a test file.\n")
# 示例:文件读取
with open('data.txt', 'r') as file:
content = file.read()
print(content)
逐行分析 :
- 第2~4行:使用with打开文件并写入内容。
- 第7~9行:读取文件内容并输出。
Python 还支持 JSON 格式的处理,用于数据序列化与反序列化。
import json
# 示例:将字典转为JSON字符串
data = {
"name": "Alice",
"age": 28,
"city": "Shanghai"
}
json_str = json.dumps(data)
print(json_str)
# 示例:将JSON字符串转为字典
loaded_data = json.loads(json_str)
print(loaded_data["city"])
逐行分析 :
- 第4~7行:定义字典并转换为 JSON 字符串。
- 第9~11行:将 JSON 字符串转换回字典并访问字段。
2.3.3 日志记录与调试技巧
Python 提供了 logging 模块用于记录日志信息,有助于调试和分析程序运行状态。
import logging
# 配置日志格式和级别
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 记录日志
logging.info("Program started.")
logging.warning("This is a warning message.")
logging.error("An error occurred.")
逐行分析 :
- 第4行:设置日志级别为INFO,并定义输出格式。
- 第7~9行:记录不同级别的日志信息。
日志级别说明表:
| 级别 | 描述 |
|---|---|
DEBUG |
详细调试信息 |
INFO |
一般信息 |
WARNING |
警告信息 |
ERROR |
错误信息 |
CRITICAL |
严重错误 |
本章通过深入讲解 Python 的基础语法、面向对象编程和异常处理机制,为读者打下了扎实的编程基础。这些知识将在后续章节中被广泛用于调用 API、处理数据和构建完整的数据抓取系统。
3. 使用requests库发起HTTP请求获取数据
在现代数据抓取与API交互的实践中, requests 库作为 Python 中最常用的 HTTP 客户端库之一,为开发者提供了简洁、高效的接口用于发起各种类型的 HTTP 请求。本章将深入探讨 HTTP 协议的基础知识,解析 requests 库的核心使用技巧,并通过与 TikTok API 的集成实践,展示如何从真实平台中获取结构化数据。
3.1 HTTP协议基础与API交互原理
3.1.1 HTTP请求方法(GET、POST等)
HTTP(HyperText Transfer Protocol)是客户端与服务器之间通信的基础协议,其请求方法定义了客户端希望执行的操作类型。最常用的请求方法包括:
| 方法 | 描述 | 示例场景 |
|---|---|---|
| GET | 从服务器获取资源,请求参数附在 URL 后面 | 获取用户列表 |
| POST | 向服务器提交数据,通常用于创建资源 | 提交表单数据 |
| PUT | 替换指定资源 | 更新用户信息 |
| DELETE | 删除指定资源 | 删除用户账号 |
| PATCH | 部分更新资源 | 修改用户昵称 |
在 API 接口交互中,TikTok 的开放接口通常以 GET 和 POST 方法为主。例如,获取某个视频的评论数据通常使用 GET 方法,而上传视频则可能使用 POST。
3.1.2 请求头、请求参数与响应结构
HTTP 请求由请求行、请求头和请求体组成:
- 请求头(Headers) :包含元信息,如
Content-Type、Authorization、User-Agent等。 - 请求参数(Parameters) :附加在 URL 查询字符串中的键值对,用于指定请求的具体内容。
- 请求体(Body) :POST 请求中用于传输数据的部分。
HTTP 响应结构包括:
- 状态码(Status Code) :表示请求是否成功,如 200(成功)、404(未找到)、500(服务器错误)等。
- 响应头(Response Headers) :如
Content-Type、Set-Cookie。 - 响应体(Response Body) :服务器返回的具体数据,常见为 JSON 或 HTML 格式。
import requests
response = requests.get("https://api.example.com/data", params={"page": 1})
print("Status Code:", response.status_code)
print("Headers:", response.headers)
print("Response Body:", response.json())
代码分析:
-requests.get()发起一个 GET 请求。
-params参数用于传递查询参数。
-response.status_code获取 HTTP 响应状态码。
-response.headers返回响应头信息。
-response.json()自动解析 JSON 格式的响应内容。
3.1.3 状态码解析与错误处理
状态码是理解请求结果的关键。以下是常见的 HTTP 状态码分类:
| 状态码范围 | 含义 |
|---|---|
| 1xx | 信息性响应 |
| 2xx | 成功(如 200 OK) |
| 3xx | 重定向 |
| 4xx | 客户端错误(如 404 Not Found) |
| 5xx | 服务器错误(如 500 Internal Server Error) |
在使用 requests 时,可以通过 response.raise_for_status() 自动抛出异常来处理非 2xx 的响应:
try:
response = requests.get("https://api.example.com/invalid-url")
response.raise_for_status()
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
参数说明:
-raise_for_status()会在响应状态码不是 2xx 时抛出HTTPError异常。
- 可以使用try-except结构进行错误捕获和处理。
3.2 requests库的使用技巧
3.2.1 发起基本请求与响应处理
requests 支持多种类型的 HTTP 请求,下面是一个使用 POST 方法提交 JSON 数据的示例:
import requests
url = "https://api.example.com/submit"
data = {"username": "john_doe", "password": "secret"}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=data, headers=headers)
print(response.text)
代码逻辑分析:
-requests.post()发起 POST 请求。
-json=data自动将字典序列化为 JSON,并设置Content-Type: application/json。
-headers设置请求头信息。
-response.text获取响应的原始文本内容。
3.2.2 会话对象(Session)与持久连接
当需要多次请求相同主机时,使用 Session 对象可以保持底层的 TCP 连接,提高性能:
import requests
with requests.Session() as session:
session.headers.update({"Authorization": "Bearer token123"})
response1 = session.get("https://api.example.com/data1")
response2 = session.get("https://api.example.com/data2")
mermaid流程图:
graph TD
A[创建Session对象] --> B[设置共享Header]
B --> C[发起GET请求1]
C --> D[发起GET请求2]
D --> E[复用TCP连接]
优势:
- 会话对象自动复用底层连接,减少握手开销。
- 可统一设置请求头、认证信息等。
3.2.3 处理Cookies与身份认证
很多 API 需要身份认证,例如使用 Token 或 Cookies。下面是一个使用 requests 保持登录会话的示例:
import requests
session = requests.Session()
login_data = {"username": "user1", "password": "pass123"}
session.post("https://api.example.com/login", data=login_data)
# 登录后访问受保护资源
profile = session.get("https://api.example.com/profile")
print(profile.json())
逻辑说明:
- 使用Session保存登录后的 Cookies。
- 第一次请求登录接口,服务器设置 Cookies。
- 后续请求自动携带 Cookies,实现身份验证。
3.3 与TikTok API的集成实践
3.3.1 构建合法请求URL
TikTok 提供了部分开放 API,开发者可以通过构造特定 URL 获取公开数据,例如某个用户的视频列表:
GET https://api.tiktok.com/aweme/v1/aweme/post/
请求参数包括:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| user_id | string | 是 | TikTok 用户唯一标识 |
| count | integer | 否 | 请求视频数量(默认 30) |
| max_cursor | integer | 否 | 分页参数,用于加载更多内容 |
构建请求示例:
import requests
base_url = "https://api.tiktok.com/aweme/v1/aweme/post/"
params = {
"user_id": "1234567890",
"count": 10
}
headers = {
"User-Agent": "Mozilla/5.0",
"X-SS-REQ-TICKET": "1234567890"
}
response = requests.get(base_url, params=params, headers=headers)
参数说明:
-user_id:需通过 TikTok 用户主页获取。
-X-SS-REQ-TICKET:TikTok 的反爬虫机制之一,需模拟或通过抓包获取。
3.3.2 解析返回的JSON数据
TikTok 的 API 返回数据通常为 JSON 格式,包含视频、用户、评论等结构化信息。以下是一个解析示例:
data = response.json()
for item in data.get("aweme_list", []):
video_id = item["aweme_id"]
desc = item["desc"]
cover_url = item["video"]["cover"]["url_list"][0]
print(f"Video ID: {video_id}, Description: {desc}, Cover: {cover_url}")
结构说明:
-aweme_list:包含多个视频对象。
-aweme_id:视频唯一标识。
-desc:视频描述文本。
-video.cover.url_list[0]:视频封面图链接。
3.3.3 数据采集频率控制与反爬策略应对
TikTok 对频繁请求有较强的反爬机制,包括 IP 封锁、验证码验证、请求频率限制等。以下是一些常见应对策略:
1. 请求频率控制
使用 time.sleep() 控制请求间隔:
import time
for user_id in user_ids:
fetch_videos(user_id)
time.sleep(2) # 每次请求间隔2秒
2. 使用代理IP池
proxies = {
"http": "http://user:pass@10.10.1.10:3128",
"https": "http://10.10.1.10:1080"
}
response = requests.get(url, proxies=proxies)
3. 模拟浏览器行为
设置请求头模拟浏览器:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
"Referer": "https://www.tiktok.com/"
}
4. 使用 TikTok 官方 SDK(推荐)
如需稳定数据获取,建议使用 TikTok 官方开放平台 API,需申请开发者权限与 API Key。
通过本章的学习,我们已经掌握了 HTTP 协议的基础知识、 requests 库的核心用法,并结合 TikTok API 实现了实际的数据采集。在下一章中,我们将深入探讨如何对采集到的数据进行清洗与预处理,以便为后续的数据分析和可视化打下坚实基础。
4. 数据清洗与预处理技术
在数据抓取与采集之后,数据往往包含大量的噪声、冗余信息以及格式不一致的问题。这些问题如果不加以处理,会严重影响后续的数据分析、建模以及可视化展示。数据清洗与预处理是构建高质量数据集的关键环节,它不仅提高了数据的可用性,也为特征工程和模型训练提供了坚实的基础。
本章将从数据质量评估、清洗流程设计、以及预处理技术三个维度展开,结合实际案例,深入讲解如何使用Python工具(如Pandas、NumPy、正则表达式)进行数据清洗和预处理操作。
4.1 数据质量评估与问题识别
在进行数据清洗之前,首先需要对原始数据进行质量评估,识别出可能存在的问题,如缺失值、异常值、重复记录、格式不统一等。这一阶段的目标是建立清晰的数据问题清单,为后续清洗策略提供依据。
4.1.1 缺失值、异常值与重复数据检测
缺失值(Missing Value)是数据集中常见的问题之一,可能来源于采集失败、字段未填写等情况。处理缺失值的方法包括删除缺失记录、填充默认值(如均值、中位数、众数)或使用模型预测填充。
异常值(Outlier)是指偏离正常范围的数值,可能是输入错误、测量误差或极端情况。识别异常值的方法包括:
- 3σ原则(适用于正态分布)
- 箱线图(Boxplot)法
- IQR(四分位距)判断法
重复数据(Duplicate Data)会干扰分析结果,尤其在统计汇总或建模时造成偏差。可通过字段组合判断是否为重复记录,并进行去重操作。
示例代码:检测缺失值与重复值
import pandas as pd
# 加载数据
df = pd.read_csv("tiktok_data.csv")
# 查看缺失值
print(df.isnull().sum())
# 查看重复行数
print(f"重复记录数量:{df.duplicated().sum()}")
# 去除重复记录
df = df.drop_duplicates()
# 填充缺失值(以评论数为例)
df['comment_count'] = df['comment_count'].fillna(0)
代码解释:
isnull().sum():统计每列的缺失值数量。duplicated().sum():计算重复记录总数。drop_duplicates():去除重复行。fillna(0):用0填充缺失值,适用于数值型字段。
4.1.2 数据一致性与格式规范检查
数据一致性是指字段值在逻辑上是否一致。例如,性别字段中出现“男”、“Male”、“M”等不同表示方式,需要统一格式。
格式规范检查则涉及字段类型、长度、格式是否统一。例如时间戳字段是否统一为ISO格式(YYYY-MM-DD HH:MM:SS),字符串是否去除多余空格等。
示例:统一性别字段格式
# 将性别字段统一为 'M' 和 'F'
df['gender'] = df['gender'].str.lower().replace({
'male': 'M',
'female': 'F',
'男': 'M',
'女': 'F'
})
4.1.3 数据类型的转换与标准化
数据类型不匹配会导致后续分析出错,如字符串型的数值字段无法进行数学运算。常见的转换包括:
- 字符串 → 数值(int、float)
- 时间戳字符串 → datetime 类型
- 类别型数据 → one-hot 编码或 Label 编码
示例:将字符串型评论数转换为整型
df['comment_count'] = df['comment_count'].astype(int)
参数说明:
astype(int):将列数据类型转换为整型。
4.2 数据清洗流程设计
设计一个高效、可复用的数据清洗流程对于大规模数据处理尤为重要。该流程通常包括清洗规则制定、脚本开发、正则表达式应用等步骤。
4.2.1 清洗规则制定与自动化脚本开发
清洗规则应涵盖:
- 缺失值处理策略
- 字段格式统一标准
- 异常值过滤条件
- 特殊字符清洗规则
自动化脚本应模块化,便于维护和复用。例如将数据清洗封装为函数:
def clean_tiktok_data(df):
# 处理缺失值
df = df.fillna({'comment_count': 0, 'share_count': 0})
# 去重
df = df.drop_duplicates()
# 统一性别字段
df['gender'] = df['gender'].str.lower().replace({
'male': 'M',
'female': 'F',
'男': 'M',
'女': 'F'
})
# 转换数据类型
df['comment_count'] = df['comment_count'].astype(int)
return df
4.2.2 正则表达式在文本清洗中的应用
正则表达式(Regular Expression)是处理非结构化文本数据的强大工具,可用于提取、替换、验证字符串。
示例:提取评论中的@用户名
import re
def extract_mentions(comment):
return re.findall(r'@(\w+)', comment)
# 示例应用
df['mentions'] = df['comment_text'].apply(extract_mentions)
参数说明:
re.findall(r'@(\w+)'):查找所有以 @ 开头的用户名。apply():对每一行执行函数。
4.2.3 使用Pandas进行数据清洗实践
Pandas 是 Python 中最常用的数据处理库,支持多种数据清洗功能。
示例:使用 Pandas 清洗时间戳字段
df['create_time'] = pd.to_datetime(df['create_time'], errors='coerce')
代码逻辑说明:
pd.to_datetime():将字符串转换为 datetime 类型。errors='coerce':遇到无法转换的值则设置为 NaT(非时间值)。
4.3 数据预处理与特征工程
数据预处理是将原始数据转化为模型可接受格式的过程,包括特征选择、数据标准化、时间解析、文本分词等。特征工程则是从中提取有用信息,提升模型性能。
4.3.1 特征选择与数据归一化
特征选择是指从原始字段中挑选对目标变量影响较大的特征。数据归一化(Normalization)是将数据缩放到统一范围,常用于机器学习模型训练。
示例:对数值特征进行 Min-Max 归一化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[['likes', 'comments', 'shares']] = scaler.fit_transform(df[['likes', 'comments', 'shares']])
参数说明:
MinMaxScaler:将数据缩放到 [0,1] 区间。fit_transform():拟合并转换数据。
4.3.2 时间戳解析与日期格式转换
时间戳字段通常以字符串形式存在,需解析为 datetime 类型后,才能进行时序分析。
示例:提取年、月、日、小时等信息
df['create_time'] = pd.to_datetime(df['create_time'])
df['year'] = df['create_time'].dt.year
df['month'] = df['create_time'].dt.month
df['day'] = df['create_time'].dt.day
df['hour'] = df['create_time'].dt.hour
mermaid流程图说明:
graph TD
A[原始时间戳] --> B{是否标准格式}
B -->|是| C[解析为datetime]
B -->|否| D[清洗格式]
C --> E[提取年月日小时]
D --> E
E --> F[用于时序分析]
4.3.3 文本分词与情感分析初步处理
在处理评论、描述等文本字段时,通常需要进行分词和情感分析。Python 提供了多种中文分词工具,如 jieba、SnowNLP、TextBlob(英文)等。
示例:使用 jieba 对中文评论进行分词
import jieba
def tokenize(text):
return list(jieba.cut(text))
df['tokens'] = df['comment_text'].apply(tokenize)
参数说明:
jieba.cut():对中文文本进行分词。apply():对每条评论执行分词函数。
4.3.4 特征工程进阶:TF-IDF 向量化处理
在文本分析中,TF-IDF 是一种常用的文本向量化方法,能够反映词语在文档中的重要程度。
示例:使用 TF-IDF 向量化评论文本
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df['comment_text'])
# 转换为 DataFrame 查看
tfidf_df = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())
参数说明:
TfidfVectorizer():初始化 TF-IDF 向量化器。fit_transform():拟合并转换文本数据。get_feature_names_out():获取所有特征词。
小结与扩展
在本章中,我们系统地讲解了数据清洗与预处理的完整流程,涵盖了从数据质量评估、清洗流程设计到特征工程的多个关键环节。通过 Pandas、正则表达式、Jieba 等工具的实际应用,展示了如何将杂乱无章的原始数据转化为可用于分析和建模的标准数据集。
后续章节将基于本章处理后的数据,进一步展开数据可视化、模型训练与工程化部署等内容。清洗和预处理的质量直接影响最终分析结果的准确性与模型的泛化能力,因此本章内容在实际项目中具有极高的实用价值。
5. 数据可视化与工程化实践
在数据采集与清洗完成后,如何将数据以直观、清晰的方式呈现,并将其以工程化的方式部署到生产环境中,是数据分析全流程中至关重要的环节。本章将围绕数据可视化工具的使用、Google BigQuery的数据分析集成以及Python项目的工程化部署展开详细讲解。
5.1 数据可视化工具与库
数据可视化是将抽象数据转化为图形表达的过程,帮助我们更快速地理解数据趋势、模式和异常。Python中常用的可视化库包括 Matplotlib、Seaborn 和 Plotly。
5.1.1 Matplotlib与Seaborn基础图表绘制
Matplotlib 是 Python 中最基础的绘图库,支持多种图表类型。Seaborn 则是基于 Matplotlib 的高级接口,更适合统计数据的可视化。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# 示例数据
data = pd.DataFrame({
'日期': pd.date_range(start='2024-01-01', periods=10),
'播放量': [1200, 1500, 1300, 1700, 1800, 2000, 2100, 2300, 2500, 2600]
})
# 绘图
plt.figure(figsize=(10, 6))
sns.lineplot(x='日期', y='播放量', data=data, marker='o')
plt.title('TikTok视频播放量趋势')
plt.xlabel('日期')
plt.ylabel('播放量')
plt.grid(True)
plt.show()
参数说明:
-x、y:指定绘图数据的横纵轴字段。
-marker='o':为数据点添加圆形标记。
-plt.figure(figsize=(10, 6)):设置图像大小。
5.1.2 动态图表与交互式可视化(Plotly)
Plotly 是一个交互式可视化库,适用于构建动态网页图表。
import plotly.express as px
fig = px.line(data, x='日期', y='播放量', title='TikTok视频播放量动态图')
fig.show()
特点说明:
- 支持鼠标悬停查看数据。
- 可嵌入网页应用中。
- 支持多种图表类型(散点图、热力图等)。
5.1.3 Power BI在数据展示中的应用
Power BI 是微软推出的商业智能工具,支持从多种数据源导入数据并进行可视化展示。可将清洗后的数据导出为 CSV 或连接数据库,然后通过 Power BI 构建仪表盘。
操作步骤:
1. 在 Power BI Desktop 中选择“获取数据”。
2. 选择“CSV”或“数据库”作为数据源。
3. 加载数据后,使用“可视化”面板选择图表类型(柱状图、饼图等)。
4. 配置字段和筛选器,构建交互式仪表板。
5.2 与Google BigQuery集成分析
Google BigQuery 是 Google Cloud 提供的无服务器、企业级大数据分析平台,适合处理大规模数据集。
5.2.1 BigQuery项目配置与API连接
- 登录 Google Cloud Console 创建项目。
- 启用 BigQuery API。
- 创建服务账号并下载 JSON 密钥文件。
- 使用 Python 客户端连接:
from google.cloud import bigquery
from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file('your-key.json')
client = bigquery.Client(credentials=credentials, project='your-project-id')
5.2.2 大规模数据集的上传与查询优化
可以将清洗后的数据上传至 BigQuery:
from google.cloud import bigquery
client = bigquery.Client()
dataset_id = "your_dataset"
table_id = "tiktok_data"
dataset_ref = client.dataset(dataset_id)
table_ref = dataset_ref.table(table_id)
job_config = bigquery.LoadJobConfig(
write_disposition="WRITE_TRUNCATE",
schema=[
bigquery.SchemaField("video_id", "STRING"),
bigquery.SchemaField("views", "INTEGER"),
bigquery.SchemaField("timestamp", "TIMESTAMP")
],
source_format=bigquery.SourceFormat.NEWLINE_DELIMITED_JSON,
)
with open("data.json", "rb") as source_file:
job = client.load_table_from_file(source_file, table_ref, job_config=job_config)
print(f"Loaded {job.output_rows} rows")
5.2.3 基于SQL的数据聚合与分析
SELECT
EXTRACT(DATE FROM timestamp) AS date,
SUM(views) AS total_views
FROM `your-project-id.your_dataset.tiktok_data`
GROUP BY date
ORDER BY date
说明:
- 使用 BigQuery 的 SQL 引擎进行高效聚合。
- 可在 Python 中通过client.query(sql)执行并获取结果。
5.3 Python项目结构与工程化部署
一个可维护、可扩展的项目结构是工程化部署的基础。
5.3.1 项目目录结构设计规范
tiktok_data_pipeline/
├── data/
│ ├── raw/
│ └── processed/
├── src/
│ ├── __init__.py
│ ├── fetcher.py
│ ├── cleaner.py
│ └── visualizer.py
├── config/
│ └── config.yaml
├── tests/
│ └── test_fetcher.py
├── requirements.txt
└── README.md
目录说明:
-data/:存放原始与清洗后的数据。
-src/:核心代码模块。
-config/:配置文件管理。
-tests/:单元测试脚本。
5.3.2 依赖管理与虚拟环境配置
使用 pip 和 requirements.txt 管理依赖:
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# 安装依赖
pip install -r requirements.txt
# 生成依赖文件
pip freeze > requirements.txt
5.3.3 自动化测试与CI/CD流程搭建
使用 pytest 编写单元测试:
# tests/test_fetcher.py
from src.fetcher import fetch_tiktok_data
def test_fetch_tiktok_data():
result = fetch_tiktok_data()
assert isinstance(result, list)
assert len(result) > 0
CI/CD 配置建议:
- 使用 GitHub Actions 或 GitLab CI 配置自动化测试与部署。
- 配置.github/workflows/python-app.yml文件,实现代码提交后自动运行测试与部署流程。
name: Python application
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: Install dependencies
run: |
pip install -r requirements.txt
- name: Run tests
run: |
python -m pytest
流程说明:
- 每次提交代码时触发自动化测试。
- 测试通过后可配置部署脚本自动上传至服务器或容器平台(如 Docker)。
简介:本项目“tiktok_scrap”利用TikTok API进行数据抓取,结合Python实现数据处理与分析,并通过Power BI进行可视化展示。项目涵盖Python基础语法、API调用、数据清洗与转换、数据可视化等内容,使用了如requests、Pandas、Numpy、Matplotlib等关键技术工具,适合想要掌握社交媒体数据爬取与分析全流程的开发者学习与实践。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)