数据采集与解析案例之:2020博客之星评选
一、博客之星
2020年的博客之星已经开始啦,根据规则投票会持续一段时间,但是在活动页面并未有实时排行榜,本文将用爬虫实现数据的采集以及排序,可以直接查看到评比排行~同时,在下也有幸入选博客之星TOP 200,如果你手里还有多余的票票,请不要错过投票的机会,点击阅读原文即可为小猪投上宝贵的N票,不胜感激
二、实现思路
1. 确定数据源
首先我们需要在页面上获得数据,由于每次刷新数据都是会变化的,所以一般都是Ajax请求,我们需要用到开发者工具来查看网络请求。
- 如何呼出开发者工具
在进行页面分析的时候,浏览器的开发者工具是不必可少的,笔者以蓝狐(火狐浏览器开发版)为例。对于其他的浏览器,主要都是基于Gecko(火狐内核)、Blink(Chrome内核)、Webkit(Safari内核)、Trident(IE内核)来套的壳子,所以整体的呼出方式不会差别很大。首先我们在页面空白处点击右键 -> 点击检查元素
- 寻找数据源
页面链接:https://bss.csdn.net/m/topic/blog_star2020,打开后切换至网络栏目,点击重新载入:
可以按照类型排序,过滤掉一些静态资源的请求。发现数据来自于一个getUser的接口,返回的数据可以使用JSON格式进行解析。
2. 实现步骤
找到数据源以后,步骤就比较明确了。在获取数据之后进行解析,提取出我们需要的两个字段:博主名称和当前票数,最后再对数据排序输出。我们将使用Python来进行实现,需要先安装scrapy(爬虫框架)和json(方便解析JSON格式数据)两个组件,可以使用如下命令:
代码语言:javascript复制pip install scrapy
pip install json
三、实现过程
1. 创建项目
安装好scrapy后,在命令终端中选定一个文件夹,使用如下命令创建一个项目:
代码语言:javascript复制scrapy startproject StarRank
其中项目名称为StarRank,创建完成后可以直接使用Pycharm打开,项目结构如下:
2. 数据采集
接下来我们在spiders文件夹中创建一个python文件:star_spider.py,来完成数据的采集。
代码语言:javascript复制import scrapy
class StarSpider(scrapy.Spider):
# 定义爬虫名称,在启动任务时指定
name = "star"
def start_requests(self):
# 声明访问地址链接
url = "https://bss.csdn.net/m/topic/blog_star2020/getUsers"
# 发送请求,同时指定回调函数(自定义)
yield scrapy.FormRequest(url, callback=self.parse)
3. 解析排序
数据接收到之后是一个JSON结构的字符串,我们可以引入json库来快速的解析,同时对数据进行排序,回调函数内容如下:
代码语言:javascript复制 def parse(self, response):
# 获取json数据中的data部分
data_list = json.loads(response.text)['data']
# 定义一个字典类型
dict = {}
for data in data_list:
# 提取出博主名称与当前票数,成对儿存放
dict[data["nick_name"]] = int(data["vote_num"])
# 使用sorted根据字典的value进行降序排序
rank = sorted(dict.items(),key=lambda x:x[1],reverse=True)
i = 1
# 对元组进行遍历,输出结果
for name,count in rank:
print("第" str(i) "名票数:" str(count) ",博主:" name)
i = 1
4. 完整代码
代码语言:javascript复制import scrapy
import json
class StarSpider(scrapy.Spider):
name = "star"
def start_requests(self):
url = "https://bss.csdn.net/m/topic/blog_star2020/getUsers"
yield scrapy.FormRequest(url, callback=self.parse)
def parse(self, response):
data_list = json.loads(response.text)['data']
dict = {}
for data in data_list:
dict[data["nick_name"]] = int(data["vote_num"])
rank = sorted(dict.items(),key=lambda x:x[1],reverse=True)
i = 1
for name,count in rank:
print("第" str(i) "名票数:" str(count) ",博主:" name)
i = 1
代码编写完成后,进入到项目的根目录,即spiders文件夹的上一级目录,使用如下命令即可启动项目:
代码语言:javascript复制scrapy crawl star
5. 关闭日志
对于一般的数据处理流程来说,应该把数据直接保存至json或csv文件中,然后再使用单独的程序进行读取和处理。本例为了方便对数据直接进行了处理,带来的问题就是每次执行时会有很多爬虫任务执行时产生的日志信息,我们可以修改settings.py文件,在其中将日志级别调整至ERROR即可:
代码语言:javascript复制LOG_LEVEL = 'ERROR'
最终执行效果如下: