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

06-02 1315阅读

包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取!】

微博作为国内最大的社交媒体平台之一,蕴含着大量有价值的公开数据。本文将详细介绍如何使用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漫画教程,手机也能学习

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

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码