Python爬取微博数据实战教程(附完整代码)
包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取!】
微博作为国内最大的社交媒体平台之一,蕴含着大量有价值的公开数据。本文将详细介绍如何使用Python爬取微博数据,包括环境搭建、登录模拟、数据抓取、反爬应对、数据存储等完整流程,并提供可直接运行的代码示例。
一、环境准备与工具选择
1.1 必需工具包
pip install requests selenium beautifulsoup4 pandas pyquery pymysql
requests:发送HTTP请求
selenium:模拟浏览器操作(应对动态加载)
beautifulsoup4/pyquery:HTML解析
pandas:数据处理
pymysql:数据库存储
1.2 推荐开发环境
Python 3.8+
Chrome浏览器 + ChromeDriver
MySQL 5.7+(可选)
二、微博登录模拟(三种方案)
2.1 方案一:Cookie直接登录(最简单)
浏览器登录微博后按F12打开开发者工具
在Application > Cookies中复制SUB和SUHB的值
import requests cookies = { 'SUB': '你的SUB值', 'SUHB': '你的SUHB值' } response = requests.get('https://weibo.com', cookies=cookies) print(response.status_code) # 200表示成功
2.2 方案二:Selenium模拟登录(更稳定)
from selenium import webdriver import time driver = webdriver.Chrome() driver.get('https://weibo.com/login.php') # 自动填写账号密码 driver.find_element_by_id('loginname').send_keys('你的账号') driver.find_element_by_name('password').send_keys('你的密码') driver.find_element_by_xpath('//a[@node-type="submitBtn"]').click() # 等待登录完成 time.sleep(5) # 获取登录后的Cookies cookies = driver.get_cookies() print(cookies) driver.quit()
2.3 方案三:API登录(最复杂但最稳定)
需要分析微博手机端登录接口,这里给出关键代码:
import requests session = requests.Session() login_url = 'https://passport.weibo.cn/sso/login' data = { 'username': '你的账号', 'password': '加密后的密码', # 需要研究加密算法 'savestate': '1', 'r': 'https://weibo.cn/', 'ec': '0', 'pagerefer': '', 'entry': 'mweibo', 'wentry': '', 'loginfrom': '', 'client_id': '', 'code': '', 'qq': '', 'mainpageflag': '1', 'hff': '', 'hfp': '' } headers = { 'Referer': 'https://passport.weibo.cn/signin/login', 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X)' } response = session.post(login_url, data=data, headers=headers) print(response.json())
三、微博数据抓取实战
3.1 抓取用户基本信息
def get_user_info(user_id, cookies): url = f'https://weibo.com/ajax/profile/info?uid={user_id}' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'X-Requested-With': 'XMLHttpRequest' } response = requests.get(url, headers=headers, cookies=cookies) if response.status_code == 200: data = response.json() user_info = { 'id': data['data']['user']['id'], 'screen_name': data['data']['user']['screen_name'], 'gender': data['data']['user']['gender'], 'location': data['data']['user']['location'], 'description': data['data']['user']['description'], 'followers_count': data['data']['user']['followers_count'], 'friends_count': data['data']['user']['friends_count'], 'statuses_count': data['data']['user']['statuses_count'], 'verified': data['data']['user']['verified'] } return user_info else: print(f"请求失败,状态码:{response.status_code}") return None
3.2 抓取用户微博内容(含分页)
def get_weibo_list(user_id, page=1, cookies=None): url = f'https://weibo.com/ajax/statuses/mymblog?uid={user_id}&page={page}' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'X-Requested-With': 'XMLHttpRequest' } response = requests.get(url, headers=headers, cookies=cookies) if response.status_code == 200: data = response.json() weibo_list = [] for item in data['data']['list']: weibo_info = { 'id': item['id'], 'created_at': item['created_at'], 'text': item['text_raw'], 'reposts_count': item['reposts_count'], 'comments_count': item['comments_count'], 'attitudes_count': item['attitudes_count'], 'pics': [pic['url'] for pic in item.get('pics', [])] } weibo_list.append(weibo_info) return weibo_list else: print(f"请求失败,状态码:{response.status_code}") return []
3.3 抓取微博评论数据
def get_weibo_comments(weibo_id, page=1, cookies=None): url = f'https://weibo.com/ajax/statuses/buildComments?flow=0&id={weibo_id}&page={page}' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'X-Requested-With': 'XMLHttpRequest' } response = requests.get(url, headers=headers, cookies=cookies) if response.status_code == 200: data = response.json() comments = [] for item in data['data']: comment = { 'id': item['id'], 'text': item['text_raw'], 'user': item['user']['screen_name'], 'user_id': item['user']['id'], 'created_at': item['created_at'], 'like_count': item['like_count'] } comments.append(comment) return comments else: print(f"请求失败,状态码:{response.status_code}") return []
四、反爬虫应对策略
4.1 常见反爬措施
频率限制:微博会限制单个IP的请求频率
验证码:频繁访问会触发验证码
User-Agent检测:未设置合法UA会被拦截
Cookie失效:长时间使用的Cookie会失效
4.2 应对方案
import random import time # 1. 使用代理IP池 proxies = [ {'http': 'http://123.123.123.123:8888'}, {'http': 'http://124.124.124.124:8888'} ] # 2. 随机User-Agent user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X)' ] # 3. 随机延迟 def random_delay(): time.sleep(random.uniform(1, 3)) # 使用示例 def safe_request(url, cookies): headers = { 'User-Agent': random.choice(user_agents) } proxy = random.choice(proxies) random_delay() try: response = requests.get(url, headers=headers, cookies=cookies, proxies=proxy) return response except Exception as e: print(f"请求异常: {e}") return None
五、数据存储方案
5.1 存储到CSV文件
import pandas as pd def save_to_csv(data, filename): df = pd.DataFrame(data) df.to_csv(filename, index=False, encoding='utf_8_sig') # 支持中文 # 使用示例 user_info = get_user_info('用户ID', cookies) save_to_csv([user_info], 'user_info.csv')
5.2 存储到MySQL数据库
import pymysql def save_to_mysql(data, table_name): connection = pymysql.connect( host='localhost', user='root', password='123456', database='weibo_data', charset='utf8mb4' ) try: with connection.cursor() as cursor: # 动态生成SQL keys = ', '.join(data[0].keys()) values = ', '.join(['%s'] * len(data[0])) sql = f"INSERT INTO {table_name} ({keys}) VALUES ({values})" # 批量插入 cursor.executemany(sql, [tuple(item.values()) for item in data]) connection.commit() finally: connection.close() # 使用前需要先创建表结构
六、完整案例演示
# 配置你的Cookie WEIBO_COOKIES = { 'SUB': '你的SUB值', 'SUHB': '你的SUHB值' } # 1. 获取用户基本信息 user_id = '1669879400' # 示例:人民日报微博 user_info = get_user_info(user_id, WEIBO_COOKIES) print(user_info) # 2. 获取前5页微博 all_weibos = [] for page in range(1, 6): weibos = get_weibo_list(user_id, page, WEIBO_COOKIES) all_weibos.extend(weibos) print(f"已获取第{page}页,共{len(weibos)}条微博") time.sleep(2) # 适当延迟 # 3. 保存结果 save_to_csv(all_weibos, 'weibo_content.csv') # 4. 获取第一条微博的评论 if len(all_weibos) > 0: first_weibo_id = all_weibos[0]['id'] comments = get_weibo_comments(first_weibo_id, 1, WEIBO_COOKIES) save_to_csv(comments, 'weibo_comments.csv')
七、注意事项与法律提示
遵守Robots协议:微博的robots.txt规定了爬虫限制范围
控制爬取频率:建议间隔3秒以上,避免对服务器造成压力
数据使用限制:爬取的数据仅可用于个人学习研究
隐私保护:不要爬取和存储用户敏感信息
商业用途:如需商用请获取微博官方API授权
八、常见问题解答
Q1:为什么获取不到数据?
A1:可能原因:Cookie失效、请求频率过高、IP被封。建议更换Cookie,使用代理IP,增加请求间隔。
Q2:如何获取更多历史微博?
A2:微博网页端只显示有限历史记录,可通过手机端接口或付费API获取更早数据。
Q3:遇到验证码怎么办?
A3:可以:1) 手动输入验证码 2) 使用打码平台 3) 降低请求频率
Q4:数据出现乱码如何解决?
A4:确保使用UTF-8编码,存储CSV时使用utf_8_sig,MySQL使用utf8mb4字符集。
最后:
希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!
文末福利
最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
包含编程资料、学习路线图、源代码、软件安装包等!【点击这里领取!】
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习