CSDN是一个非常受欢迎的技术社区,在这里,开发者们可以分享他们的知识、经验和代码。本文将指导你如何使用Python编写一个简单的爬虫程序来爬取CSDN的热榜数据,并将这些数据保存成CSV文件。
环境准备
首先确保你的开发环境中安装了以下Python库:
requests
: 用于发起HTTP请求。pandas
: 用于数据处理和导出。fake_useragent
: 用于生成随机的User-Agent,防止被服务器识别为爬虫。
可以通过pip命令安装这些库:
pip install requests
pip install pandas
pip install fake-useragen
爬虫实现
我们将实现三个主要功能:
- 爬取全站综合热榜数据。
- 爬取特定领域的热榜数据。
- 爬取热门专栏榜数据。
以下是具体的实现代码:
1. 导入必要的模块
import requests
from fake_useragent import UserAgent
import pandas as pd
requests
: 用于发送HTTP请求。fake_useragent
: 用于生成随机的User-Agent字符串,以模拟真实浏览器的请求。pandas
: 用于数据处理和导出CSV文件。
2. 定义基础URL和请求头
base_url = "https://blog.csdn.net/phoenix/web/blog/hot-rank"
headers = {'User-Agent': UserAgent().random}
base_url
: CSDN热榜的基础URL。headers
: 请求头,包含一个随机的User-Agent字符串。
3. 初始化数据字典
data = {
'排名': [],
'封面图片地址': [],
'标题': [],
'作者头像地址': [],
'作者昵称': [],
'浏览量': [],
'评论': [],
'收藏': [],
'热度': []
}
data2 = {
'排名': [],
'标题': [],
'作者头像地址': [],
'作者昵称': [],
'浏览量': [],
'评论': [],
'收藏': [],
'热度': []
}
data3 = {
'排名': [],
'标题': [],
'作者头像地址': [],
'作者昵称': [],
'浏览量': [],
'文章数': [],
'订阅量': [],
'热度': []
}
定义一个字典来存储爬取的数据。
4.处理数据的函数
def process_data(json_data, start_rank):
for i, item in enumerate(json_data, start=start_rank):
data['排名'].append(i)
data['封面图片地址'].append(item.get('picList')[0] if item.get('picList') else '')
data['标题'].append(item.get('articleTitle', ''))
data['作者头像地址'].append(item.get('avatarUrl', ''))
data['作者昵称'].append(item.get('nickName', ''))
data['浏览量'].append(item.get('viewCount', 0))
data['评论'].append(item.get('commentCount', 0))
data['收藏'].append(item.get('favorCount', 0))
data['热度'].append(item.get('hotRankScore', ''))
def process_data2(json_data, start_rank):
for i, item in enumerate(json_data, start=start_rank):
data2['排名'].append(i)
data2['标题'].append(item.get('articleTitle', ''))
data2['作者头像地址'].append(item.get('avatarUrl', ''))
data2['作者昵称'].append(item.get('nickName', ''))
data2['浏览量'].append(item.get('viewCount', 0))
data2['评论'].append(item.get('commentCount', 0))
data2['收藏'].append(item.get('favorCount', 0))
data2['热度'].append(item.get('hotRankScore', ''))
def process_data3(json_data, start_rank):
for i, item in enumerate(json_data['data']['payColumnRankListItemList'], start=start_rank):
data3['排名'].append(i)
data3['标题'].append(item.get('columnName', ''))
data3['作者头像地址'].append(item.get('avatarUrl', ''))
data3['作者昵称'].append(item.get('nickName', ''))
data3['浏览量'].append(item.get('viewCount', 0))
data3['文章数'].append(item.get('articleCount', 0))
data3['订阅量'].append(item.get('subscribeCount', 0))
data3['热度'].append(item.get('hotRankScore', ''))
process_data
: 用于处理从API获取的JSON数据,并填充到前面定义的数据字典中。enumerate
: 使用enumerate
函数遍历JSON数据,同时获取索引。get
方法: 使用字典的get
方法安全地获取值,如果键不存在,则返回默认值。
5. 保存数据
# 爬取全站综合热榜
start_rank = 1 # 明确定义 start_rank
for page in range(4): # 获取100条数据,每页25条
url = f"{base_url}?page={page}&pageSize=25&type="
response = requests.get(url, headers=headers)
json_data = response.json()
if json_data and json_data['code'] == 200:
process_data(json_data['data'], start_rank) # 传递 start_rank 作为参数
start_rank += len(json_data['data'])
# 将全站综合热榜数据保存到CSV文件
df = pd.DataFrame(data)
df.to_csv('全站综合热榜.csv', index=False, encoding='utf-8-sig')
# 爬取数据
# 爬取领域内容榜
start_rank = 1 # 明确定义 start_rank
for page in range(2): # 获取50条数据,每页25条
url = f"{base_url}?page={page}&pageSize=25&child_channel=c%2Fc%2B%2B&type="
response = requests.get(url, headers=headers)
json_data = response.json()
if json_data and json_data['code'] == 200:
process_data2(json_data['data'], start_rank) # 传递 start_rank 作为参数
start_rank += len(json_data['data'])
# 将领域内容榜数据保存到CSV文件
df = pd.DataFrame(data2)
df.to_csv('领域内容榜.csv', index=False, encoding='utf-8-sig')
# 爬取热门专栏榜
start_rank = 1 # 明确定义 start_rank
for page in range(5): # 获取98条数据,每页20条
url = f"https://blog.csdn.net/phoenix/web/blog/pay-column-rank?page={page}&pageSize=20"
response = requests.get(url, headers=headers)
json_data = response.json()
if json_data and json_data['code'] == 200:
process_data3(json_data, start_rank) # 传递 start_rank 作为参数
start_rank += len(json_data['data']['payColumnRankListItemList'])
# 将热门专栏榜数据保存到CSV文件
df = pd.DataFrame(data3)
df.to_csv('热门专栏榜.csv', index=False, encoding='utf-8-sig')
运行代码
将上述代码保存为一个.py
文件,并在命令行中运行该文件。确保你的网络连接正常,因为爬虫需要访问互联网来获取数据。
注意事项
- 在使用爬虫时,请遵守网站的
robots.txt
规则,尊重网站的版权。 - 频繁的请求可能会引起服务器的注意,导致IP被封禁。因此,在实际应用中,建议增加适当的延时或使用代理服务器来降低被封的风险。
- 如果API接口有变动或者数据结构发生改变,可能需要调整爬虫代码以适应新的情况。
通过这篇文章,你应该能够学会如何编写一个简单的Python爬虫来抓取CSDN的热榜数据,并且将数据保存为CSV文件,方便进一步分析和使用。