• 【感恩系列】:说点事儿 以及 我把所有的粉丝放到了中国地图上啦~


    💞许久不见,甚是想念

    此刻突然不知道改写些什么了。距离上一个次写文章已有九天,这九天说长也长,每天都充斥这各种事情,感觉一天事情的量抵得了平常一周得量,但说短也短,这不,嗖的一下,又可以见到各位咯😁

    我现在写这篇文章的时间是👉2020年11月19日19时15分
    第一次注册CSDN的时间是👉2022年2月2日某时某分
    这是我在CSDN的❗️291❗️

    时间就是这样,还没等我们反应过来,它就已经悄无声息的走了,但是回头看,还是会看到它留下的痕迹,今天,就让我们随着这些痕迹,追寻过去的脚步吧💨

    💘初次相遇

    CSDN第一次相遇就是在大一完成(应付)C语言作业不会的时候,在网上查资料时相遇的。那时还不知道CSDN是什么,总是奇怪为什么每次查代码都能查到这个网站上来😂,后来慢慢的接触,才发现原来CSDN是一个技术知识服务的网站,有一群大佬在里面发博客,然后提供给我们抄……
    在这里插入图片描述
    那时的自己技术水平,不,说难听点就是没有什么技术水平,说好听点就是Hello world的水平。自己写个九九乘法表都费劲❗️根本就没有想着写博客这件事。后来,一次偶然的机会,我接触到Python这一编程语言,并对其产生极大的兴趣,于是便一发不可收拾的爱上了它。那时对它的热爱近乎疯狂的程度,每天一有空,就提着电脑背着书包往图书里钻,看视频、敲代码、写笔记,那时的笔记还是手写的,写了整整三本❗️❗️❗️(那时估计是脑子有点那啥,不好使,不知道可以在网上写笔记……还请见谅!)
    浅浅给你们看一下笔记吧(温馨提示:一看书就会困的患者以及打死不想学习患者谨慎观看❗️)
    在这里插入图片描述

    每次一下课,其他同学要么趴着,要么……还是趴着(低头看手机),而我就在那赶着时间看笔记,手写代码,简直就是三好学生中的三好学生!
    在这里插入图片描述

    如果到了周末,就从早上六点半左右钻到图书馆,晚上十点半左右图书馆关门,被踢回宿舍,每天都是带着晨雾去,披星戴月回。实话实说,在此之前我是宿舍里最早睡觉的,几乎十点半左右就已经躺在床上不省人事了,但此后我变成了宿舍最后一个上床的,宿舍熄灯,黑暗里唯一最亮的光点就是我的书桌了。
    其实有时候自己一个人呆久了,也感觉到孤独寂寥,但自我认为这是成功路上必经的阶段,也是每个人在青春奋斗中必经的阶段,不然,我们要青春做什么呢❓所以也就咬咬牙,将所有难熬的时光,嚼碎了咽到肚子里。
    后来,自己的努力终于有了回报,因为我可以写一些NB的脚本,可以做我喜欢做的事情(法律允许范围内)。
    👉直到21年的寒假,我做了一件事情,喜欢到现在。
    这件事就是!@#¥%……&*
    ❗️写博客❗️

    💘为什么写博客?

    我为什么写博客呢?实话实说,我主要是为了方便自己看笔记
    因为之前的笔记是手写的,每次都要把笔记放到书包里,然后背着个包,有空就从包里拿笔记出来看。这极其不方便自己,一旦我不背包,也就意味着我看不了笔记。所以我就想着在网上写笔记,但是网上写笔记的软件和网站有很多,为什么选择CSDN呢
    这个问题很简单,因为我只知道它可以写博客。(请原谅我没见过世面)还有一个原因是想分享自己的笔记给大家,也可以说是分享欲作祟吧,总而言之,就在CSDN上写博客了。
    一开始我想把之前手写的笔记整理好,以手写笔记为内容来写博客,于是一篇、两篇、三篇……,我的博客文章逐渐在CSDN上发表了。那时没有关注到什么粉丝量、阅读量、点赞量这些,只是单纯的想把之前的笔记整理好。后来,不知道是哪天,突然看到了我的文章被收藏了,且有几百个人阅读,还有一些点赞,一些关注,这突然给了我极大的自信,没想到会有人喜欢我写的笔记,于是就开始了我的疯狂写博客之路

    💘写博客的收获

    写博客有什么收获呢
    看下面👇
    在这里插入图片描述
    这是能看得到的收获,我拥有3356个兄弟姐妹,这是让我感觉收获最大的。他们就是我写博客的动力源泉,正是因为他们的认可和鼓励,我才能有今天的小成就
    看不到的收获有哪些呢?
    其实,写博客的过程就是一个成长的过程,在写博客、敲代码的过程中会遇到许许多多的困难,有时候一个小Bug就可能花费了我一天的时间。但是,正是因为这些困难才让我有所成长,在解决问题的过程中我能学到很多东西,同时也能感受到我思维方式的改变,逐渐开始从多方面的角度去考虑和解决问题。这听起来可能比较虚,但它却实打实的存在。

    💘此可已无言

    这个时候已经不知道说什么了。有千言万语在堵在心口,但现在却只写了几个片段,总之非常感谢各位兄弟姐妹们的支持,我们在中国的各个地方,相识于CSDN上,相逢即是缘,来者皆是客
    今天,我把你们化成星光,洒落在中国的大地上

    💘中国版图里的我们

    💖设计思路:

    1. 爬取兄弟姐妹的博客名和IP所属地,并保存到json文件中;
    2. 将获取的数据信息清洗,获得各个省、市、区的粉丝数量,并保存到json文件中;
    3. 根据情洗的数据,绘制中国地图,在地图上可显示各个省、市、区的粉丝数量。

    💖具体实现

    💕爬取粉丝博客名和IP所属地

    本次代码没有采用分布式爬虫,只是使用了多线程,大意了!
    多线程会久一些,粉丝超过5000的慎用,不然你会等到人麻(开玩笑啦😄)
    注意几点:

    1. https://blog.csdn.net/community/home-api/v2/get-fans-list?page=1&pageSize=20&id={id}&noMore=false&blogUsername=,最后的等号后面写上自己的博客名
    2. ‘User-Agent’: ‘’,使用自己的User-Agent哈
      运行结果
      在这里插入图片描述
    import requests
    import json
    import threading
    from jsonpath import jsonpath
    import re
    import time
    
    
    # 博客名和博客链接
    def fans_data():
        li_name = []    # 存储博客名
        blogUrl = []   # 存储博客链接
        id = 0
        i = 0
        while True:
            if i == 0:  # 如果是第一页的粉丝数据
                url = f'https://blog.csdn.net/community/home-api/v2/get-fans-list?page=1&pageSize=20&id={id}&noMore=false&blogUsername='
            else:
                url = f'https://blog.csdn.net/community/home-api/v2/get-fans-list?page={i+1}&pageSize=20&id={id}&noMore=false&blogUsername='
            try:
                res = requests.get(url, headers=headers)
                json_data = json.loads(res.text)
                # 获取粉丝博客名
                li_name += jsonpath(json_data, '$..username')
                # 获取粉丝博客链接
                blogUrl += jsonpath(json_data, '$..blogUrl')
                # 获取粉丝博客id
                id = jsonpath(json_data, '$..id')[-1]
                print(id)
            except:
                break
            i += 1
            print(f'第{i}页粉丝数据获取成功!')
        return li_name, blogUrl
    
    
    # 获取粉丝的ip所属地
    def fans_area(url):
        res = requests.get(url, headers=headers)
        try:
            area = re.findall('"region":"IP 属地:(.*?)","msg"', res.text)[0]
        except:
            area = ''
        li_area.append(area)
        print('IP所属地获取成功!')
    
    
    # 将粉丝的所属地和博客名保存到json文件中
    def save_json():
        with open('CSDN粉丝信息.json', 'a', newline="", encoding='utf-8') as f:
            for i in range(len(li_name)):
                data = {'name':li_name[i], 'area':li_area[i]}
                # 将字典转换成json数据
                data_str = json.dumps(data, ensure_ascii=False)
                f.write(data_str + ',' + '\n')
        print('CSDN粉丝信息.json 文件保存成功!')
    
    
    if __name__ == '__main__':
        headers = {
            'User-Agent': ''
        }
        li_area = []    # 存储所有粉丝的所属地
        threads = []
        li_name, blogUrl = fans_data()      # 接收粉丝名和博客链接
        print('-----开始获取粉丝所属地-----')
        for i in blogUrl:
            threads.append(threading.Thread(target=fans_area(i)))
        for t in threads:
            t.start()
        save_json()
        print(len(li_name))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    在这里插入图片描述

    💕数据清洗并保存

    因为绘制地图需要的地名不能有带有省、区、市,比如上海市,就要清洗成上海。所以需要对已经获取的IP所属地进行清洗,并使用pands模块进行分组统计,统计各个省、区、市中的粉丝数量。
    注意:CSDN粉丝信息.json 是爬取粉丝博客名和IP所属地中保存下的。

    import pandas as pd
    import json
    from jsonpath import jsonpath
    
    # 读取CSDN粉丝信息.json的内容
    def read_file():
        li_area = []
        with open('CSDN粉丝信息.json', 'r', encoding='utf-8') as f:
            # 获取信息库中的json数据,并转换为Python字符串
            data = json.load(f)
            # 获取粉丝名字
            fans_name = jsonpath(data, '$..name')
            # 获取粉丝所属IP地址
            fans_area = jsonpath(data, '$..area')
            # 清洗数据
            for i in fans_area:
                if '省' in i or '市' in i:
                    li_area.append(i[:-1])
                else:
                    li_area.append(i)
            return li_area
    
    
    # 清洗数据,统计各个省份中的粉丝数
    def wash_data(area):
        df = pd.DataFrame({'area': area, 'num': [1 for i in range(len(area))]})
        df = df.groupby('area').sum()   # 将粉丝所属地进行分组统计
        df.reset_index(inplace=True)
        fans_area = df['area'].values   # 统计中的所有IP所属地
        area_num = df['num'].values     # 各个所属地中粉丝的数量
        return list(list(i) for i in zip(fans_area, area_num))   # 使用拉链函数将列表包起来
    
    
    # 文件保存
    def save_file():
        with open('ip所属地统计.json', 'a', newline="", encoding='utf-8') as f:
            for i in range(len(province_list)):
                data = {'area':province_list[i][0], 'num':str(province_list[i][1])}
                # 将字典转换成json数据
                data_str = json.dumps(data, ensure_ascii=False)
                f.write(data_str + ',' + '\n')
    
    
    if __name__ == '__main__':
        fans_area = read_file()
        province_list = wash_data(fans_area)
        save_file()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    💕绘制地图

    获取数据清洗后保存的ip所属地统计.json文件中的信息进行绘制

    from pyecharts.charts import Map
    from pyecharts import options as opts
    import json
    from jsonpath import jsonpath
    
    
    # 获取ip所属地统计.json中的信息
    def fans_data():
        with open('ip所属地统计.json', 'r', encoding='utf-8') as f:
            data = json.load(f)
            # 获取ip所属地
            area = jsonpath(data, '$..area')
            # 获取数量
            num = jsonpath(data, '$..num')
    
            li_data = list(list(i) for i in zip(area, num))
            return li_data
    
    
    # 绘制地图
    def draw_map(province_list):
        # 将省份和数量输出
        pieces = [
            {'max': 5, 'label': '5以下', 'color': '#0072E3'},
            {'min': 5, 'max': 10, 'label': '5-10', 'color': 'yellow'},
            {'min': 10, 'max': 20, 'label': '10-20', 'color': 'pink'},
            {'min': 350, 'max': 400, 'label': '350-400', 'color': 'red'},
        ]
        # 软件工程专业
        c = (
            Map(init_opts=opts.InitOpts(width="1000px", height="600px"))  # 可切换主题
                .set_global_opts(
                title_opts=opts.TitleOpts(title="各省份CSDN粉丝分布"),
                visualmap_opts=opts.VisualMapOpts(
                    min_=0,
                    max_=500,
                    range_text=['CSDN粉丝数量区间:', ''],  # 分区间
                    is_piecewise=True,  # 定义图例为分段型,默认为连续的图例
                    pos_top="middle",  # 分段位置
                    pos_left="left",
                    orient="vertical",
                    # split_number=10,  # 分成10个区间
                    pieces=pieces
                )
    
            )
                .add("CSDN粉丝分布图", province_list, maptype="china")
                .render("CSDN粉丝分布图.html")
        )
    
    
    if __name__ == '__main__':
        data = fans_data()
        draw_map(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在这里插入图片描述

    💘结束语

    今天的感想和所经历的事情没有展开说明太多,但是,未来有机会,我一定把我所经历的事情,以及学习的各个阶段的感悟分享给大家!

    感谢遇见你们💙 💜 ❤️ 💚

    希望你们生活有光,心中有梦😊

    peace~

  • 相关阅读:
    linux文件IO
    压缩图片怎么弄?这些方法我逢人必推
    写了一个适配 Android12-exported 的小插件
    报错:Unknown at rule @apply
    【算法 | 模拟No.3】leetcode 38. 外观数列
    【温度检测】基于matlab GUI热红外图像温度检测系统【含Matlab源码 1920期】
    程 控 电 源1761程控模块电源
    Vue开发环境安装
    《数据结构》复试问答题总结
    微信小程序和H5之间互相跳转、互相传值
  • 原文地址:https://blog.csdn.net/Oh_Python/article/details/127940411