网易云歌单信息爬取及数据分析(1)爬虫部分
爬虫思路:
网页分为两个部分,歌单广场和歌单详情页。总体思路是先从歌单广场获取所有的URL然后去详情页进行解析。
最后的数据大概这个样子:
歌单广场:
在广场中需要实现获取所有歌单详情页的URL链接。
研究URL不难发现这样的规律,改变cat可以换歌单的大分类(华语,流行,全部等),limit是每页显示35个歌单,这里是第二页所以offset是35*2=70。那么只需要采用for循环就可以。
右键打开检查我们可以发现关于歌单详情页URL就在a标签下面herf,之后beautifulsoup就可以获取,查看一下具体歌单详情页的URL确实是这样,只需要做一下字符串的拼接就可以了。
下面是代码:
import requests as rq
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import time
import concurrent.futures
from multiprocessing.dummy import Pool as pool
##后面所有的代码都是调的这些个库,我习惯写pd np因为懒。。。
list1=[]
headers = {'Referer': 'http://music.163.com/','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'}def getHTMLText(url,headers): #通用的获取网站内容的框架try:r = rq.get(url,headers=headers)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:return "网络解析错误"def get_url(cat):#获取首页该分类下面的歌单url,形成url_listdepth=38start_url='https://music.163.com/discover/playlist/?order=hot&cat='+catfor i in range(depth):try:url=start_url+'&limit=35'+'&offset='+str(35*(i+1))html=getHTMLText(url,headers)parse_main(html)except:print('失败')continuedef parse_main(html):#解析每个广场页,bs4弄出来歌单名,歌单URLsoup=BeautifulSoup(html,'html.parser')c=soup.find_all('li')for unit in c:try:name_url=unit.find('a',{'class':"tit f-thide s-fc0"})#m这里有URL,名字的信息number=eval(unit.find('span',{'class':'nb'}).text.replace('万','0000'))#这里获取的是播放量的信息,用于初步筛选list1=[name_url['title'].replace(u'\xa0', u' '),number,name_url['href']]url_list.append(list1)except:continue
弄出来list1大概这个样子:
[歌单名,播放次数,URL]
之后按照每个URL进入相应的详情页解析就可以了。
歌单详情页:
需要获取具体信息:
这里渴望拿到的是所属标签,播放次数,转发次数,收藏次数,评论量,歌单标题和歌单长度。他们的解析途径都差不多,都是beautifulsoup。我们可以看一个:
不难看到总共有两个属性,都在div标签下的a标签下的i,我们根据特征找到左右class为u-tag的标签然后弄出来它的text就行了。
tags=soup.find_all('a',{'class':'u-tag'})
##中间有省略
tag1=tags[0].text.replace(u'\xa0', u' ')
下面是具体代码:
finallist=[]
headers1={'Referer': 'http://music.163.com/','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}
def parse_single(listid):#进入歌单内部解析,获取播放量,收藏量,标签等信息global countcount+=1 singleurl='https://music.163.com'+listidsingletext=getHTMLText(singleurl,headers=headers1)soup=BeautifulSoup(singletext,'html.parser')play_count=eval(soup.find('strong',{'class':'s-fc6'}).text)fav=eval(soup.find('a',{'class':'u-btni u-btni-fav'}).i.text.strip('(').strip(')'))share=eval(soup.find('a',{'class':'u-btni u-btni-share'}).i.text.strip('(').strip(')'))comment=eval(soup.find('a',{'data-res-action':'comment'}).i.span.text)length=eval(soup.find('span',{'id':'playlist-track-count'}).text)date=soup.find('span',{'class':'time s-fc4'}).text[:10]name=soup.find('h2',{"class":'f-ff2 f-brk'}).text.replace(u'\xa0', u' ')try: tags=soup.find_all('a',{'class':'u-tag'})p=len(tags)if p==3:tag1=tags[0].text.replace(u'\xa0', u' ')tag2=tags[1].text.replace(u'\xa0', u' ')tag3=tags[2].text.replace(u'\xa0', u' ')elif p==2:tag1=tags[0].text.replace(u'\xa0', u' ')tag2=tags[1].text.replace(u'\xa0', u' ')tag3="nan"else :tag1=tags[0].text.replace(u'\xa0', u' ')tag2="nan"tag3="nan"list1=[name,date,play_count,fav,share,comment,length,tag1,tag2,tag3]finallist.append(list1)print('解析第{}个歌单成功'.format(count))except:tag1='nan'tag2='nan'tag3='nan'list1=[name,date,play_count,fav,share,comment,length,tag1,tag2,tag3]finallist.append(list1)print('解析第{}个歌单成功'.format(count))
整合
最后是我的main函数和多线程的使用当然这里你弄个列表个main函数传参也可以。
def main(type):get_url(type)print("歌单列表获取完成")print(url_list)main('轻音乐')
#这里需要自己改动标签(比如改为流行,华语等,下面存储同样改变)
a=pd.DataFrame(url_list)
b=list(a[2])
with concurrent.futures.ThreadPoolExecutor() as executor:executor.map(parse_single,b)
#多线程
print(finallist)
a=pd.DataFrame(finallist)
b=pd.DataFrame(url_list)
title_list=['名称','创建日期','播放次数','收藏量','转发量','评论数','歌单长度','tag1','tag2','tag3']
c=pd.Series(title_list)
a.columns=c
a.to_excel(r'C:\Users\Leo\Desktop\轻音乐.xlsx')
#数据输出到Excel
特别注意和解释
(1)headers很重要,并且广场和详情页的headers还不太一样,这个我捣鼓了好长时间,尽量还是都加相应页的headers。
(2)听从大佬的建议采用了多线程,用之前三秒钟爬出来一个,用之后不到一秒一个,很舒适。感觉这个操作计算和io都很密集,但是我没想到怎么同时使用多线程和多进程。(不明白的小伙伴可以看我的另外一个多线程多进程的博客)
-----后续数据分析请见下一篇-----
–本人准大二小白,欢迎dalao指教–
那路径啥的,自己看着调调吧。
最后附上全部代码:
import requests as rq
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import time
import concurrent.futures
from multiprocessing.dummy import Pool as poollimit=10000#热门歌单播放量筛选下限
headers = {'Referer': 'http://music.163.com/','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'}
headers1={'Referer': 'http://music.163.com/','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}
finallist=[]
url_list=[]
count=0
LABEL='轻音乐'def getHTMLText(url,headers): #通用的获取网站内容的框架try:r = rq.get(url,headers=headers)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:return "网络解析错误"def get_url(cat,depth):#获取首页该分类下面的歌单url,形成url_list#depth=1start_url='https://music.163.com/discover/playlist/?order=hot&cat='+catfor i in range(depth):try:url=start_url+'&limit=35'+'&offset='+str(35*(i+1))html=getHTMLText(url,headers)parse_main(html)except:print('失败')continuedef parse_main(html):#解析单个urlsoup=BeautifulSoup(html,'html.parser')c=soup.find_all('li')for unit in c:try:name_url=unit.find('a',{'class':"tit f-thide s-fc0"})#m这里有URL,名字的信息number=eval(unit.find('span',{'class':'nb'}).text.replace('万','0000'))#这里获取的是播放量的信息,用于初步筛选list1=[name_url['title'].replace(u'\xa0', u' '),number,name_url['href']]url_list.append(list1)except:continuedef parse_single(listid):#进入歌单内部解析,获取播放量,收藏量,标签等信息global countcount+=1#print(count)#print('\0')singleurl='https://music.163.com'+listid#print(singleurl)#print('\0')singletext=getHTMLText(singleurl,headers=headers1)#print("**")soup=BeautifulSoup(singletext,'html.parser')try:play_count=eval(soup.find('strong',{'class':'s-fc6'}).text)fav=soup.find('a',{'class':'u-btni u-btni-fav'}).i.text.strip('(').strip(')')if('万') in fav:fav=eval(fav.replace('万','0000'))share=eval(soup.find('a',{'class':'u-btni u-btni-share'}).i.text.strip('(').strip(')'))comment=eval(soup.find('a',{'data-res-action':'comment'}).i.span.text)length=eval(soup.find('span',{'id':'playlist-track-count'}).text)date=soup.find('span',{'class':'time s-fc4'}).text[:10]name=soup.find('h2',{"class":'f-ff2 f-brk'}).text.replace(u'\xa0', u' ') tags=soup.find_all('a',{'class':'u-tag'})p=len(tags)tag1='nan'tag2='nan'tag3='nan'if p>=1:tag1=tags[0].text.replace(u'\xa0', u' ')if p>=2:tag2=tags[1].text.replace(u'\xa0', u' ') if p==3:tag3=tags[2].text.replace(u'\xa0', u' ') list1=[name,date,play_count,fav,share,comment,length,tag1,tag2,tag3]finallist.append(list1)print('解析第{}个歌单成功'.format(count))except:print('解析第{}个歌单失败'.format(count))returndef main(type,depth=38):get_url(type,depth=depth)print("歌单列表获取完成")print(url_list)a=pd.DataFrame(url_list)b=list(a[2])with concurrent.futures.ThreadPoolExecutor() as executor:executor.map(parse_single,b)#多线程 print(finallist)a=pd.DataFrame(finallist)b=pd.DataFrame(url_list)title_list=['名称','创建日期','播放次数','收藏量','转发量','评论数','歌单长度','tag1','tag2','tag3']c=pd.Series(title_list)a.columns=ca.to_excel(r'C:\Users\Leo\Desktop\{}.xlsx'.format(type))#数据输出到Excelmain(LABEL,depth=1)
# depth就是总共爬取多少页的,打开网站可以发现每页上有30多个,总共有38页。
网易云歌单信息爬取及数据分析(1)爬虫部分相关推荐
- Python爬虫之网易云歌单音频爬取(解决urlretrieve爬取文件不能播放问题)
网易云歌单音频爬取 写在前面:最近学习爬虫,对小说和图片都进行过简单爬取,所以打算爬取音频,但是其中遇到点问题也解决了,写下博客记录并希望对大家也有帮助. 爬取对象:对于目前主流的几个音频播放网站,我 ...
- Python网易云音乐单曲爬取
Python网易云音乐单曲爬取 代码: import requests import osdef develop(path,url):song_url = urlsong_id = song_url[ ...
- webdriver爬取网易云歌单信息
import time from selenium import webdriverdriver = webdriver.Chrome()driver.get("https://music. ...
- 运用Python——爬取网易云歌单的全部歌曲热评_爬虫的简单应用
导航 ·运用Python--爬虫_网易云音乐热评 ·运用Python--游戏_四子棋_劳拉下棋 文章目录 导航 1.展示截图 2.代码 3.分析 常量的定义.界面设计 依次爬取歌曲信息 创建表格 爬取 ...
- python3爬取网易云歌单数据清洗_如何利用Python网络爬虫爬取网易云音乐歌词
赵雷的歌曲 本文以民谣歌神赵雷为数据采集对象,专门采集他的歌曲歌词,其他歌手的歌词采集方式可以类推,下图展示的是<成都>歌词. 赵雷歌曲---<成都> 一般来说,网页上显示的U ...
- 网易云音乐用户信息爬取以及可视化
选的课程方向是爬取网易云音乐某首歌曲的用户评论内容和评论时间,观察每天哪个时间段的评论信息最多,每周哪天的评论信息最多.然后分析该歌曲的用户性别分布和年龄分布.所以首先需要通过爬虫来爬取评论信息和用户 ...
- Python爬虫-selenium爬取网易云歌单
文章目录 (一)工欲善其事必先利其器-安装工具 Selenium 浏览器 (二)实战 (一)工欲善其事必先利其器-安装工具 Selenium Selenium是一个强大的网络数据采集工具,其最初是为网 ...
- python爬网易歌单_Python爬取网易云歌单
1. 关键点 使用单线程爬取,未登录,爬取网易云歌单主要有三个关键点: url为https://music.163.com/discover/playlist/?order=hot&cat=% ...
- Python爬虫实战: 爬取网易云歌单
这篇文章,我们就来讲讲怎样爬取网易云歌单,并将歌单按播放量进行排序,下面先上效果图 1.用 requests 爬取网易云歌单 打开 网易云音乐 歌单首页,不难发现这是一个静态网页,而且格式很有规律,爬 ...
最新文章
- 英语 常用表达方法搜集
- via logo html,HTML5 Audio Description (via screenreader)
- STM32 USART通信
- oracle有条件插入数据,Oracle有条件地插入数据
- 移动磁盘无法访问文件系统损坏资料找到的方案
- Mysql数据库更新操作导致死锁问题
- 以图搜图 图像匹配_百度识图:以图搜图找到相似图片原理分析
- Android Property服务
- 一文详解SLAM回环及优化
- 不管计算机专业大学生还是职场老手,除了代码之外程序员必备的软技能有哪些?
- nova与neutron交互
- Trinity进行转录组组装(2))
- 计算机网络三级考的是什么,三级网络技术都考什么东西?
- cad缩放_这个CAD缩放技巧太实用!
- 从Bold手环来谈谈无袖带血压计的技术
- 2014智联卓聘积分获取新攻略
- 编码器—解码器和注意力机制
- cuda、cudnn和pytorch下载与安装的经验
- 积木报表·JimuReport 1.3.64 版本发布,免费的企业级可视化报表工具
- python能做什么兼职-学会python可以做哪些兼职?
热门文章
- ElasticSearch(6.3.0)的配置和使用全过程
- 外贸找客户软件:Yellow Page Spider 8.7.1 Crack
- HTML5七夕情人节表白网页制作 (蓝色主题-樱花雨3D相册)HTML+CSS+JavaScript
- PaddleOCR报错Process finished with exit code
- linux函数参数的长度限制,关于命令行长度限制
- 华为P30和IphoneX性能比较
- ospf协议(包含负载分担)
- 校园网同时连手机和电脑、用数据线给电脑连网
- 算法分享: 动态规划之拱桥回文算法
- ProE5.0塑胶产品结构设计实例知识视频教程