一、技术方案概述
短视频平台的关键词搜索结果包含丰富的用户行为数据,通过自动化手段采集这些数据可应用于舆情分析、内容推荐等场景。本方案采用浏览器自动化控制技术,结合网络请求监控实现数据采集,相比传统API调用方式具有更强的灵活性和抗封禁能力。
二、开发环境准备
1. 核心依赖库
import timeimport jsonimport reimport threadingfrom typing import List, Dict, Optionalfrom datetime import datetimefrom urllib.parse import quotefrom openpyxl import Workbookfrom DrissionPage import ChromiumPagefrom DrissionPage.common import Actions
- DrissionPage:基于Selenium和Requests的混合驱动库,支持无头/有头模式切换
- OpenPyXL:用于将采集结果导出为Excel格式
- Re/Json:处理API返回的JSON数据和正则匹配
2. 浏览器配置策略
class ShortVideoCrawler:def __init__(self):self.browser = Noneself.stop_event = threading.Event()def _init_browser(self):"""多策略浏览器初始化"""strategies = [self._default_init,self._custom_config_init,self._connect_existing_browser]for strategy in strategies:if strategy():return Truereturn False
初始化策略优先级:
- 默认配置启动:直接创建新浏览器实例
- 自定义参数启动:配置无头模式、禁用GPU等参数
- 连接已有实例:通过调试端口复用已打开浏览器
三、核心实现模块
1. 浏览器自动化控制
def _custom_config_init(self):"""自定义浏览器配置"""try:from DrissionPage import ChromiumOptionsco = ChromiumOptions()config = {'headless': False,'arguments': ['--no-sandbox','--disable-dev-shm-usage','--disable-gpu','--remote-debugging-port=9222']}# 动态配置参数for k, v in config.items():if k == 'arguments':for arg in v:co.set_argument(arg)else:getattr(co, k)(v)self.browser = ChromiumPage(addr_or_opts=co)return self._test_browser()except Exception as e:print(f"配置初始化失败: {str(e)}")return False
关键配置说明:
--no-sandbox:解决Linux环境权限问题--remote-debugging-port:启用调试端口便于实例复用- 动态参数配置模式支持灵活扩展
2. 网络请求监控与分析
通过抓包工具(如Fiddler/Wireshark)分析搜索请求流程:
- 访问搜索入口页获取基础Cookie
- 构造带关键词的搜索请求URL
- 解析返回的JSON格式搜索结果
典型请求参数结构:
{"keyword": "Python教程","offset": 0,"count": 20,"sort_type": 0,"device_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}
3. 数据采集完整流程
def search_keyword(self, keyword: str, max_results: int = 100):"""执行关键词搜索采集"""if not self.browser:self._init_browser()base_url = "https://www.example-platform.com/search"results = []offset = 0while len(results) < max_results:# 构造请求参数params = {'keyword': keyword,'offset': offset,'count': min(20, max_results - len(results))}# 执行搜索请求try:# 模拟浏览器行为self.browser.get(base_url)self.browser.ele('input[name="q"]').input(keyword)self.browser.ele('button[type="submit"]').click()time.sleep(3) # 等待页面加载# 获取网络请求(实际开发中建议直接调用API)html = self.browser.html# 此处应替换为实际API调用或DOM解析items = self._parse_search_results(html)if not items:breakresults.extend(items)offset += len(items)print(f"已采集 {len(results)} 条数据")except Exception as e:print(f"采集异常: {str(e)}")breakreturn results[:max_results]
四、数据解析与存储
1. 结构化数据提取
def _parse_search_results(self, html: str) -> List[Dict]:"""解析搜索结果HTML"""# 实际开发中建议直接解析API返回的JSONpattern = re.compile(r'<div([^"]+)".*?'r'<h3>([^<]+)</h3>.*?'r'<span>(\d+)</span>.*?'r'<span>(\d+)</span>',re.S)items = []for match in pattern.finditer(html):items.append({'video_id': match.group(1),'title': match.group(2).strip(),'play_count': int(match.group(3)),'comment_count': int(match.group(4)),'collect_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S')})return items
2. 多格式数据存储
def save_to_excel(self, data: List[Dict], filename: str):"""保存为Excel文件"""wb = Workbook()ws = wb.activews.append(['视频ID', '标题', '播放量', '评论数', '采集时间'])for item in data:ws.append([item['video_id'],item['title'],item['play_count'],item['comment_count'],item['collect_time']])wb.save(filename)print(f"数据已保存至 {filename}")
五、进阶优化技巧
1. 反爬策略应对
- IP轮换:结合代理池实现请求IP多样化
- 行为模拟:随机延迟+鼠标轨迹模拟
- Cookie管理:持久化存储有效会话
2. 分布式采集架构
class DistributedCrawler:"""分布式采集控制器"""def __init__(self, worker_count: int = 3):self.task_queue = Queue()self.workers = []for _ in range(worker_count):w = ShortVideoCrawler()self.workers.append(w)def distribute_tasks(self, keywords: List[str]):"""任务分发"""for kw in keywords:self.task_queue.put(kw)def start(self):"""启动工作线程"""threads = []for w in self.workers:t = threading.Thread(target=self._worker_loop, args=(w,))threads.append(t)t.start()def _worker_loop(self, crawler):"""工作线程循环"""while not self.stop_event.is_set():try:keyword = self.task_queue.get(timeout=10)results = crawler.search_keyword(keyword)self._save_results(keyword, results)except Exception as e:print(f"工作线程异常: {str(e)}")
六、法律与伦理规范
-
合规性要求:
- 严格遵守《网络安全法》相关条款
- 避免采集用户隐私数据
- 控制采集频率防止对目标平台造成负担
-
推荐实践:
- 设置合理的请求间隔(建议3-5秒/次)
- 仅采集公开可访问数据
- 建立数据使用内部审批流程
本方案通过模块化设计实现了可扩展的数据采集框架,开发者可根据实际需求调整浏览器配置、解析规则和存储方式。对于大规模采集场景,建议结合消息队列和分布式任务调度系统进行优化升级。