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

文章目录

  • 许久不见,甚是想念
  • 初次相遇
  • 为什么写博客?
  • 写博客的收获
  • 此可已无言
  • 中国版图里的我们
    • 设计思路:
    • 具体实现
      • 爬取粉丝博客名和IP所属地
      • 数据清洗并保存
      • 绘制地图
  • 结束语

专栏
Python零基础入门篇
Python网络蜘蛛
Python数据分析
Django基础入门宝典
小玩意儿
Web前端学习
tkinter学习笔记
Excel自动化处理

许久不见,甚是想念

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

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

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

初次相遇

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

每次一下课,其他同学要么趴着,要么……还是趴着(低头看手机),而我就在那赶着时间看笔记,手写代码,简直就是三好学生中的三好学生!
【感恩系列】:说点事儿 以及 我把所有的粉丝放到了中国地图上啦~_第3张图片

如果到了周末,就从早上六点半左右钻到图书馆,晚上十点半左右图书馆关门,被踢回宿舍,每天都是带着晨雾去,披星戴月回。实话实说,在此之前我是宿舍里最早睡觉的,几乎十点半左右就已经躺在床上不省人事了,但此后我变成了宿舍最后一个上床的,宿舍熄灯,黑暗里唯一最亮的光点就是我的书桌了。
其实有时候自己一个人呆久了,也感觉到孤独寂寥,但自我认为这是成功路上必经的阶段,也是每个人在青春奋斗中必经的阶段,不然,我们要青春做什么呢❓所以也就咬咬牙,将所有难熬的时光,嚼碎了咽到肚子里。
后来,自己的努力终于有了回报,因为我可以写一些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))

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

数据清洗并保存

因为绘制地图需要的地名不能有带有省、区、市,比如上海市,就要清洗成上海。所以需要对已经获取的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()

绘制地图

获取数据清洗后保存的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)

结束语

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

感谢遇见你们 ❤️

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

peace~

你可能感兴趣的:(真心小项目,python,绘制地图)