博客Top100的“大人物”都是那些?python爬虫带你看!

时间:2020-8-29 作者:admin


使用CSDN也快一年了,排名靠前的博主,我基本都看过他们的文章,有的通俗易懂,有的富含哲理,更多的是他们人生历练和各种经验之谈,我都很佩服他们,可以有这样的成就,是真的不容易,这篇文章,目的爬取博客排名Top100的各位大佬的一些基本资料,让我膜拜!

博客Top100的“大人物”都是那些?python爬虫带你看!


读后有收获,点赞,关注,加收藏,共勉!
点我,点我,点我呀!博主其他文章

文章目录


爬虫思路:

  • 本次爬取网站: https://blog.csdn.net/rank/writing_rank
    博客Top100的“大人物”都是那些?python爬虫带你看!
    是这个样子的, 我的目的就是获得每个用户组的一些基本信息, 然后保存到excel表格,用来做一些可视化表,刺激刺激我自己, 增加自己的学习动力。

我们扫描一下源代码, 不管搜索任何这张图上有的数据,你都会发现找不到,就像这样。
博客Top100的“大人物”都是那些?python爬虫带你看!
其实这个页面和今日头条是一样的, 都是采用Ajax的形式去加载,如果不知道Ajax是什么的,可以看我之前的博客: 今日头条分析Ajax 这样就能对Ajax有大概的了解了,在network中,通过下拉页面状态栏,会发现有很多网址是类似的,就像下面这样:

博客Top100的“大人物”都是那些?python爬虫带你看!
通过每一次下拉, 都会发现有刷出一个新的 weekList?******* 这样的, 查看一下这个连接的代码,发现就是一个json包, 而这个json包,就包括我们要的信息,要想得到这些数据,我们只要解析这个json包就行了,但是如果直接去请求这个网址,可能啥都得不到,还有一些参数没有携带,如图:

博客Top100的“大人物”都是那些?python爬虫带你看!

可以看到参数

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表格的方式。

读后有收获,点赞,关注,加收藏,共勉!
点我,点我,点我呀!博主其他文章

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。