包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取!】
微博作为国内最大的社交媒体平台之一,蕴含着大量有价值的公开数据。本文将详细介绍如何使用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漫画教程,手机也能学习