如何使用Python爬取CSDN的热榜数据并保存为CSV文件

CSDN是一个非常受欢迎的技术社区,在这里,开发者们可以分享他们的知识、经验和代码。本文将指导你如何使用Python编写一个简单的爬虫程序来爬取CSDN的热榜数据,并将这些数据保存成CSV文件。

环境准备

首先确保你的开发环境中安装了以下Python库:

  • requests: 用于发起HTTP请求。
  • pandas: 用于数据处理和导出。
  • fake_useragent: 用于生成随机的User-Agent,防止被服务器识别为爬虫。

可以通过pip命令安装这些库:
 

pip install requests 
pip install pandas 
pip install fake-useragen
爬虫实现

我们将实现三个主要功能:

  1. 爬取全站综合热榜数据。
  2. 爬取特定领域的热榜数据。
  3. 爬取热门专栏榜数据。

以下是具体的实现代码:

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文件,方便进一步分析和使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值