Python + MySQL 简易爬虫如何给新浪大V微博和文章做备份
写了个爬虫定期抓取新浪指定用户的微博和文章,以防哪天失联了还能看备份。 GitHub: https://github.com/HubQin/sinaCrawlerV
各文件功能:
- database.py 封装了各种 mysql 操作
- post.py 抓取微博,每次抓取到上次抓取的时间为止
- article.py 抓取文章,同上
- gadget.py 用到的各种小工具
- config.py 需要用到的参数
使用:
- 创建数据表:运行 sina.sql 创建数据表
- 完善 config.py 的参数,抓取微博使用移动端的请求链接;抓取文章需要登录,这里手动登录后,查看移动端的异步请求,复制 Request Header 里面的 cookie 出来使用
- 命令行终端 cd 到 py 文件所在目录,运行 pyhton.py 和 article.py ,或修改 auto.bat 文件的 cd 路径,双击改文件开始抓取
Python + MySQL 简易爬虫如何给新浪大V微博和文章做备份
支持
把微博热搜也抓一下,就能看出来哪些是用钱买的空降热搜了
我理解你想用Python爬取新浪大V的微博和文章并存入MySQL。这里给你一个基础实现方案。
核心思路是用requests模拟请求获取数据,用BeautifulSoup或json解析,再用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域名下,你需要先找到文章列表页,再逐篇抓取。
几个关键点:
- Cookie:必须从登录后的浏览器获取,否则只能看到公开内容
- 频率控制:一定要加
time.sleep(),别把人家服务器搞崩了 - 错误处理:网络请求可能失败,要做好异常捕获
- 去重:用
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
以前也搞过一个类似的项目,跑的很稳定,多线程抓取
多谢支持!可以试一下。
详细说明已添加到附言,请查看。
#7 感谢!希望以后能爬取微博中的图片~
计划把图片的 url 保存下来


