Python爬取微博数据实战教程(附完整代码)

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漫画教程,手机也能学习

相关推荐

植物医生中国什么档次护肤品,哪个系列最好用
best365网页版登录

植物医生中国什么档次护肤品,哪个系列最好用

📅 07-29 👁️ 8792
亚马逊有哪些站点,包含哪些国家?
365体育投注英超

亚马逊有哪些站点,包含哪些国家?

📅 07-04 👁️ 4899
天龙八部手游在怎么PK
365bet体育在线投注注册备

天龙八部手游在怎么PK

📅 06-29 👁️ 2111