❤️大佬都在学什么?Python爬虫分析C站大佬收藏夹,跟着大佬一起学,你就是下一个大佬❤️!

  • 前言
  • 程序说明
  • 数据爬取
    • 获取 CSDN 作者总榜数据
    • 获取收藏夹列表
    • 获取收藏数据
    • 爬虫程序完整代码
    • 爬取数据结果
  • 数据分析及可视化

前言

计算机行业的发展太快了,有时候几天不学习,就被时代所抛弃了,因此对于我们程序员而言,最重要的就是要时刻紧跟业界动态变化,学习新的技术,但是很多时候我们又不知道学什么好,万一学的新技术并不会被广泛使用,太小众了对学习工作也帮助不大,这时候我们就想要知道大佬们都在学什么了,跟着大佬学习走弯路的概率就小很多了。现在就让我们看看C站大佬们平时都收藏了什么,大佬学什么跟着大佬的脚步就好了!

程序说明

通过爬取 “CSDN” 获取全站排名靠前的博主的公开收藏夹,写入 csv 文件中,根据所获取数据分析领域大佬们的学习趋势,并通过可视化的方式进行展示。

数据爬取

使用 requests 库请求网页信息,使用 BeautifulSoup4json 库解析网页。

获取 CSDN 作者总榜数据

首先,我们需要获取 CSDN 中在榜的大佬,获取他/她们的相关信息。由于数据是动态加载的(关于动态加载的更多说明,可以参考博文《渣男,你为什么有这么多小姐姐的照片?因为我Python爬虫学的好啊❤️!》),因此使用开发者工具,在网络选项卡中可以找到请求的 JSON 数据:


观察请求链接:

https://blog.csdn.net/phoenix/web/blog/all-rank?page=0&pageSize=20
https://blog.csdn.net/phoenix/web/blog/all-rank?page=1&pageSize=20
...

可以发现每次请求 JSON 数据时,会获取20个数据,为了获取排名前100的大佬数据,使用如下方式构造请求:

url_rank_pattern = "https://blog.csdn.net/phoenix/web/blog/all-rank?page={}&pageSize=20"for i in range(5):url = url_rank_pattern.format(i)#声明网页编码方式response = requests.get(url=url, headers=headers)response.encoding = 'utf-8'response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')

请求得到 Json 数据后,使用 json 模块解析数据(当然也可以使用 re 模块,根据自己的喜好选择就好了),获取用户信息,从需求上讲,这里仅需要用户 userName,因此仅解析 userName 信息,也可以根据需求获取其他信息:

userNames = []
information = json.loads(str(soup))
for j in information['data']['allRankListItem']:# 获取id信息userNames.append(j['userName'])

获取收藏夹列表

获取到大佬的 userName 信息后,通过主页来观察收藏夹列表的请求方式,本文以自己的主页为例(给自己推广一波),分析方法与上一步类似,在主页中切换到“收藏”选项卡,同样利用开发者工具的网络选项卡:


观察请求收藏夹列表的地址:

https://blog.csdn.net/community/home-api/v1/get-favorites-created-list?page=1&size=20&noMore=false&blogUsername=LOVEmy134611

可以看到这里我们上一步获取的 userName 就用上了,可以通过替换 blogUsername 的值来获取列表中大佬的收藏夹列表,同样当收藏夹数量大于20时,可以通过修改 page 值来获取所有收藏夹列表:

collections = "https://blog.csdn.net/community/home-api/v1/get-favorites-created-list?page=1&size=20&noMore=false&blogUsername={}"
for userName in userNames:url = collections.format(userName)#声明网页编码方式response = requests.get(url=url, headers=headers)response.encoding = 'utf-8'response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')

请求得到 Json 数据后,使用 json 模块解析数据,获取收藏夹信息,从需求上讲,这里仅需要收藏夹 id,因此仅解析 id 信息,也可以根据需求获取其他信息(例如可以获取关注人数等信息,找到最受欢迎的收藏夹):

file_id_list = []
information = json.loads(str(soup))
# 获取收藏夹总数
collection_number = information['data']['total']
# 获取收藏夹id
for j in information['data']['list']:file_id_list.append(j['id'])

这里大家可能会问,现在 CSDN 不是有新旧两种主页么,请求方式能一样么?答案是:不一样,在浏览器端进行访问时,旧版本使用了不同的请求接口,但是我们同样可以使用新版本的请求方式来进行获取,因此就不必区分新、旧版本的请求接口了,获取收藏数据时情况也是一样的。

获取收藏数据

最后,单击收藏夹展开按钮,就可以看到收藏夹中的内容了,然后同样利用开发者工具的网络选项卡进行分析:


观察请求收藏夹的地址:

https://blog.csdn.net/community/home-api/v1/get-favorites-item-list?blogUsername=LOVEmy134611&folderId=9406232&page=1&pageSize=200

可以看到刚刚获取的用户 userName 和收藏夹 id 就可以构造请求获取收藏夹中的收藏信息了:

