第六十七期:Python爬虫44万条数据揭秘:如何成为网易音乐评论区的网红段子手

获取数据,其实逻辑并不复杂:爬取歌单列表里的所有歌单url、进入每篇歌单爬取所有歌曲url,去重、进入每首歌曲首页爬取热评,汇总。

作者:嗨学python来源:今日头条

 

获取数据

其实逻辑并不复杂:

  • 爬取歌单列表里的所有歌单url。
  • 进入每篇歌单爬取所有歌曲url,去重。
  • 进入每首歌曲首页爬取热评,汇总。

歌单列表是这样的:

翻页并观察它的url变化,注意下方动图,每次翻页末尾变化35。

采用requests+pyquery来爬取:

def get_list(): list1 = [] for i in range(0,1295,35): url = 'https://music.163.com/discover/playlist/?order=hot&cat=%E5%8D%8E%E8%AF%AD&limit=35&offset='+str(i) print('已成功采集%i页歌单\n' %(i/35+1)) data = [] html = restaurant(url) doc = pq(html) for i in range(1,36): # 一页35个歌单 a = doc('#m-pl-container > li:nth-child(' + str(i) +') > div > a').attr('href') a1 = 'https://music.163.com/api' + a.replace('?','/detail?') data.append(a1) list1.extend(data) time.sleep(5+random.random()) return list1 

这样我们就可以获得38页每页35篇歌单,共1300+篇歌单。

下面我们需要进入每篇歌单爬取所有歌曲url,并且要注意最后“去重”,不同歌单可能包含同一首歌曲。

点开一篇歌单,注意红色圈出的id。

观察一下,我们要在每篇歌单下方获取的信息也就是红框圈出的这些,利用刚刚爬取到的歌单id和网易云音乐的api可以构造出:

不方便看的话我们解析一下json。

  1. def get_playlist(url): data = [] doc = get_json(url) obj=json.loads(doc) jobs=obj['result']['tracks'] for job in jobs: dic = {} dic['name']=jsonpath.jsonpath(job,'$..name')[0] #歌曲名称 dic['id']=jsonpath.jsonpath(job,'$..id')[0] #歌曲ID data.append(dic) return data  

     

这样我们就获取了所有歌单下的歌曲,记得去重。

#去重 
data = data.drop_duplicates(subset=None, keep='first', inplace=True)  

剩下就是获取每首歌曲的热评了,与前面获取歌曲类似,也是根据api构造,很容易就找到了。

def get_comments(url,k): data = [] doc = get_json(url) obj=json.loads(doc) jobs=obj['hotComments'] for job in jobs: dic = {} dic['content']=jsonpath.jsonpath(job,'$..content')[0]  dic['time']= stampToTime(jsonpath.jsonpath(job,'$..time')[0]) dic['userId']=jsonpath.jsonpath(job['user'],'$..userId')[0] #用户ID dic['nickname']=jsonpath.jsonpath(job['user'],'$..nickname')[0]#用户名 dic['likedCount']=jsonpath.jsonpath(job,'$..likedCount')[0]  dic['name']= k data.append(dic) return data  
  1.  

汇总后就获得了44万条音乐热评数据。

数据分析

清洗填充一下。

def data_cleaning(data): cols = data.columns for col in cols: if data[col].dtype == 'object': data[col].fillna('缺失数据', inplace = True) else: data[col].fillna(0, inplace = True) return(data) 

按照点赞数排个序。

#排序 
df1['likedCount'] = df1['likedCount'].astype('int') 
df_2 = df1.sort_values(by="likedCount",ascending=False) 
df_2.head() 

再看看哪些热评是被复制粘贴搬来搬去的。

#排序 
df_line = df.groupby(['content']).count().reset_index().sort_values(by="name",ascending=False) 
df_line.head() 

第一个和第三个只是末尾有没有句号的区别,可以归为一类。这样的话,重复次数最多个这句话竟然重复了412次,额~~

看看上热评次数次数最多的是哪位大神?从他的身上我们能学到什么经验?

df_user = df.groupby(['userId']).count().reset_index().sort_values(by="name",ascending=False) 
df_user.head() 

按照 user_id 汇总一下,排序。

成功“捕获”一枚“段子手”,上热评次数高达347,我们再看看这位大神究竟都评论些什么?

df_user_max = df.loc[(df['userId'] == 101***770)] 
df_user_max.head() 

这位“失眠的陈先生”看来各种情话娴熟于手啊,下面就以他举例来看看如何成为网易云音乐评论里的热评段子手吧。

