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

在这里插入图片描述

通过Python网络爬虫技术,我们可以方便地爬取微博数据。首先,我们需要掌握Python网络爬虫数据抓取的方法与技巧。网络爬虫数据获取方面有着广泛的应用,能够帮助我们从互联网上抓取大量的数据用于分析和应用。 在爬取微博数据的过程中,我们可以使用解析页面的方法来获取微博的文本内容。可以对文本内容进行简单的清洗操作,比如去除换行符等,这样可以使结果更加干净。 接下来,我们可以定义爬取微博数据的具体信息。例如,可以指定微博的起始时间、是否将数据写入数据库等。此外,我们还可以在代码基础上增加新的功能,比如增加一个cookie池或者代理池等。 总结来说,通过Python爬虫技术可以方便地爬取微博数据,并且可以通过自定义参数来获取所需的信息,同时还可以根据需求增加功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python网络爬虫数据抓取.md](https://download.csdn.net/download/pleaseprintf/88229800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python3--爬虫--微博爬虫实战](https://blog.csdn.net/weixin_46863267/article/details/108512962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python 超简单爬取新浪微博数据](https://blog.csdn.net/four91/article/details/106192297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值