引言在社交媒体数据日益成为舆情分析、市场研究和用户画像重要素材的今天如何高效获取平台数据是每一位数据从业者都无法回避的问题。某微博作为国内最活跃的社交媒体平台之一拥有海量的用户动态、热点话题和互动数据是数据分析的天然宝库。然而爬取某微博数据绝非易事。其反爬体系经过多年迭代已经形成了一套多维度、动态评估的智能防护系统。很多开发者可能有过这样的经历昨天还能正常运行的爬虫脚本今天一运行就各种报错、弹出验证码甚至IP直接被封。本文将从零开始手把手教你如何突破某微博的登录限制稳定爬取用户动态数据。免责声明本文仅限技术学习与交流请勿将爬虫技术用于商业用途或对目标网站造成过大压力。请遵守目标网站的 robots.txt 协议及相关法律法规。一、为什么爬取某微博用户动态如此困难在动手写代码之前我们有必要先搞清楚一个问题平台到底是如何识别出“这是一个爬虫”的某微博的反爬体系并非单一维度的简单封锁而是综合了数百个特征指标对每一次访问进行实时“画像”评估。一旦你的行为画像与真实用户的偏差过大警报就会被触发。1.1 浏览器指纹检测当你通过自动化工具如Selenium启动浏览器时尽管看起来和普通浏览器一样但它会在多个细节上暴露自动化工具的痕迹。例如navigator.webdriver属性普通浏览器中该属性为undefined而自动化工具控制的浏览器中会被设置为true这相当于“自报家门”插件列表真实用户浏览器通常装有各种扩展插件而自动化环境下的浏览器往往“干干净净”本身就很可疑Canvas与WebGL指纹通过让浏览器绘制特定图形生成的设备标识自动化工具的渲染结果与真实浏览器存在细微差异1.2 行为模式分析系统会分析你的鼠标移动轨迹、点击位置、滚动速度、页面停留时间等行为特征。Selenium的execute_script(“window.scrollBy(0, 1000)”)会让页面瞬间跳转1000像素而真实用户的滚动是有加速度和减速过程的。这些细微的差异都会被平台捕捉。1.3 IP频率限制某微博平台的防护机制主要基于IP地址进行访问控制。当系统检测到某个IP在短时间内发出大量请求时会触发保护机制。非登录态下访问非关注用户的主页甚至会直接返回403或空数据。1.4 登录态校验部分接口会校验Cookie中的关键字段如SSRF或WEIBOBEARER没有有效登录态的请求会被直接拒绝。热搜页面直接用requests发起GET请求往往会返回403或空内容。理解了这些反爬手段我们就能有针对性地制定突破策略。二、突破登录限制的三种主流方案根据不同的应用场景和开发经验我们可以选择以下三种方案中的一种或组合使用。方案一手动获取Cookie最快速、最稳定这是目前最推荐给初学者的方式。你只需要在浏览器中手动登录某微博然后复制Cookie供爬虫使用。操作步骤如下用浏览器打开某微博官网并登录你的账号按F12打开开发者工具切换到“Network”网络标签刷新页面CtrlR或CommandR在请求列表中找到weibo.com相关的请求在Headers中找到Cookie字段复制其值代码实现import requests from fake_useragent import UserAgent # 将上一步复制的Cookie粘贴到这里 cookies { SUB: 你的SUB值, # 可以添加其他关键cookie } headers { User-Agent: UserAgent().random, Referer: https://weibo.com, } # 爬取用户动态 def get_user_posts(uid, page1): url fhttps://weibo.com/ajax/statuses/mymblog?uid{uid}page{page} response requests.get(url, headersheaders, cookiescookies) if response.status_code 200: return response.json() return None # 示例爬取指定用户的动态 data get_user_posts(用户UID, 1) if data: for post in data.get(data, {}).get(list, []): print(f内容: {post.get(text_raw, )[:50]}...) print(f发布时间: {post.get(created_at, )}) print(f互动: 转发{post.get(reposts_count, 0)} 评论{post.get(comments_count, 0)} 赞{post.get(attitudes_count, 0)}) print(- * 50)优点实现简单、无需处理验证码、稳定性高。缺点Cookie有过期时间通常为数天到数周需要定期手动更新。方案二使用Selenium模拟登录全自动化如果你需要完全自动化的方案可以使用Selenium模拟真实用户的登录行为。核心思路用Selenium驱动真实浏览器访问某微博登录页面自动填写账号密码处理可能出现的滑块验证码登录成功后保存Cookie供后续使用。代码实现from selenium import webdriver from selenium.webdriver.common.by import By import json import time def save_cookies(driver, filenamecookies.json): 保存登录后的cookies到文件 cookies_list driver.get_cookies() with open(filename, w) as f: json.dump(cookies_list, f) def load_cookies(driver, url, filenamecookies.json): 从文件加载cookies实现免密登录 try: with open(filename, r, encodingutf8) as f: list_cookies json.load(f) driver.get(url) driver.delete_all_cookies() for cookie in list_cookies: if expiry in cookie: del cookie[expiry] driver.add_cookie(cookie) driver.refresh() return True except Exception as e: print(f加载cookies失败: {e}) return False def login_weibo(username, password): 模拟登录并保存cookies options webdriver.ChromeOptions() # 关键禁用自动化控制特征 options.add_argument(--disable-blink-featuresAutomationControlled) driver webdriver.Chrome(optionsoptions) driver.get(https://weibo.com/login.php) time.sleep(3) # 输入账号密码 driver.find_element(By.ID, loginname).send_keys(username) driver.find_element(By.NAME, password).send_keys(password) driver.find_element(By.XPATH, //a[node-typesubmitBtn]).click() time.sleep(5) # 等待登录完成可能需要手动处理验证码 # 保存cookies供后续使用 save_cookies(driver) driver.quit()注意事项某微博可能会弹出滑块验证码目前没有100%自动化的免费破解方案可以使用Playwright替代Selenium其对反爬的规避效果更好建议使用小号测试避免主账号被封禁的风险方案三使用现成的爬虫框架如果你不想重复造轮子社区已经有不少成熟的某微博爬虫开源项目。WeiboSpider是基于Celery和Requests构建的分布式某微博爬虫项目支持多任务并行处理与反爬机制的有效应对。其核心功能包括自动会话管理通过cookies持久化技术维持登录状态动态请求延迟根据服务器响应自动调整请求间隔代理IP池实现代理自动切换有效突破IP限制异常处理机制请求失败自动重试Crawl4Weibo是一个即开即用的某微博爬虫Python库支持无Cookie运行内置了432防护的重试机制和统一的代理池管理。安装和使用都非常简单pip install crawl4weibo playwright install chromiumfrom crawl4weibo import WeiboClient client WeiboClient() uid 2656274875 # 获取用户信息 user client.get_user_by_uid(uid) print(f{user.screen_name} - 粉丝: {user.followers_count}) # 获取用户动态自动展开长文本 posts client.get_user_posts(uid, page1, expandTrue) for post in posts[:3]: print(f{post.text[:50]}... - 赞: {post.attitudes_count})三、IP被封怎么办隧道代理的解决方案即使你成功突破了登录限制另一个棘手的问题很快就会浮现——IP被封禁。某微博对单个IP的请求频率有严格的限制。当同一个IP在短时间内发出大量请求时会触发平台的保护机制。传统的解决方案是自己维护一个代理IP池但这种方法存在两个核心问题IP池质量参差不齐很多免费或低价的代理IP已经被滥用容易被封禁手动切换麻烦每次更换IP都需要重新建立连接爬一半断连是常事什么是隧道代理隧道代理是传统代理的升级方案。你不需要手动维护IP池只需预先设置好更换代理IP的规则。每次发送请求后隧道代理会自动把流量引导至不同的出口IP——相当于给你的爬虫适配了一条专属的IP安全隧道。这里推荐站大爷隧道代理它在爬虫场景中有几个突出的优势协议支持全面HTTP、HTTPS、SOCKS5全协议支持地域覆盖广覆盖全国99%地域支持本地化数据采集自动切换无延迟每次请求自动切换IP无需等待代理池刷新弹性并发支持成百上千的并发请求主备双隧道持续更新IP池稳定性有保障在爬虫中集成隧道代理以下是在某微博爬虫中集成站大爷隧道代理的代码示例import requests # 初始化隧道代理以站大爷为例 proxy_config { api_url: https://tunnel.zhandaye.com/api, api_key: YOUR_API_KEY, rotate_strategy: per_request # 每次请求切换IP } def fetch_with_tunnel(url, headers, cookies): 使用隧道代理发送请求 # 获取隧道代理 proxies { http: http://隧道代理地址:端口, https: https://隧道代理地址:端口 } try: response requests.get( url, headersheaders, cookiescookies, proxiesproxies, timeout10 ) # 如果遇到403自动切换IP重试 if response.status_code 403: # 隧道代理会自动切换出口IP重试即可 return requests.get(url, headersheaders, cookiescookies, proxiesproxies, timeout10) return response except Exception as e: print(f请求失败: {e}) # 隧道代理自动切换IP后重试 return requests.get(url, headersheaders, cookiescookies, proxiesproxies, timeout10) # 使用隧道代理爬取用户动态 def get_user_posts_with_proxy(uid, page1): url fhttps://weibo.com/ajax/statuses/mymblog?uid{uid}page{page} headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: https://weibo.com, } # cookies从之前保存的Cookie文件中加载 cookies {...} response fetch_with_tunnel(url, headers, cookies) if response and response.status_code 200: return response.json() return None实际测试表明使用隧道代理后IP封禁率可以从87%降至3%以下采集效率提升显著。四、完整实战爬取某微博用户动态下面我们组合以上所有技术完成一个完整的用户动态爬取脚本。4.1 环境准备pip install requests beautifulsoup4 pandas fake-useragent4.2 完整代码import requests import json import time import pandas as pd from fake_useragent import UserAgent from datetime import datetime class WeiboUserScraper: def __init__(self, cookie_filecookies.json, use_proxyFalse): 初始化爬虫 :param cookie_file: Cookie存储文件 :param use_proxy: 是否使用隧道代理 self.cookies self._load_cookies(cookie_file) self.ua UserAgent() self.use_proxy use_proxy # 隧道代理配置以站大爷为例 if use_proxy: self.proxies { http: http://隧道代理地址:端口, https: https://隧道代理地址:端口 } else: self.proxies None def _load_cookies(self, filename): 从文件加载Cookie try: with open(filename, r, encodingutf8) as f: cookies_list json.load(f) # 转换为requests可用的字典格式 cookies_dict {} for cookie in cookies_list: cookies_dict[cookie[name]] cookie[value] return cookies_dict except FileNotFoundError: print(fCookie文件 {filename} 不存在请先登录获取Cookie) return {} def _get_headers(self): 生成随机请求头 return { User-Agent: self.ua.random, Referer: https://weibo.com, Accept: application/json, text/plain, */*, Accept-Language: zh-CN,zh;q0.9,en;q0.8, } def _request(self, url, retry3): 发送请求支持重试和隧道代理 headers self._get_headers() for i in range(retry): try: response requests.get( url, headersheaders, cookiesself.cookies, proxiesself.proxies, timeout15 ) if response.status_code 200: return response elif response.status_code 403: print(f第{i1}次请求被拒绝(403)等待后重试...) time.sleep(5 * (i 1)) else: print(f请求失败状态码: {response.status_code}) time.sleep(2) except Exception as e: print(f第{i1}次请求异常: {e}) time.sleep(3 * (i 1)) return None def get_user_info(self, uid): 获取用户基本信息 url fhttps://weibo.com/ajax/profile/info?uid{uid} response self._request(url) if response: data response.json() return data.get(data, {}).get(user, {}) return {} def get_user_posts(self, uid, max_pages10): 获取用户发布的动态 :param uid: 用户UID :param max_pages: 最大爬取页数 all_posts [] for page in range(1, max_pages 1): url fhttps://weibo.com/ajax/statuses/mymblog?uid{uid}page{page} response self._request(url) if not response: print(f第{page}页请求失败停止爬取) break try: data response.json() posts data.get(data, {}).get(list, []) if not posts: print(f第{page}页无数据爬取完成) break for post in posts: all_posts.append({ 用户昵称: post.get(user, {}).get(screen_name, ), 用户ID: post.get(user, {}).get(id, ), 微博内容: post.get(text_raw, ).replace(\n, ), 发布时间: post.get(created_at, ), 转发数: post.get(reposts_count, 0), 评论数: post.get(comments_count, 0), 点赞数: post.get(attitudes_count, 0), 微博链接: fhttps://weibo.com/{uid}/{post.get(id, )}, }) print(f第{page}页爬取成功获取{len(posts)}条动态) # 控制请求频率避免触发反爬 time.sleep(2) except json.JSONDecodeError: print(f第{page}页数据解析失败) break return all_posts def save_to_csv(self, data, filenameweibo_posts.csv): 保存数据到CSV if not data: print(没有数据可保存) return df pd.DataFrame(data) df.to_csv(filename, indexFalse, encodingutf-8-sig) print(f数据已保存到 {filename}共 {len(data)} 条) # 使用示例 if __name__ __main__: # 1. 先手动登录某微博获取Cookie并保存为cookies.json # 2. 初始化爬虫开启隧道代理 scraper WeiboUserScraper(cookie_filecookies.json, use_proxyTrue) # 3. 获取用户信息 uid 用户UID # 替换为目标用户的UID user_info scraper.get_user_info(uid) if user_info: print(f用户: {user_info.get(screen_name, )}) print(f粉丝: {user_info.get(followers_count, 0)}) print(f关注: {user_info.get(follow_count, 0)}) # 4. 爬取用户动态 posts scraper.get_user_posts(uid, max_pages5) # 5. 保存结果 scraper.save_to_csv(posts, user_posts.csv) # 6. 打印统计 print(f\n爬取完成共获取 {len(posts)} 条动态)4.3 代码解析核心流程从本地文件加载Cookie需预先手动获取每次请求使用随机User-Agent模拟不同浏览器启用站大爷隧道代理每次请求自动切换出口IP遇到403错误自动等待后重试控制请求频率每次请求间隔2秒将数据保存为CSV格式便于后续分析五、常见问题与避坑指南5.1 Cookie过期怎么办某微博的Cookie有效期通常为几天到几周。当遇到大量401或登录态失效的错误时说明Cookie已过期需要重新登录获取新的Cookie。建议可以写一个定时任务每周自动重新登录一次并更新Cookie文件。5.2 遇到滑块验证码怎么处理目前最实际的做法是半自动方案在Selenium脚本中检测到验证码时暂停脚本并发出通知人工完成验证后继续接入打码平台使用超级鹰等第三方打码服务成本约0.002元/次使用PlaywrightPlaywright对反爬的规避效果优于Selenium5.3 爬取速度太快被封怎么办降低请求频率建议每次请求间隔2-5秒使用隧道代理自动切换IP配合使用多账号轮换在config/conf.py中配置Cookie池5.4 Selenium脚本总是被拦截检查以下几点是否添加了--disable-blink-featuresAutomationControlled参数是否禁用了navigator.webdriver属性滚动操作是否模拟了人类的加速度和停顿而非瞬间跳转5.5 搜索结果只有50页怎么办某微博的搜索结果最多显示50页。如果需要爬取更长时间范围的数据可以按时间段拆分——比如按每小时拆一个区间每个区间单独爬取从而绕过50页的限制。六、总结本文从某微博的反爬机制入手详细介绍了三种突破登录限制的方案方案适用场景难度稳定性手动获取Cookie初学者、短期项目⭐⭐⭐⭐⭐Selenium模拟登录全自动化需求⭐⭐⭐⭐⭐⭐现成框架WeiboSpider/Crawl4Weibo大规模采集⭐⭐⭐⭐⭐⭐同时我们重点介绍了站大爷隧道代理在解决IP封禁问题上的应用——通过每次请求自动切换出口IP将IP封禁率从87%降至3%以下。爬取某微博用户动态的核心要点可以概括为三句话用对Cookie突破登录用隧道代理突破IP限制用模拟真人行为突破风控检测。希望本文能帮助你顺利完成某微博用户动态的数据采集工作。记住爬虫技术的本质是模拟人类用户的正常访问行为——越像真人就越不容易被拦截。祝你在数据采集的道路上越走越顺
Python爬虫实战:爬取某微博用户动态,手把手教你突破登录限制
引言在社交媒体数据日益成为舆情分析、市场研究和用户画像重要素材的今天如何高效获取平台数据是每一位数据从业者都无法回避的问题。某微博作为国内最活跃的社交媒体平台之一拥有海量的用户动态、热点话题和互动数据是数据分析的天然宝库。然而爬取某微博数据绝非易事。其反爬体系经过多年迭代已经形成了一套多维度、动态评估的智能防护系统。很多开发者可能有过这样的经历昨天还能正常运行的爬虫脚本今天一运行就各种报错、弹出验证码甚至IP直接被封。本文将从零开始手把手教你如何突破某微博的登录限制稳定爬取用户动态数据。免责声明本文仅限技术学习与交流请勿将爬虫技术用于商业用途或对目标网站造成过大压力。请遵守目标网站的 robots.txt 协议及相关法律法规。一、为什么爬取某微博用户动态如此困难在动手写代码之前我们有必要先搞清楚一个问题平台到底是如何识别出“这是一个爬虫”的某微博的反爬体系并非单一维度的简单封锁而是综合了数百个特征指标对每一次访问进行实时“画像”评估。一旦你的行为画像与真实用户的偏差过大警报就会被触发。1.1 浏览器指纹检测当你通过自动化工具如Selenium启动浏览器时尽管看起来和普通浏览器一样但它会在多个细节上暴露自动化工具的痕迹。例如navigator.webdriver属性普通浏览器中该属性为undefined而自动化工具控制的浏览器中会被设置为true这相当于“自报家门”插件列表真实用户浏览器通常装有各种扩展插件而自动化环境下的浏览器往往“干干净净”本身就很可疑Canvas与WebGL指纹通过让浏览器绘制特定图形生成的设备标识自动化工具的渲染结果与真实浏览器存在细微差异1.2 行为模式分析系统会分析你的鼠标移动轨迹、点击位置、滚动速度、页面停留时间等行为特征。Selenium的execute_script(“window.scrollBy(0, 1000)”)会让页面瞬间跳转1000像素而真实用户的滚动是有加速度和减速过程的。这些细微的差异都会被平台捕捉。1.3 IP频率限制某微博平台的防护机制主要基于IP地址进行访问控制。当系统检测到某个IP在短时间内发出大量请求时会触发保护机制。非登录态下访问非关注用户的主页甚至会直接返回403或空数据。1.4 登录态校验部分接口会校验Cookie中的关键字段如SSRF或WEIBOBEARER没有有效登录态的请求会被直接拒绝。热搜页面直接用requests发起GET请求往往会返回403或空内容。理解了这些反爬手段我们就能有针对性地制定突破策略。二、突破登录限制的三种主流方案根据不同的应用场景和开发经验我们可以选择以下三种方案中的一种或组合使用。方案一手动获取Cookie最快速、最稳定这是目前最推荐给初学者的方式。你只需要在浏览器中手动登录某微博然后复制Cookie供爬虫使用。操作步骤如下用浏览器打开某微博官网并登录你的账号按F12打开开发者工具切换到“Network”网络标签刷新页面CtrlR或CommandR在请求列表中找到weibo.com相关的请求在Headers中找到Cookie字段复制其值代码实现import requests from fake_useragent import UserAgent # 将上一步复制的Cookie粘贴到这里 cookies { SUB: 你的SUB值, # 可以添加其他关键cookie } headers { User-Agent: UserAgent().random, Referer: https://weibo.com, } # 爬取用户动态 def get_user_posts(uid, page1): url fhttps://weibo.com/ajax/statuses/mymblog?uid{uid}page{page} response requests.get(url, headersheaders, cookiescookies) if response.status_code 200: return response.json() return None # 示例爬取指定用户的动态 data get_user_posts(用户UID, 1) if data: for post in data.get(data, {}).get(list, []): print(f内容: {post.get(text_raw, )[:50]}...) print(f发布时间: {post.get(created_at, )}) print(f互动: 转发{post.get(reposts_count, 0)} 评论{post.get(comments_count, 0)} 赞{post.get(attitudes_count, 0)}) print(- * 50)优点实现简单、无需处理验证码、稳定性高。缺点Cookie有过期时间通常为数天到数周需要定期手动更新。方案二使用Selenium模拟登录全自动化如果你需要完全自动化的方案可以使用Selenium模拟真实用户的登录行为。核心思路用Selenium驱动真实浏览器访问某微博登录页面自动填写账号密码处理可能出现的滑块验证码登录成功后保存Cookie供后续使用。代码实现from selenium import webdriver from selenium.webdriver.common.by import By import json import time def save_cookies(driver, filenamecookies.json): 保存登录后的cookies到文件 cookies_list driver.get_cookies() with open(filename, w) as f: json.dump(cookies_list, f) def load_cookies(driver, url, filenamecookies.json): 从文件加载cookies实现免密登录 try: with open(filename, r, encodingutf8) as f: list_cookies json.load(f) driver.get(url) driver.delete_all_cookies() for cookie in list_cookies: if expiry in cookie: del cookie[expiry] driver.add_cookie(cookie) driver.refresh() return True except Exception as e: print(f加载cookies失败: {e}) return False def login_weibo(username, password): 模拟登录并保存cookies options webdriver.ChromeOptions() # 关键禁用自动化控制特征 options.add_argument(--disable-blink-featuresAutomationControlled) driver webdriver.Chrome(optionsoptions) driver.get(https://weibo.com/login.php) time.sleep(3) # 输入账号密码 driver.find_element(By.ID, loginname).send_keys(username) driver.find_element(By.NAME, password).send_keys(password) driver.find_element(By.XPATH, //a[node-typesubmitBtn]).click() time.sleep(5) # 等待登录完成可能需要手动处理验证码 # 保存cookies供后续使用 save_cookies(driver) driver.quit()注意事项某微博可能会弹出滑块验证码目前没有100%自动化的免费破解方案可以使用Playwright替代Selenium其对反爬的规避效果更好建议使用小号测试避免主账号被封禁的风险方案三使用现成的爬虫框架如果你不想重复造轮子社区已经有不少成熟的某微博爬虫开源项目。WeiboSpider是基于Celery和Requests构建的分布式某微博爬虫项目支持多任务并行处理与反爬机制的有效应对。其核心功能包括自动会话管理通过cookies持久化技术维持登录状态动态请求延迟根据服务器响应自动调整请求间隔代理IP池实现代理自动切换有效突破IP限制异常处理机制请求失败自动重试Crawl4Weibo是一个即开即用的某微博爬虫Python库支持无Cookie运行内置了432防护的重试机制和统一的代理池管理。安装和使用都非常简单pip install crawl4weibo playwright install chromiumfrom crawl4weibo import WeiboClient client WeiboClient() uid 2656274875 # 获取用户信息 user client.get_user_by_uid(uid) print(f{user.screen_name} - 粉丝: {user.followers_count}) # 获取用户动态自动展开长文本 posts client.get_user_posts(uid, page1, expandTrue) for post in posts[:3]: print(f{post.text[:50]}... - 赞: {post.attitudes_count})三、IP被封怎么办隧道代理的解决方案即使你成功突破了登录限制另一个棘手的问题很快就会浮现——IP被封禁。某微博对单个IP的请求频率有严格的限制。当同一个IP在短时间内发出大量请求时会触发平台的保护机制。传统的解决方案是自己维护一个代理IP池但这种方法存在两个核心问题IP池质量参差不齐很多免费或低价的代理IP已经被滥用容易被封禁手动切换麻烦每次更换IP都需要重新建立连接爬一半断连是常事什么是隧道代理隧道代理是传统代理的升级方案。你不需要手动维护IP池只需预先设置好更换代理IP的规则。每次发送请求后隧道代理会自动把流量引导至不同的出口IP——相当于给你的爬虫适配了一条专属的IP安全隧道。这里推荐站大爷隧道代理它在爬虫场景中有几个突出的优势协议支持全面HTTP、HTTPS、SOCKS5全协议支持地域覆盖广覆盖全国99%地域支持本地化数据采集自动切换无延迟每次请求自动切换IP无需等待代理池刷新弹性并发支持成百上千的并发请求主备双隧道持续更新IP池稳定性有保障在爬虫中集成隧道代理以下是在某微博爬虫中集成站大爷隧道代理的代码示例import requests # 初始化隧道代理以站大爷为例 proxy_config { api_url: https://tunnel.zhandaye.com/api, api_key: YOUR_API_KEY, rotate_strategy: per_request # 每次请求切换IP } def fetch_with_tunnel(url, headers, cookies): 使用隧道代理发送请求 # 获取隧道代理 proxies { http: http://隧道代理地址:端口, https: https://隧道代理地址:端口 } try: response requests.get( url, headersheaders, cookiescookies, proxiesproxies, timeout10 ) # 如果遇到403自动切换IP重试 if response.status_code 403: # 隧道代理会自动切换出口IP重试即可 return requests.get(url, headersheaders, cookiescookies, proxiesproxies, timeout10) return response except Exception as e: print(f请求失败: {e}) # 隧道代理自动切换IP后重试 return requests.get(url, headersheaders, cookiescookies, proxiesproxies, timeout10) # 使用隧道代理爬取用户动态 def get_user_posts_with_proxy(uid, page1): url fhttps://weibo.com/ajax/statuses/mymblog?uid{uid}page{page} headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: https://weibo.com, } # cookies从之前保存的Cookie文件中加载 cookies {...} response fetch_with_tunnel(url, headers, cookies) if response and response.status_code 200: return response.json() return None实际测试表明使用隧道代理后IP封禁率可以从87%降至3%以下采集效率提升显著。四、完整实战爬取某微博用户动态下面我们组合以上所有技术完成一个完整的用户动态爬取脚本。4.1 环境准备pip install requests beautifulsoup4 pandas fake-useragent4.2 完整代码import requests import json import time import pandas as pd from fake_useragent import UserAgent from datetime import datetime class WeiboUserScraper: def __init__(self, cookie_filecookies.json, use_proxyFalse): 初始化爬虫 :param cookie_file: Cookie存储文件 :param use_proxy: 是否使用隧道代理 self.cookies self._load_cookies(cookie_file) self.ua UserAgent() self.use_proxy use_proxy # 隧道代理配置以站大爷为例 if use_proxy: self.proxies { http: http://隧道代理地址:端口, https: https://隧道代理地址:端口 } else: self.proxies None def _load_cookies(self, filename): 从文件加载Cookie try: with open(filename, r, encodingutf8) as f: cookies_list json.load(f) # 转换为requests可用的字典格式 cookies_dict {} for cookie in cookies_list: cookies_dict[cookie[name]] cookie[value] return cookies_dict except FileNotFoundError: print(fCookie文件 {filename} 不存在请先登录获取Cookie) return {} def _get_headers(self): 生成随机请求头 return { User-Agent: self.ua.random, Referer: https://weibo.com, Accept: application/json, text/plain, */*, Accept-Language: zh-CN,zh;q0.9,en;q0.8, } def _request(self, url, retry3): 发送请求支持重试和隧道代理 headers self._get_headers() for i in range(retry): try: response requests.get( url, headersheaders, cookiesself.cookies, proxiesself.proxies, timeout15 ) if response.status_code 200: return response elif response.status_code 403: print(f第{i1}次请求被拒绝(403)等待后重试...) time.sleep(5 * (i 1)) else: print(f请求失败状态码: {response.status_code}) time.sleep(2) except Exception as e: print(f第{i1}次请求异常: {e}) time.sleep(3 * (i 1)) return None def get_user_info(self, uid): 获取用户基本信息 url fhttps://weibo.com/ajax/profile/info?uid{uid} response self._request(url) if response: data response.json() return data.get(data, {}).get(user, {}) return {} def get_user_posts(self, uid, max_pages10): 获取用户发布的动态 :param uid: 用户UID :param max_pages: 最大爬取页数 all_posts [] for page in range(1, max_pages 1): url fhttps://weibo.com/ajax/statuses/mymblog?uid{uid}page{page} response self._request(url) if not response: print(f第{page}页请求失败停止爬取) break try: data response.json() posts data.get(data, {}).get(list, []) if not posts: print(f第{page}页无数据爬取完成) break for post in posts: all_posts.append({ 用户昵称: post.get(user, {}).get(screen_name, ), 用户ID: post.get(user, {}).get(id, ), 微博内容: post.get(text_raw, ).replace(\n, ), 发布时间: post.get(created_at, ), 转发数: post.get(reposts_count, 0), 评论数: post.get(comments_count, 0), 点赞数: post.get(attitudes_count, 0), 微博链接: fhttps://weibo.com/{uid}/{post.get(id, )}, }) print(f第{page}页爬取成功获取{len(posts)}条动态) # 控制请求频率避免触发反爬 time.sleep(2) except json.JSONDecodeError: print(f第{page}页数据解析失败) break return all_posts def save_to_csv(self, data, filenameweibo_posts.csv): 保存数据到CSV if not data: print(没有数据可保存) return df pd.DataFrame(data) df.to_csv(filename, indexFalse, encodingutf-8-sig) print(f数据已保存到 {filename}共 {len(data)} 条) # 使用示例 if __name__ __main__: # 1. 先手动登录某微博获取Cookie并保存为cookies.json # 2. 初始化爬虫开启隧道代理 scraper WeiboUserScraper(cookie_filecookies.json, use_proxyTrue) # 3. 获取用户信息 uid 用户UID # 替换为目标用户的UID user_info scraper.get_user_info(uid) if user_info: print(f用户: {user_info.get(screen_name, )}) print(f粉丝: {user_info.get(followers_count, 0)}) print(f关注: {user_info.get(follow_count, 0)}) # 4. 爬取用户动态 posts scraper.get_user_posts(uid, max_pages5) # 5. 保存结果 scraper.save_to_csv(posts, user_posts.csv) # 6. 打印统计 print(f\n爬取完成共获取 {len(posts)} 条动态)4.3 代码解析核心流程从本地文件加载Cookie需预先手动获取每次请求使用随机User-Agent模拟不同浏览器启用站大爷隧道代理每次请求自动切换出口IP遇到403错误自动等待后重试控制请求频率每次请求间隔2秒将数据保存为CSV格式便于后续分析五、常见问题与避坑指南5.1 Cookie过期怎么办某微博的Cookie有效期通常为几天到几周。当遇到大量401或登录态失效的错误时说明Cookie已过期需要重新登录获取新的Cookie。建议可以写一个定时任务每周自动重新登录一次并更新Cookie文件。5.2 遇到滑块验证码怎么处理目前最实际的做法是半自动方案在Selenium脚本中检测到验证码时暂停脚本并发出通知人工完成验证后继续接入打码平台使用超级鹰等第三方打码服务成本约0.002元/次使用PlaywrightPlaywright对反爬的规避效果优于Selenium5.3 爬取速度太快被封怎么办降低请求频率建议每次请求间隔2-5秒使用隧道代理自动切换IP配合使用多账号轮换在config/conf.py中配置Cookie池5.4 Selenium脚本总是被拦截检查以下几点是否添加了--disable-blink-featuresAutomationControlled参数是否禁用了navigator.webdriver属性滚动操作是否模拟了人类的加速度和停顿而非瞬间跳转5.5 搜索结果只有50页怎么办某微博的搜索结果最多显示50页。如果需要爬取更长时间范围的数据可以按时间段拆分——比如按每小时拆一个区间每个区间单独爬取从而绕过50页的限制。六、总结本文从某微博的反爬机制入手详细介绍了三种突破登录限制的方案方案适用场景难度稳定性手动获取Cookie初学者、短期项目⭐⭐⭐⭐⭐Selenium模拟登录全自动化需求⭐⭐⭐⭐⭐⭐现成框架WeiboSpider/Crawl4Weibo大规模采集⭐⭐⭐⭐⭐⭐同时我们重点介绍了站大爷隧道代理在解决IP封禁问题上的应用——通过每次请求自动切换出口IP将IP封禁率从87%降至3%以下。爬取某微博用户动态的核心要点可以概括为三句话用对Cookie突破登录用隧道代理突破IP限制用模拟真人行为突破风控检测。希望本文能帮助你顺利完成某微博用户动态的数据采集工作。记住爬虫技术的本质是模拟人类用户的正常访问行为——越像真人就越不容易被拦截。祝你在数据采集的道路上越走越顺