俺把所有粉丝显示在地图上啦~【详细教程+完整源码】

news2024/12/29 8:19:06

文章目录

  • 🌲小逼叨
  • 🌲爬取所有粉丝的IP所属地
    • 🌴爬者基本素养:网页分析
    • 🌴源代码
  • 🌲数据清洗和保存
    • 🌴源代码
  • 🌲绘制地图
    • 🌴源代码
  • 🌲结束语

🌲小逼叨


其实昨天发了一篇文章👉【感恩系列】:说点事儿 以及 我把所有的粉丝放到了中国地图上啦~
这篇文章是自己的第一篇“情感类”文章,里面讲述了自己的一些经历和感受,其实感觉写这类文章还是有点困难的,因为总有很多想表达的情绪,但又怕文章过于冗长无聊,而自己写这类文章没有太多经验(请大家见谅),本应该是纯纯情感,结果贴了代码上去,然后还没说清楚代码的编写思路和过程。
于是,今儿,我重新写了一篇,纯纯教学。教你们如何获取所有粉丝的IP所属地,并将他们放在中国地图上显示。
详细步骤,请各位兄弟姐妹们往下看👇

🌲爬取所有粉丝的IP所属地


🌴爬者基本素养:网页分析

网页分析网页分析,没有网页,何来分析,所以我们需要找到我们的目标网页,也就是个人博客的粉丝页

网页分析分三步走战略

  • 第一步,以鄙人为例,鼠标悬浮在博客头像,点击粉丝。
    在这里插入图片描述

  • 第二步,进入粉丝页后点击键盘的F12(或者点击鼠标右键,点击网页检查)后会弹出一个进行网页分析的窗口,点击窗口上的网络,然后在筛选输入框中输入:get-fans,接着刷新一下页面,即可看到装有粉丝数据的数据包。

    • 注意:如果不出意外的话那就出意外了😜,这时我们可能只看到一个数据包,出现这种情况别慌,鼠标放在页面上滚动即可,这时就会看到有多个数据包冒出。(拿捏了老铁们儿😎)
      在这里插入图片描述
  • 第三步,点击数据包,点击预览,即可看到粉丝的相关数据,关键来了,这些数据中没有我们想要的IP所属地,你说,这咋整。我说,先别急,先分析分析里面有啥。

    • 经过哥的一整套稀里哗啦的分析,真相只有一……(先别逼叨了)其实发现数据包中有两个主要信息:粉丝博客链接、粉丝的id,这些信息有什么用呢?
      在这里插入图片描述
  • 第四步(哈哈哈,被虚晃了吧),又经过哥的一套叽叽喳喳的分析,发现粉丝博客链接中,也就是粉丝的博客主页有我们想要的IP所属地
    在这里插入图片描述

  • 而id呢,id的作用就是获取下一个数据包的所有粉丝信息。通过分析数据包的链接可以发现,数据包中只有两个地方不同:page值和id值,于是再回到数据包本身,每个粉丝都有id,那么哪一个id是下个数据包链接中的id呢?答案是:最后一个粉丝的id(这时候我应该听到掌声雷动了)
    在这里插入图片描述

🌴源代码

根据以上稀里哗啦叽叽喳喳的操作,我们来编写代码。
代码编写思路

  1. 先对网页分析抓到的第一个数据包发送请求,获取到我们想要的博客链接和id值,然后设置一个page值,它的值自增加一,获取到的id值我们只需要最后一个粉丝的id值,最后拼接链接,重新发送请求,再重复以上步骤。
  2. 等获取了所有的博客链接,我们使用多线程的方式对所有博客链接发送请求,获取IP所属地,最后保存在json文件中。

注意两点:

  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))

效果展示👇
在这里插入图片描述

🌲数据清洗和保存


我们主要的目的就是获取所有粉丝的IP所属地并统计各个省份中的所有粉丝数量,然后在中国地图上展示出来。
于是我们需要对爬取到的信息进行清洗
具体思路:使用强大的数据分析工具——pandas,通过它统计各个省份中的所有粉丝数量,然后将爬取的IP所属地信息进行清洗,将省、区、市这些词从IP所属地中删除,比如:将广西省清洗为广西。最后将所有统计和清洗的结果保存在json文件中。

