文章目录
- 💞许久不见,甚是想念
- 💘初次相遇
- 💘为什么写博客?
- 💘写博客的收获
- 💘此可已无言
- 💘中国版图里的我们
- 💖设计思路:
- 💖具体实现
- 💕爬取粉丝博客名和IP所属地
- 💕数据清洗并保存
- 💕绘制地图
- 💘结束语
专栏 |
---|
Python零基础入门篇🔥 |
Python网络蜘蛛🔥 |
Python数据分析 |
Django基础入门宝典🔥 |
小玩意儿🔥 |
Web前端学习 |
tkinter学习笔记 |
Excel自动化处理 |
💞许久不见,甚是想念
此刻突然不知道改写些什么了。距离上一个次写文章已有九天,这九天说长也长,每天都充斥这各种事情,感觉一天事情的量抵得了平常一周得量,但说短也短,这不,嗖的一下,又可以见到各位咯😁
我现在写这篇文章的时间是👉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上,相逢即是缘,来者皆是客
今天,我把你们化成星光,洒落在中国的大地上
💘中国版图里的我们
💖设计思路:
- 爬取兄弟姐妹的博客名和IP所属地,并保存到json文件中;
- 将获取的数据信息清洗,获得各个省、市、区的粉丝数量,并保存到json文件中;
- 根据情洗的数据,绘制中国地图,在地图上可显示各个省、市、区的粉丝数量。
💖具体实现
💕爬取粉丝博客名和IP所属地
本次代码没有采用分布式爬虫,只是使用了多线程,大意了!
多线程会久一些,粉丝超过5000的慎用,不然你会等到人麻(开玩笑啦😄)
注意几点:
- https://blog.csdn.net/community/home-api/v2/get-fans-list?page=1&pageSize=20&id={id}&noMore=false&blogUsername=,最后的等号后面写上自己的博客名
- ‘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))
💕数据清洗并保存
因为绘制地图需要的地名不能有带有省、区、市,比如上海市,就要清洗成上海。所以需要对已经获取的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~