数据可视化

先看看这347条评论的赞数分布。

#赞数分布图 
import matplotlib.pyplot as plt 
data = df_user_max['likedCount'] 
#data.to_csv("df_user_max.csv", index_label="index_label",encoding='utf-8-sig') 
plt.hist(data,100,normed=True,facecolor='g',alpha=0.9) 
plt.show() 

很明显,赞数并不多,大部分都在500赞之内,几百赞却能跻身热评,这也侧面说明了这些歌曲是比较小众的,看来是经常在新歌区广撒网。

我们使用len() 求出每条评论的字符串长度,再画个分布图:

评论的字数集中在18—30字之间,这说明在留言时要注意字数,保险的做法是不要太长让人读不下去,也不要太短以免不够经典。

做个词云。

阅读目录(置顶)(长期更新计算机领域知识)https://blog.csdn.net/weixin_43392489/article/details/102380691

阅读目录(置顶)(长期更新计算机领域知识)https://blog.csdn.net/weixin_43392489/article/details/102380882

阅读目录(置顶)(长期科技领域知识)https://blog.csdn.net/weixin_43392489/article/details/102600114

 

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

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

相关文章

【小技巧】字符char与整型int的相互转换

char转int char与int的相互转化,联想ASCII码,字符‘0’对应的值为48,所以不能直接加减‘ ’ char ch9; int ch_intch-0;//此时ch_int9int转char int i9; char i_chi0;//此时i_ch9必须牢记的ASCII

第四十期:九个对Web开发者最有用的Python包,掌握这些,工资至少能涨涨

Matplotlib,正如其名称所暗示的那样,是一个用来绘制数学函数和模型的库;扩展了Numpy的作用,Matplotlib可以只用几行代码来创建图,条形图,散点图等诸多视觉表现。 作者:Python之眼来源:今日头条…

array专题9

新的一周,新的专题。array的中等难度的题目快要结束了。能感觉到进步,也依然能感觉到吃力。加油。 31 Next Permutation 思路:读懂了题意,知道是要求下一个排列数是什么。如果已经到最后一个了,那就返回最小的那个。…

[Leetcode][第214题][JAVA][最短回文串][KMP][RK]

