爬取微博热搜榜Python爬虫
时间: 2025-06-18 17:31:20 浏览: 23
### 爬取微博热搜榜的Python爬虫代码
以下是一个完整的 Python 爬虫示例,用于从微博热搜榜抓取数据,并将其保存为 CSV 文件或 Excel 文件。此代码结合了网络爬虫的基本原理[^3]以及文件存储方法[^2]。
#### 1. 安装依赖库
在开始编写爬虫之前,请确保安装了所需的依赖库:
```bash
pip install requests beautifulsoup4 pandas openpyxl
```
#### 2. 编写爬虫代码
以下代码展示了如何使用 `requests` 和 `BeautifulSoup` 抓取微博热搜榜的数据,并将其保存到本地文件中。
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import datetime
# 设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 发送请求获取网页内容
url = "https://s.weibo.com/top/summary"
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
# 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
hot_list = soup.select('tbody > tr')
# 存储数据的列表
data = []
# 遍历热搜榜条目
for item in hot_list:
rank = item.select_one('td:nth-of-type(1)').text.strip() if item.select_one('td:nth-of-type(1)') else ''
title = item.select_one('td:nth-of-type(2) > a').text.strip() if item.select_one('td:nth-of-type(2) > a') else ''
url = "https://s.weibo.com" + item.select_one('td:nth-of-type(2) > a')['href'] if item.select_one('td:nth-of-type(2) > a') else ''
heat = item.select_one('td:nth-of-type(2) > span').text.strip() if item.select_one('td:nth-of-type(2) > span') else ''
data.append({
'排名': rank,
'热搜标题': title,
'链接地址': url,
'热度': heat
})
# 将数据保存为CSV文件
today = datetime.date.today()
df = pd.DataFrame(data)
df.to_csv(f'微博热搜榜-{today}.csv', index=False, encoding='utf-8-sig')
# 或者将数据保存为Excel文件
df.to_excel(f'微博热搜榜-{today}.xlsx', index=False)
print("数据已成功保存!")
```
#### 3. 代码说明
- **请求头设置**:通过设置 `User-Agent` 模拟浏览器访问,避免被服务器拒绝请求。
- **HTML解析**:使用 `BeautifulSoup` 提取网页中的关键信息,如热搜标题、链接和热度值[^2]。
- **数据存储**:将提取的数据保存为 CSV 文件或 Excel 文件,方便后续分析和使用[^4]。
#### 4. 注意事项
- 确保目标网站允许爬取其数据,遵守相关法律法规及网站的 robots.txt 文件规定。
- 如果遇到反爬机制(如验证码或 IP 封禁),可以考虑引入代理池或增加请求间隔时间。
---
### 数据分析与可视化
如果需要对爬取的数据进行进一步分析,例如绘制排名与热度的关系图,可以参考以下代码[^5]:
```python
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import leastsq
# 假设已爬取的数据如下
rank = df['排名'].astype(int).values
heat = df['热度'].str.replace(',', '').astype(float).values
# 定义二次函数拟合模型
def func(p, x):
a, b, c = p
return a * (x ** 2) + b * x + c
def error_func(p, x, y):
return func(p, x) - y
# 初始参数估计
p0 = [1, 1, 1]
params = leastsq(error_func, p0, args=(rank, heat))
a, b, c = params[0]
# 绘制散点图和拟合曲线
x = np.linspace(min(rank), max(rank), 100)
y = func([a, b, c], x)
plt.figure(figsize=(10, 6))
plt.scatter(rank, heat, color='blue', label='实际数据')
plt.plot(x, y, color='red', label='拟合曲线', linewidth=2)
plt.title('微博热搜榜排名与热度关系')
plt.xlabel('排名')
plt.ylabel('热度')
plt.legend()
plt.grid()
plt.show()
```
---
阅读全文
相关推荐
















