使用CSDN也快一年了,排名靠前的博主,我基本都看过他们的文章,有的通俗易懂,有的富含哲理,更多的是他们人生历练和各种经验之谈,我都很佩服他们,可以有这样的成就,是真的不容易,这篇文章,目的爬取博客排名Top100的各位大佬的一些基本资料,让我膜拜!
读后有收获,点赞,关注,加收藏,共勉!
点我,点我,点我呀!博主其他文章
文章目录
- 爬虫思路:
- 编写代码:
- 初始化参数:
- 爬取网址:
- 分析json包:
- 下载保存excel表格:
- 全部代码:
爬虫思路:
- 本次爬取网站: https://blog.csdn.net/rank/writing_rank
是这个样子的, 我的目的就是获得每个用户组的一些基本信息, 然后保存到excel表格,用来做一些可视化表,刺激刺激我自己, 增加自己的学习动力。
我们扫描一下源代码, 不管搜索任何这张图上有的数据,你都会发现找不到,就像这样。
其实这个页面和今日头条是一样的, 都是采用Ajax的形式去加载,如果不知道Ajax是什么的,可以看我之前的博客: 今日头条分析Ajax 这样就能对Ajax有大概的了解了,在network中,通过下拉页面状态栏,会发现有很多网址是类似的,就像下面这样:
通过每一次下拉, 都会发现有刷出一个新的 weekList?******* 这样的, 查看一下这个连接的代码,发现就是一个json包, 而这个json包,就包括我们要的信息,要想得到这些数据,我们只要解析这个json包就行了,但是如果直接去请求这个网址,可能啥都得不到,还有一些参数没有携带,如图:
可以看到参数
url: 我们时请求这个url 不是最开始给的网址
useername: 这个是你自己的用户id 不带的话 就表示没登入 (不带也可以)
page: 页数 测试发现 这个只能显示Top100 也就最大10页
size: 大小 每次json包里面只包括 10 个大佬的数据
这里面只有page会发生变化, 所以我们只要一个循环,不断的去构造这个网址就行了。
接下来就是构造这个初始变量,然后去请求网址,分析json包就行了。
编写代码:
初始化参数:
def __init__(self):
self.ua = GetUserAgentCS() # 这个是我自己编写的一个useragent的随机类
# 表示用fake_useragent 有的时候会断连 不稳定
self.url = 'https://blog.csdn.net/api/WritingRank/weekList?' # ajax 请求网址
self.header = {
'Referer': 'https://blog.csdn.net/qq_45906219',
"Upgrade-Insecure-Requests": "1",
'User-Agent': self.ua.get_user()
}
# 配置保存表格的基本
self.workbook = Workbook()
self.sheet = self.workbook.active
self.sheet.title = 'CSDNTop100信息'
self.sheet['A1'] = '排名'
self.sheet['B1'] = '用户名'
self.sheet['C1'] = '用户头像'
self.sheet['D1'] = '用户博客网址'
self.sheet['E1'] = '粉丝数'
self.sheet['F1'] = '点赞数'
self.sheet['G1'] = '上周排名'
self.sheet['H1'] = '博客等级'
self.sheet['I1'] = '排名时间'
def __params(self, offset):
self.offset = offset
"""构造请求参数"""
self.params = {
"username": "qq_45906219",
"page": str(self.offset),
"size": "10"
}
爬取网址:
def spider(self):
""" 构造 多页 爬取 """
for i in range(1, 11):
self.__params(i)
url = self.url + urlencode(self.params)
r = requests.get(url, headers=self.header)
if r.status_code == 200:
r.encoding = r.apparent_encoding
yield r.json()
else:
print('[info] request error ! the status_code is ' + r.status_code)
time.sleep(0.5)
分析json包:
def parse_json(self, r_json):
""" 根据网站请求返回的json包 进行进一步分析 """
# 第一层
first_data = r_json.get('data')
if first_data:
# 第二层
list_data = first_data.get('list')
if list_data: # 判空
for i in list_data:
rank = i.get("ranking")
head_image = i.get('avatar')
user_nickname = i.get('user_nickname') # 用户名
username = i.get('username') # 用户id
fans_num = i.get('fans_num') # 粉丝
fav_num = i.get('fav_num') # 获赞
last_rank = i.get('last_ranking') # 上周排名
leave = i.get('profile_level').get('level') # 博客等级
if rank and head_image and user_nickname and user_nickname and username and fans_num \
and fav_num and last_rank and leave:
# 这里保存数据 只是为了方便转换其他保存格式 仅仅是保存excel中用到列表
yield {
'rank': rank,
'user_nickname': user_nickname,
'head_image': head_image,
'username': 'https://blog.csdn.net/' + username,
'fans_num': fans_num,
'fav_num': fav_num,
'last_rank': last_rank,
'leave': leave
}
下载保存excel表格:
def down(self, item):
"""保存至excel表格"""
now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) # 时间
leave_list = []
for value in item.values():
leave_list.append(value)
leave_list.append(now_time)
self.sheet.append(leave_list)
读后有收获,点赞,关注,加收藏,共勉!
点我,点我,点我呀!博主其他文章
全部代码:
# -*- coding : utf-8 -*-
# @Time : 2020/8/27 21:04
# @author : 沙漏在下雨
# @Software : PyCharm
# @CSDN : https://me.csdn.net/qq_45906219
from get_useragent import GetUserAgentCS
import requests
from urllib.parse import urlencode
import time
from openpyxl import Workbook
class CSDNSpider(object):
""" 爬取csdn top 100 的各种信息 url = 'https://blog.csdn.net/rank/writing_rank' ajax方式 """
def __init__(self):
self.ua = GetUserAgentCS()
self.url = 'https://blog.csdn.net/api/WritingRank/weekList?' # ajax 请求网址
self.header = {
'Referer': 'https://blog.csdn.net/qq_45906219',
"Upgrade-Insecure-Requests": "1",
'User-Agent': self.ua.get_user()
}
# 配置保存表格的基本
self.workbook = Workbook()
self.sheet = self.workbook.active
self.sheet.title = 'CSDNTop100信息'
self.sheet['A1'] = '排名'
self.sheet['B1'] = '用户名'
self.sheet['C1'] = '用户头像'
self.sheet['D1'] = '用户博客网址'
self.sheet['E1'] = '粉丝数'
self.sheet['F1'] = '点赞数'
self.sheet['G1'] = '上周排名'
self.sheet['H1'] = '博客等级'
self.sheet['I1'] = '排名时间'
def __params(self, offset):
self.offset = offset
"""构造请求参数"""
self.params = {
"username": "qq_45906219",
"page": str(self.offset),
"size": "10"
}
def spider(self):
""" 构造 多页 爬取 """
for i in range(1, 11):
self.__params(i)
url = self.url + urlencode(self.params)
r = requests.get(url, headers=self.header)
if r.status_code == 200:
r.encoding = r.apparent_encoding
yield r.json()
else:
print('[info] request error ! the status_code is ' + r.status_code)
time.sleep(0.5)
def parse_json(self, r_json):
""" 根据网站请求返回的json包 进行进一步分析 """
# 第一层
first_data = r_json.get('data')
if first_data:
# 第二层
list_data = first_data.get('list')
if list_data: # 判空
for i in list_data:
rank = i.get("ranking")
head_image = i.get('avatar')
user_nickname = i.get('user_nickname') # 用户名
username = i.get('username') # 用户id
fans_num = i.get('fans_num') # 粉丝
fav_num = i.get('fav_num') # 获赞
last_rank = i.get('last_ranking') # 上周排名
leave = i.get('profile_level').get('level') # 博客等级
if rank and head_image and user_nickname and user_nickname and username and fans_num \
and fav_num and last_rank and leave:
# 这里保存数据 只是为了方便转换其他保存格式 仅仅是保存excel中用到列表
yield {
'rank': rank,
'user_nickname': user_nickname,
'head_image': head_image,
'username': 'https://blog.csdn.net/' + username,
'fans_num': fans_num,
'fav_num': fav_num,
'last_rank': last_rank,
'leave': leave
}
def down(self, item):
"""保存至excel表格"""
now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
leave_list = []
for value in item.values():
leave_list.append(value)
leave_list.append(now_time)
self.sheet.append(leave_list)
def main(self):
"""调用函数"""
print('The spider is start!')
for content in self.spider():
for item in self.parse_json(content):
self.down(item)
self.workbook.save(filename='CSDNTop100.xlsx')
self.workbook.close()
print('The CSDNTop100 spider is over!')
a = CSDNSpider()
a.main()
一起来看大佬吧,怎么看,爬就完事了!本篇文章,目的爬取博客T100的大佬一些数据,相关技术包含解析Ajax,分析json包,requests爬取方式,以及保存excel表格的方式。
读后有收获,点赞,关注,加收藏,共勉!
点我,点我,点我呀!博主其他文章