file_url = "https://blog.csdn.net/community/home-api/v1/get-favorites-item-list?blogUsername={}&folderId={}&page=1&pageSize=200"
for file_id in file_id_list:url = file_url.format(userName,file_id)#声明网页编码方式response = requests.get(url=url, headers=headers)response.encoding = 'utf-8'response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')

最后用 re 模块解析:

    user = user_dict[userName]user = preprocess(user)# 标题title_list  = analysis(r'"title":"(.*?)",', str(soup))# 链接url_list = analysis(r'"url":"(.*?)"', str(soup))# 作者nickname_list = analysis(r'"nickname":"(.*?)",', str(soup))# 收藏日期date_list = analysis(r'"dateTime":"(.*?)",', str(soup))for i in range(len(title_list)):title = preprocess(title_list[i])url = preprocess(url_list[i])nickname = preprocess(nickname_list[i])date = preprocess(date_list[i])

爬虫程序完整代码

import time
import requests
from bs4 import BeautifulSoup
import os
import json
import re
import csvif not os.path.exists("col_infor.csv"):#创建存储csv文件存储数据file = open('col_infor.csv', "w", encoding="utf-8-sig",newline='')csv_head = csv.writer(file)#表头header = ['userName','title','url','anthor','date']csv_head.writerow(header)file.close()headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}def preprocess(string):return string.replace(',',' ')url_rank_pattern = "https://blog.csdn.net/phoenix/web/blog/all-rank?page={}&pageSize=20"userNames = []
user_dict = {}
for i in range(5):url = url_rank_pattern.format(i)#声明网页编码方式response = requests.get(url=url, headers=headers)response.encoding = 'utf-8'response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')information = json.loads(str(soup))for j in information['data']['allRankListItem']:# 获取id信息userNames.append(j['userName'])user_dict[j['userName']] = j['nickName']def get_col_list(page,userName):collections = "https://blog.csdn.net/community/home-api/v1/get-favorites-created-list?page={}&size=20&noMore=false&blogUsername={}"url = collections.format(page,userName)#声明网页编码方式response = requests.get(url=url, headers=headers)response.encoding = 'utf-8'response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')information = json.loads(str(soup))return informationdef analysis(item,results):pattern = re.compile(item, re.I|re.M)result_list = pattern.findall(results)return result_listdef get_col(userName, file_id, col_page):file_url = "https://blog.csdn.net/community/home-api/v1/get-favorites-item-list?blogUsername={}&folderId={}&page={}&pageSize=200"url = file_url.format(userName,file_id, col_page)#声明网页编码方式response = requests.get(url=url, headers=headers)response.encoding = 'utf-8'response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')user = user_dict[userName]user = preprocess(user)# 标题title_list  = analysis(r'"title":"(.*?)",', str(soup))# 链接url_list = analysis(r'"url":"(.*?)"', str(soup))# 作者nickname_list = analysis(r'"nickname":"(.*?)",', str(soup))# 收藏日期date_list = analysis(r'"dateTime":"(.*?)",', str(soup))for i in range(len(title_list)):title = preprocess(title_list[i])url = preprocess(url_list[i])nickname = preprocess(nickname_list[i])date = preprocess(date_list[i])if title and url and nickname and date:with open('col_infor.csv', 'a+', encoding='utf-8-sig') as f:f.write(user + ',' + title + ',' + url + ',' + nickname + ',' + date  + '\n')return informationfor userName in userNames:page = 1file_id_list = []information = get_col_list(page, userName)# 获取收藏夹总数collection_number = information['data']['total']# 获取收藏夹idfor j in information['data']['list']:file_id_list.append(j['id'])while collection_number > 20:page = page + 1collection_number = collection_number - 20information = get_col_list(page, userName)# 获取收藏夹idfor j in information['data']['list']:file_id_list.append(j['id'])collection_number = 0# 获取收藏信息for file_id in file_id_list:col_page = 1information = get_col(userName, file_id, col_page)number_col = information['data']['total']while number_col > 200:col_page = col_page + 1number_col = number_col - 200get_col(userName, file_id, col_page)number_col = 0

爬取数据结果

展示部分爬取结果:

数据分析及可视化

最后使用 wordcloud 库,绘制词云展示大佬收藏。