🌴源代码

源码如下👇
(如有错误,请在评论区中指出哦~😁)

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()

🌲绘制地图


绘制地图所需要用到的模块就是:pyecharts,其貌不扬的可是数据可视化编程中的利器
下载方式:pip install pyecharts(这都基操啦)
具体思路:通过读取我们清洗后的数据信息来进行地图的绘制。需要改的相关设置请看下图👇
在这里插入图片描述
实现效果如下👇
(神奇不,鼠标浮动在地图省份上,会出现粉丝对应省份中粉丝的数量)
在这里插入图片描述

🌴源代码

源码如下👇
(如有错误,请在评论区中指出哦~😁)

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': 10, 'label': '10以下', 'color': '#32CD99'},
        {'min': 10, 'max': 50, 'label': '10-50', 'color': '#3232CD'},
        {'min': 50, 'max': 100, 'label': '50-100', 'color': '#6B8E23'},
        {'min': 100, 'max': 200, 'label': '100-150', 'color': '#EAEAAE'},
        {'min': 200, 'max': 300, 'label': '200-300', 'color': '#9370DB'},
        {'min': 300, 'max': 400, 'label': '300-400', 'color': '#426F42'},
        {'min': 400, 'max': 500, 'label': '400-500', 'color': '#7F00FF'},
    ]

    c = (
        Map(init_opts=opts.InitOpts(width="1000px", height="600px"))  # 可切换主题
            .set_global_opts(
            title_opts=opts.TitleOpts(title="IT工藤新一的各省份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~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows中使用curl

curl这个工具在linux和macOS都经常使用,感觉挺实用的。在windows中默认也带了一个但是用起来不太一样,于是就想自己手动安装一个原汁原味的curl。 下载安装 https://curl.se/windows/ 下载适合自己平台的版本,解压就可以直接运行了。 比如…

剑指 Offer II 026. 重排链表【链表】

难度等级:中等 上一篇算法: 剑指 Offer II 021. 删除链表的倒数第 n 个结点【链表】 力扣此题地址: 剑指 Offer II 026. 重排链表 - 力扣(LeetCode) 1.题目:重排链表 给定一个单链表 L 的头节点 head &…

Linux用户和权限学习笔记

认识root用户 什么是root用户 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中,拥有最大权限的账户名为:root(超级管理员)而在前期,我们一直使用的账户是普通账户:itheim…

《Android Studio开发实战 从零基础到App上线(第3版)》出版后记

2018年11月,经过熬夜写作的《Android Studio开发实战 从零基础到App上线(第2版)》正式出版面世。承蒙众多读者的厚爱,第2版的图书在此后的三年多时间,一直保持在移动开发图书的销量排行榜前列,迄今为止京东对该书的评价已达8000多…

设计模式基础-概括

目录 一、设计原则 二、设计模式分类 1、创建型模式:创建对象 2、结构型模式:更大的结构 3、行为型模式:交互以及职责分配 4、对象模式与类模式区别 三、各类型模式简介 1、创建型模式 2、结构型模式 3、行为型模式 一、设计原则 …

JAVA中Function的使用

JAVA中Function的使用一、方法介绍参数类型方法介绍源码二、demo参考: https://blog.csdn.net/boyan_HFUT/article/details/99618833 一、方法介绍 表示接受一个参数并产生结果的函数。 参数类型 T - 函数输入的类型R - 函数的结果类型 方法介绍 R apply(T t) …

【毕业设计】45-基于单片机的智能温度/超温报警计的系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)

【毕业设计】45-基于单片机的智能温度/超温报警计的系统设计(原理图工程仿真工程源代码答辩论文答辩PPT) 文章目录【毕业设计】45-基于单片机的智能温度/超温报警计的系统设计(原理图工程仿真工程源代码答辩论文答辩PPT)资料下载链…

Vue 路由

参考文献:Vue中的路由 目录:一、路由理解:二、路由管理器理解:三、路由的使用:四、嵌套路由:五、路由传参:1.query传参:2. params传参:六、编程式路由导航:七、响应路由参…

数字孪生技术有没有真正的实用价值?

作为一个数字孪生领域的技术公司负责人,我尽可能用比较直白的话来描述一下我对数字孪生行业以及数字孪生价值的理解。 纵观数字孪生相关的公司,主要有两个流派,一派是具有互联网基因的数字孪生创业公司,一派是在工业软件领域实力…

ConfigurableListableBeanFactory和BeanDefinitionRegistry关系

前言 :在查看springBoot源码的过程中,遇到了这个问题,上网查了一些资料,理解了一些,这里顺便把这个问题给记录一下。 在springBoot调用Refresh方法里面 ,有一个叫invokeBeanFactoryPostProcessors的方法【…

HIve数仓新零售项目ODS层的构建

HIve数仓新零售项目 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kaf…

WindowsPE(二)空白区添加代码新增,扩大,合并节

空白区添加代码 在 PE 中插入一段调用 MessageBox 的代码。 获取MessageBox地址,构造ShellCode代码 利 OD 定位出 MessageBoxA 函数的地址为 0x77D507EA 。 构造 shellcode : unsigned char shellcode[] {0x6A, 0x00, // pus…

ORB-SLAM2 ---- Initializer::ReconstructF函数

目录 1.函数作用 2.函数解析 2.1 调用函数解析 2.2 Initializer::ReconstructF函数总体思路 2.2.1 代码 2.2.2 总体思路解析 2.2.3 根据基础矩阵和相机的内参数矩阵计算本质矩阵 2.2.4 从本质矩阵求解两个R解和两个t解,共四组解 2.2.5 分别验证求解的4种…

准备面试题【面试】

前言 写作于 2022-11-13 19:27:08 发布于 2022-11-20 16:34:44 准备 程序员囧辉 我要进大厂 面试阿里,HashMap 这一篇就够了 Java 基础高频面试题(2022年最新版) 问遍了身边的面试官朋友,我整理出这份 Java 集合高频面试题…

【mysql】mysql 数据备份与恢复使用详解

一、前言 对一个运行中的线上系统来说,定期对数据库进行备份是非常重要的,备份不仅可以确保数据的局部完整性,一定程度上也为数据安全性提供了保障,设想如果某种极端的场景下,比如磁盘损坏导致某个时间段数据丢失&…

什么是Spring,Spring的核心和设计思想你了解吗?

目录 1.初识Spring 1.1 什么是容器 1.2 什么是IoC 2.什么是IoC容器. 2.1 什么是DI 哈喽呀,你好呀,欢迎呀,快来看一下这篇宝藏博客吧~~~ 1.初识Spring Srping指的是Spring Framework(Spring 框架).我们经常会听见框架二字,其中java中最最主流的框架当属Spring.Spring是一…

SAP S4 FI后台详细配置教程- PART4 (科目及税费相关配置篇)

目录 1、总帐科目 1.1编辑科目表清单 1.2 科目表分配给公司代码 1.3 定义科目组 1.4 定义留存收益科目 2、销售/购置税 2.1 维护销售/购置税务代码税率 2.2 配置销项/销项税会计科目 大家好本篇是:SAP S4 FI后台详细配置教程- PART4 (科目及税…

Fiddler的安装和使用

文章目录1、Fiddler的安装2、Fiddler的使用3、抓包工具的原理1、Fiddler的安装 官网链接:https://www.telerik.com/fiddler 进入官网首页 页面跳转后 2、Fiddler的使用 下载好后直接安装,安装后打开,它就会自动抓取HTTP包,在左…

[附源码]SSM计算机毕业设计-东湖社区志愿者管理平台JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

力扣113题引发的关于DFS和回溯的一点思考

最近刚学回溯和DFS&#xff0c;刷力扣遇到一道题&#xff08;113题&#xff09;&#xff0c;如下&#xff1a; 我们不细究回溯和DFS的区别联系。关于这道题的2种写法&#xff0c;我把第一种称为回溯。 class Solution {List<List<Integer>> res new LinkedList&l…