Python + MySQL 简易爬虫如何给新浪大V微博和文章做备份

写了个爬虫定期抓取新浪指定用户的微博和文章,以防哪天失联了还能看备份。 GitHub: https://github.com/HubQin/sinaCrawlerV

各文件功能:

使用:

  • 创建数据表:运行 sina.sql 创建数据表
  • 完善 config.py 的参数,抓取微博使用移动端的请求链接;抓取文章需要登录,这里手动登录后,查看移动端的异步请求,复制 Request Header 里面的 cookie 出来使用
  • 命令行终端 cd 到 py 文件所在目录,运行 pyhton.pyarticle.py ,或修改 auto.bat 文件的 cd 路径,双击改文件开始抓取

Python + MySQL 简易爬虫如何给新浪大V微博和文章做备份

10 回复

支持
把微博热搜也抓一下,就能看出来哪些是用钱买的空降热搜了


我理解你想用Python爬取新浪大V的微博和文章并存入MySQL。这里给你一个基础实现方案。

核心思路是用requests模拟请求获取数据,用BeautifulSoupjson解析,再用pymysql存入数据库。不过要注意,现在微博反爬很严,你可能需要处理登录态(用cookies)和动态加载(微博数据多是AJAX加载的)。

先看数据库设计。建两张表,一个存微博,一个存文章:

CREATE TABLE weibo_posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    post_id VARCHAR(50) UNIQUE,
    content TEXT,
    publish_time DATETIME,
    repost_count INT,
    comment_count INT,
    like_count INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    article_id VARCHAR(50) UNIQUE,
    title VARCHAR(500),
    content LONGTEXT,
    publish_time DATETIME,
    read_count INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Python代码主要分三块:爬取、解析、存储。这里以爬微博为例:

import requests
import pymysql
from datetime import datetime
import json
import time

class WeiboBackup:
    def __init__(self):
        self.db = pymysql.connect(
            host='localhost',
            user='your_user',
            password='your_password',
            database='weibo_backup'
        )
        self.cursor = self.db.cursor()
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Cookie': '你的登录cookie'  # 关键!需要从浏览器获取
        }
    
    def fetch_weibo(self, user_id, pages=5):
        """爬取微博列表"""
        base_url = f'https://m.weibo.cn/api/container/getIndex'
        
        for page in range(1, pages+1):
            params = {
                'type': 'uid',
                'value': user_id,
                'containerid': '107603{user_id}',
                'page': page
            }
            
            try:
                resp = requests.get(base_url, params=params, headers=self.headers)
                data = resp.json()
                
                if data['ok'] == 1:
                    cards = data['data']['cards']
                    for card in cards:
                        if 'mblog' in card:
                            self.save_weibo(card['mblog'])
                
                time.sleep(2)  # 礼貌性延迟
                
            except Exception as e:
                print(f"第{page}页出错: {e}")
                continue
    
    def save_weibo(self, mblog):
        """保存单条微博到数据库"""
        sql = """
        INSERT INTO weibo_posts 
        (post_id, content, publish_time, repost_count, comment_count, like_count) 
        VALUES (%s, %s, %s, %s, %s, %s)
        ON DUPLICATE KEY UPDATE 
        content=VALUES(content), repost_count=VALUES(repost_count)
        """
        
        # 处理发布时间
        publish_time = datetime.strptime(mblog['created_at'], '%a %b %d %H:%M:%S %z %Y')
        
        values = (
            mblog['id'],
            mblog.get('text', ''),
            publish_time,
            mblog.get('reposts_count', 0),
            mblog.get('comments_count', 0),
            mblog.get('attitudes_count', 0)
        )
        
        try:
            self.cursor.execute(sql, values)
            self.db.commit()
            print(f"已保存微博: {mblog['id'][:20]}...")
        except Exception as e:
            print(f"保存失败: {e}")
            self.db.rollback()
    
    def close(self):
        self.cursor.close()
        self.db.close()

# 使用示例
if __name__ == '__main__':
    backup = WeiboBackup()
    backup.fetch_weibo('1234567890', pages=3)  # 替换为实际用户ID
    backup.close()

文章爬取逻辑类似,但URL和解析方式不同。新浪文章通常在blog.sina.com.cn域名下,你需要先找到文章列表页,再逐篇抓取。

几个关键点:

  1. Cookie:必须从登录后的浏览器获取,否则只能看到公开内容
  2. 频率控制:一定要加time.sleep(),别把人家服务器搞崩了
  3. 错误处理:网络请求可能失败,要做好异常捕获
  4. 去重:用ON DUPLICATE KEY UPDATE避免重复存储

文章爬取的部分代码结构差不多,主要是解析HTML:

def fetch_article(self, article_url):
    """爬取单篇文章"""
    resp = requests.get(article_url, headers=self.headers)
    soup = BeautifulSoup(resp.text, 'html.parser')
    
    # 这里需要根据实际页面结构调整选择器
    title = soup.select_one('.articalTitle').text if soup.select_one('.articalTitle') else ''
    content = soup.select_one('.articalContent').text if soup.select_one('.articalContent') else ''
    
    return {
        'title': title,
        'content': content,
        'url': article_url
    }

最后提醒一句,大规模爬取前最好看看robots.txt,尊重网站规则。另外微博数据接口可能会变,需要随时调整解析逻辑。

总结:核心就是获取数据、解析、存数据库这三步,但实际会遇到各种反爬措施。

我最近也写了一个微博的爬虫,并且对微博用户信息进行了分析 https://github.com/starFalll/Spider

mark,正好想备份下自己微博

以前也搞过一个类似的项目,跑的很稳定,多线程抓取

多谢支持!可以试一下。

弱弱地问一下,在哪里指定抓取哪个用户呢?在 config.pypost.py 中都没看出来~

详细说明已添加到附言,请查看。

#7 感谢!希望以后能爬取微博中的图片~

计划把图片的 url 保存下来

回到顶部