from os import path
from PIL import Image
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud, STOPWORDS
import pandas as pd
import matplotlib.ticker as ticker
import numpy as np
import math
import redf = pd.read_csv('col_infor.csv', encoding='utf-8-sig',usecols=['userName','title','url','anthor','date'])place_array = df['title'].values
place_list = ','.join(place_array)
with open('text.txt','a+') as f:f.writelines(place_list)###当前文件路径
d = path.dirname(__file__)# Read the whole text.
file = open(path.join(d, 'text.txt')).read()
##进行分词
#停用词
stopwords = ["的","与","和","建议","收藏","使用","了","实现","我","中","你","在","之"]
text_split = jieba.cut(file)  # 未去掉停用词的分词结果   list类型#去掉停用词的分词结果  list类型
text_split_no = []
for word in text_split:if word not in stopwords:text_split_no.append(word)
#print(text_split_no)text =' '.join(text_split_no)
#背景图片
picture_mask = np.array(Image.open(path.join(d, "path.jpg")))
stopwords = set(STOPWORDS)
stopwords.add("said")
wc = WordCloud(  #设置字体,指定字体路径font_path=r'C:\Windows\Fonts\simsun.ttc', # font_path=r'/usr/share/fonts/wps-office/simsun.ttc', background_color="white",   max_words=2000,   mask=picture_mask,  stopwords=stopwords)
# 生成词云
wc.generate(text)# 存储图片
wc.to_file(path.join(d, "result.jpg"))

❤️大佬都在学什么?Python爬虫分析C站大佬收藏夹,跟着大佬一起学, 你就是下一个大佬❤️!相关推荐

  1. Python爬虫分析——B站UP主视频数据分析

    背景 一个朋友的要求,对B站UP主的视频进行分析.至于要做什么,你懂的. 核心 使用B站提供的API,爬取数据,进行分析.具体B站提供的API就不说了,https://www.bilibili.com ...

  2. 手把手教你利用 python 爬虫分析基金、股票

    手把手教你利用 python 爬虫分析基金.股票 文章目录 手把手教你利用 python 爬虫分析基金.股票 第一步:基金数据爬取 第二步:股票增持计算 第三步:好股基金选取 桌面程序 exe 从前大 ...

  3. 熬夜整理出了70个清华大佬都在用的Python经典练手项目【附源码】

    我们都知道,不管学习那门语言最终都要做出实际的东西来,而对于编程而言,这个实际的东西当然就是项目啦,不用我多说大家都知道学编程语言做项目的重要性. 于是,小编熬了几个通宵,终于整理出了70个清华大佬都 ...

  4. 小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城-Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫:- 定义调度器- 定 ...

  6. 学python买什么书-Python爬虫入门看什么书好 小编教你学Python

    Python爬虫入门看什么书好 小编教你学Python 时间:2018-01-12     来源:Python爬虫入门讲解 生活在21世纪的互联网时代,各类技术的发展可谓是瞬息万变,这不今天编程界又出 ...

  7. Python 爬虫分析豆瓣 TOP250 之 信息字典 和 马斯洛的锥子

    问题 本文是对<Python 爬虫分析豆瓣 TOP250 告诉你程序员业余该看什么书?> 一文的补充 我们以<追风少年>为例 用chrome的developer tool查看源 ...

  8. 天津python培训,学完Python爬虫能找什么样的工作?

    Python被广泛认为是初学者最容易学习的编程语言之一,也是使用最广泛的一种编程语言.所以python找工作也就容易了很多.那学完python爬虫到底能找什么样的工作呢.诚筑说的小编今天就简单告诉你p ...

  9. Python爬虫是个啥?学了Python爬虫有什么用?

    什么是Python爬虫 Python爬虫即使用Python程序开发的网络爬虫(网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.爬虫指一段自动抓取互联网信息的程序,从互 ...

最新文章

  1. 算术平均值滤波matlab程序,基于S7-1200 AD采样的高效数字滤波算法的设计与实践...
  2. 数组实现栈,实现push,pop,size方法 -- 面试算法
  3. ​Spring事务的传播行为案例分析
  4. GitHub 上 57 款最流行的开源深度学习项目【转】
  5. node mysql 连接池创建_Node.js使用MySQL连接池的方法实例
  6. Silverlight:CreateFromXAMLDownloader
  7. js中的数组基本知识
  8. 谷歌修复又一枚遭在野利用的 Chrome 0day
  9. ArcGIS10.6使用ArcGIS Diagrammer
  10. Kotlint集合简单总结
  11. linux 为动态分配的Virtualbox虚拟硬盘扩容
  12. 视频教程-思科网络工程师CCNP高级交换技术-网络技术
  13. 开源Java CMS建站程序推荐
  14. oracle自增序列带字母,[原创]Oracle自增序列
  15. 爆料!滴滴或于4-5月开启第二轮裁员,内部员工透露细节:或无赔偿!
  16. 社群运营中KOL的作用
  17. 我的世界java白天_我的世界怎么设置游戏内的时间为白天
  18. 刘强东怼天猫,是在陈述事实还是另有深意?
  19. 不要去外包亲身经历告诉你 去外包的后果
  20. 名人投资加密货币:推动行业发展的重要力量(连载:四)

热门文章

  1. 文件不存在的话创建文件 文件上传所遇到的问题、
  2. 泛型ListT排序(利用反射)
  3. 一、node.js的windows环境设置
  4. 健康窈窕美女第一课 减肥vs早餐四个关键问题。
  5. 以命令行的格式读取音频文件信息,并将读取的内容写到输出文件中
  6. [转载] Go语言的自重写程序
  7. verilog之按键消抖的理解
  8. 使用 RemObjects SDK 建立 WebService 应用
  9. 【CSAPP笔记】11. 存储器层次结构
  10. Struts2学习笔记 - Action篇定义逻辑Action