【问题描述】[中等] 【解答思路】 1. 字符串哈希 复杂度 class Solution {public String shortestPalindrome(String s) {int n s.length();int base 131, mod 1000000007;int left 0, right 0, mul 1;int best -1;for (int i 0; i < n; i) {left (int) (((long)…

坏掉的项链Broken Necklace

题目描述 你有一条由N个红色的&#xff0c;白色的&#xff0c;或蓝色的珠子组成的项链(3<N<350)&#xff0c;珠子是随意安排的。 这里是 n29 的二个例子: 第一和第二个珠子在图片中已经被作记号。 图片 A 中的项链可以用下面的字符串表示&#xff1a; brbrrrbbbrrrrrbrrb…

[Leetcode][第557题][JAVA][反转字符串中的单词 III][遍历][String函数]

【问题描述】[简单] 【解答思路】 1. 遍历 开辟一个新字符串。然后从头到尾遍历原字符串&#xff0c;直到找到空格为止&#xff0c;此时找到了一个单词&#xff0c;并能得到单词的起止位置。随后&#xff0c;根据单词的起止位置&#xff0c;可以将该单词逆序放到新字符串当中…

第七十二期:爬虫爬的好,牢饭吃到饱?

前几天分享的一篇《只因写了一段爬虫&#xff0c;公司200多人被抓!》相信大家看了后都会发问&#xff0c;我只是个写爬虫的&#xff0c;跟我有什么关系?到底什么样的爬虫才不犯法?今天这篇会解答你所有的疑问。 作者&#xff1a;技术领导力 前几天分享的一篇爬虫被抓相信大…

如何在Swift中创建漂亮的iOS图表

通过图形和图表呈现数据是当今移动应用程序最显着的特征之一。iOS图表使应用程序看起来更漂亮&#xff0c;更有吸引力。 在本教程中&#xff0c;我们将向您展示如何使用代码示例在Swift中实现我们的iOS图表。我们将看一下Swift折线图&#xff0c;饼图以及条形图。 您可以找到许…

第七十四期:从bug看11种编程语言演化史,果然如今Python比较流行

在本文中&#xff0c;作者选择了 11 种非常流行的编程语言&#xff08;通过 Stack Overflow 标签出现的频率衡量&#xff09;&#xff0c;希望可以找出这些问题的共性及差异性。 作者&#xff1a;机器之心编译来源&#xff1a;机器之心 自 2008 年创办以来&#xff0c;Stack …

[Leetcode][第841题][JAVA][钥匙和房间][DFS][BFS]

【问题描述】[中等] 【解答思路】 当 xx 号房间中有 yy 号房间的钥匙时&#xff0c;我们就可以从 xx 号房间去往 yy 号房间。如果我们将这 nn 个房间看成有向图中的 nn 个节点&#xff0c;那么上述关系就可以看作是图中的 xx 号点到 yy 号点的一条有向边。 这样一来&#xff…

死磕 java同步系列之开篇

简介 同步系列&#xff0c;这是彤哥想了好久的名字&#xff0c;本来是准备写锁相关的内容&#xff0c;但是java中的CountDownLatch、Semaphore、CyclicBarrier这些类又不属于锁&#xff0c;它们和锁又有很多共同点&#xff0c;都是为了协同多线程的执行&#xff0c;都是一种同步…

第七十五期:Java 2019 生态圈使用报告,这结果你赞同吗?

这是国外一机构调查了 7000 名开发者得出来的 Java 2019 年生态圈工具使用报告&#xff0c;主要调查了 Java 版本、开发框架、web 服务器等使用情况。 作者&#xff1a;平头哥来源 这是国外一机构调查了 7000 名开发者得出来的 Java 2019 年生态圈工具使用报告&#xff0c;主…

[Leetcode][第486题][JAVA][预测赢家][动态规划][递归]

【问题描述】[中等] 【解答思路】 1.递归 复杂度 class Solution {public boolean PredictTheWinner(int[] nums) {return total(nums,0,nums.length-1,1) >0;}//turn 标记轮到谁了 正数表示先手 负数表示后手 public int total( int[]nums ,int start,int end,int tur…

linux-2.6.38 input子系统(用输入子系统实现按键操作)

一、设备驱动程序 在上一篇随笔中已经分析&#xff0c;linux输入子系统分为设备驱动层、核心层和事件层。要利用linux内核中自带的输入子系统实现一个某个设备的操作&#xff0c;我们一般只需要完成驱动层的程序即可&#xff0c;核心层和事件层内核已经帮我们做好了。因此这篇随…

LinkedList专题2

203 Remove Linked List Elements 思路&#xff1a;考虑1 &#xff1a; 可能有多个节点符合&#xff1b;考虑2&#xff1a;命中节点是head&#xff1b;考虑3&#xff1a;命中节点是尾节点&#xff1b;考虑4&#xff1a;命中节点是中间的普通节点。 学习1&#xff1a;在linked…

第四十一期:一道经典的MySQL面试题,答案出现三次反转

前几天偶然看到大家在讨论一道面试题&#xff0c;而且答案也不够统一&#xff0c;我感觉蛮有意思&#xff0c;在此就做一个解读&#xff0c;整个过程中确实会有几处反转。 作者&#xff1a;杨建荣的学习笔记来源&#xff1a;今日头条 前几天偶然看到大家在讨论一道面试题&…

java面试题1 牛客:A派生出子类B,B派生出子类C,并且在java源代码中有如下声明:

懵逼树上懵逼果&#xff0c;懵逼树下你和我 第一题 [单选题] A派生出子类B&#xff0c;B派生出子类C&#xff0c;并且在java源代码中有如下声明&#xff1a; 1 2 3 A a0new A(); A a1new B(); A a2new C(); 以哪个说法是正确的 A第1行&#xff0c;第2行和第3行的声明都是正…

[Leetcode][第81题][JAVA][N皇后问题][回溯算法]

【问题描述】[困难] 【解答思路】 1. 主副对角线列 标记 复杂度 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {private int n;// 记录某一列是否放置了皇后private boolean[] col;// 记…

[Leetcode][第257题][JAVA][二叉树的所有路径][BFS][DFS]

【问题描述】[简单] 【解答思路】 1. DFS 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(N^2) class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> paths new ArrayList<String>();constructPaths(root, "…

Depth-first Search深度优先搜索专题1

104. Maximum Depth of Binary Tree 思路&#xff1a;顺着树的一个分支一直数层数直到叶子节点。DFS的思路。这个题目可以练习的是递归转迭代。 代码 695. Max Area of Island 思路&#xff1a;遇到点i,j;如果grid[i][j]没有被访问过&#xff0c;并且等于1&#xff0c;那么…