爬取网易云音乐歌单名以及歌单标签
正则表达式
.
可以匹配任意字符,所以:要匹配变长的字符,在正则表达式中,用*
表示任意个字符(包括0个),用+
表示至少一个字符,用?
表示0个或1个字符,用{n}
表示n个字符,用{n,m}
表示n-m个字符。匹配特殊字符,如:要匹配 * 字符,请使用 \*。
步骤
- 1.打开网易云音乐,打开歌单列表:https://music.163.com/#/discover/playlist
- 2.按F12,进入开发者模式,点击Network,按F5刷新网页,出现以下界面
- 3.在右侧name列表下,找到playlist,从中可以找到各个歌单名以及歌单名的id(id是为了进入歌单的所在网址)
- 4.编写正则表达式,爬取歌单id
pat1 = r'playlist\?id=(\d*?)" class="t'
result_id = re.compile(pat1).findall(html) # 用正则表达式进行筛选id
- 5.用爬到的id编写歌单的网址,经发现,各个歌单的网址除了id部分,其余都是“https://music.163.com/#/playlist?id=”
- 6.进入歌单网址,同上述第二个步骤:按F12,进入开发者模式,点击Network,按F5刷新网页,出现以下界面,找到playlist?id=XXXXX。
- 7.编写正则表达式,提取标签,详情请看代码。
代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re
import urllib.request
import urllib.error
import urllib.parse
def get_all_hotSong(url):
header={ #请求头部
'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
request=urllib.request.Request(url=url, headers=header)
html=urllib.request.urlopen(request).read().decode('utf-8') #打开url
html=str(html) #转换成str
pat1 = r'playlist\?id=(\d*?)" class="t'
result_id = re.compile(pat1).findall(html) # 用正则表达式进行筛选id
print(result_id)
pat2=r'<a title="(.*?)" href="/playlist\?id=\d*?" class="t'
result_name = re.compile(pat2).findall(html) # 用正则表达式进行筛选歌单名字name
print(result_name)
return result_name,result_id
def get_Lables(url):
header={ #请求头部
'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=header)
html = urllib.request.urlopen(request).read().decode('utf-8') # 打开url
html = str(html) # 转换成str
print(url)
pat=r'<meta name="keywords" content="(.*?)" />\n<meta name="description"'
result_label = re.compile(pat).findall(html) # 用正则表达式进行筛选
print(result_label)
return result_label
fhandle = open('./labels.txt', 'a', encoding='utf-8') # 写入文件
for i in range(0,38):#(0,38)
n=35*i
url='https://music.163.com/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset='+str(n)
print(url)
name,id=get_all_hotSong(url) #获取所有歌单名称和id
num=0
for j in id: #遍历歌单
t_url='https://music.163.com/playlist?id='+j
label_=get_Lables(t_url) #['歌单名,创作者,标签1,标签2···']
ss=''.join(label_) #'歌单名,创作者,标签1,标签2···'
all=[]
all=ss.split(',') #切分字符串 ['歌单名','创作者','标签1','标签2',```]
print(all)
ns=name[num].count(',',0,len(name[num])) #歌单名中拥有的逗号的数量
print(ns)
x=0
while x<ns+1: #清除all里面的歌单名
t=all.pop(0)
#print(all.pop(0))
x+=1
t=all.pop(0) #清除all里面的创作者
print(all)
num+=1
ls1=[str(ii+' ') for ii in all]
ls2=''.join(ls1) #将歌单列表转化成字符串形式保存到文件中
print('ls1= ',end='')
print(ls1)
print(ls2)
fhandle.write(ls2+'\n')
fhandle.close() #关闭文件