# 不用官方API我写了个Python工具采集微博数据 零成本、高灵活度的微博数据采集方案附完整代码解析做舆情分析或社交媒体研究时微博数据是很重要的信息源。官方API不仅申请门槛高调用限制也多。今天分享一个基于 **DrissionPage** 的采集方案无需付费接口就能按关键词和时间范围稳定获取数据。—## 一、这个工具能做什么简单来说它支持两种采集模式模式一按关键词搜索帖子输入任意关键词设定采集天数工具会自动按天拆分、逐页翻取搜索结果。每条帖子会记录mid、昵称、发布时间、来源设备、正文内容、转发/评论/点赞数。模式二采集指定微博的评论拿到某条微博的ID后可以递归抓取全部评论——包括楼中楼子评论。每条评论包含评论时间、楼层、用户信息性别、位置、粉丝数等、评论内容、点赞数。两种模式可以单独使用也可以串起来先用模式一筛出目标帖子再用模式二深挖评论。## 二、技术选型为什么用 DrissionPage常规爬虫面对微博有三道坎**登录鉴权**、**反爬机制**、**动态渲染**。这个方案的核心依赖是 DrissionPage一个融合了浏览器控制和HTTP请求的Python库。它最大的好处是**既能像Selenium一样操控真实浏览器又能像requests一样发协议请求**。具体来说| 环节 | 使用的模块 | 原因 ||------|-----------|------|| 获取Cookie | ChromiumPage | 手动扫码登录绕过风控 || 搜索列表采集 | SessionPage | 纯HTTP请求速度更快 || 评论接口采集 | SessionPage | Ajax接口直接返回JSON |一旦拿到登录后的Cookie后续全部走 SessionPage 发请求效率远高于全程模拟浏览器。—## 三、核心实现拆解### 3.1 Cookie的获取与转换登录是第一步。代码启动一个真实的Chrome窗口让用户手动扫码登录pythondef get_cookies():page ChromiumPage()page.get(‘https://weibo.com/’)input(‘请登录后按回车’)cookies page.cookies()page.quit()return cookies拿到的Cookie是列表格式需要转成字典供后续请求使用pythondef convert_cookies_to_dict(cookies_list):cookies_dict {}for cookie in cookies_list:if ‘name’ in cookie and ‘value’ in cookie:cookies_dict[cookie[‘name’]] cookie[‘value’]return cookies_dict其中 XSRF-TOKEN 这个字段在评论采集的请求头中会单独取出使用。### 3.2 关键词搜索按天拆分 逐页翻取微博搜索页的时间筛选通过 timescope 参数控制格式是 custom:2025-05-01:2025-05-01。因此代码做了两层循环pythonfor day_offset in range(1, current_day_number 1):target_date datetime.date.today() - datetime.timedelta(daysday_offset)date_str target_date.strftime(“%Y-%m-%d”)timescope_value fcustom:{date_str}:{date_str}for page_num in range(1, 51):params {“q”: keyword,“timescope”: timescope_value,“page”: f{page_num}}发起请求并解析…这样设计有两个好处一是避免单次请求数据量过大被限制二是日期维度天然对齐后续分析更方便。页面解析部分利用 DrissionPage 的元素定位能力直接从DOM中提取微博卡片pythonitems page.ele(‘idpl_feedlist_index’).ele(‘classm-filtertab’, index1)\.next(‘t:div’).eles(‘classcard-wrap’)每条卡片的 mid 属性、昵称、正文、转发/评论/点赞数都被结构化提取写入 DataRecorder 管理的Excel文件。### 3.3 评论采集递归处理楼中楼微博的评论接口是 /ajax/statuses/buildComments返回JSON格式。核心逻辑是**翻页 递归**pythondef parse(data, recorder):max_id data[‘max_id’]下一页的游标items data[‘data’]for item in items:解析当前评论…recorder.add_data(result)if item[‘comments’]:存在子评论parse_comment(item[‘comments’])递归采集return max_id, total_number, flag翻页通过 max_id 游标驱动每次请求带上上一页返回的 max_id直到接口不再返回新的游标值。遇到楼中楼时item[‘comments’] 字段不为空递归调用 parse_comment 进行解析确保评论链条完整。### 3.4 HTML内容清洗部分返回的文本字段包含HTML标签如 链接、 换行代码用 BeautifulSoup 统一清洗pythonfrom bs4 import BeautifulSoupsoup BeautifulSoup(text, ‘html.parser’)text soup.get_text()这样就可以拿到干净的纯文本内容。—## 四、完整使用流程第一步环境准备bashpip install DrissionPage DataRecorder loguru beautifulsoup4第二步运行脚本获取Cookie程序启动后会弹出一个Chrome窗口导航到微博首页。此时手动扫码或输入账号密码登录完成后在终端按回车Cookie会自动保存。第三步选择采集模式输入关键词和采集天数启动模式一或者传入微博ID启动模式二数据会自动写入同目录下的Excel文件每100条缓存一次既保证数据不丢失又兼顾写入效率。—## 五、几个需要注意的细节1. 请求频率控制代码中多处加了 time.sleep(random.randint(2, 3)) 和 random.uniform(1, 2) 的随机延迟。这不是多余的——稳定采集的核心就是控制节奏频率过高很容易触发风控。2. 页面解析的容错微博的DOM结构有时会因A/B测试或版本更新而微调。代码中广泛使用 try/except 包裹解析逻辑比如设备来源、正文位置可能在不同帖子里结构不同pythontry:content content_element.s_ele(‘classtxt’, index2).textexcept:content content_element.s_ele(‘classtxt’, index1).text这种防御性写法能有效降低因个别字段缺失导致整条数据丢弃的概率。3. 性别字段的中文映射评论接口返回的性别是 m / f代码做了映射转换让导出数据更直观pythonif gender ‘m’:gender ‘男’else:gender ‘女’—## 六、总结这套方案的优势在于**完全绕过官方API的限制**关键词、时间范围、采集量都由自己控制。DrissionPage 的混合模式设计既解决了登录难题又保证了采集效率。当然它本质上还是爬虫使用时需要遵守网站的robots协议合理控制频率仅用于合法的研究场景。完整代码我已整理好如果需要可以在后台回复关键词获取。—**工具虽好且用且珍惜。** 频率太快不仅伤服务器也容易被封号。建议大家把延迟设得宽松一些细水长流才是真。—*本文涉及的代码仅用于技术学习交流请勿用于非法用途。*