Python爬取全民k歌

前言

总有一些人的声音,你永远忘不掉

正文

有听她唱的歌写作业的习惯,前几天在下了一个全民k歌PC版,发现不能连续播放,那给我气啊。。。于是去官网游了一遍没发现啥,但是发现了歌曲的分享链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CTPpctef-1597403713289)(https://i.loli.net/2020/08/14/5V4G9dPLbmKuzOq.png)]

浏览器访问,Network发现一个Response Header中Content-Type为audio/mp4,再看Request Url的Get参数,发现其中有一个名为fname的变量,不难想到它就是file name,那么其值就是歌曲文件的文件名了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MU3CgYbj-1597403621369)(https://i.loli.net/2020/08/14/SViGmOQyPesnjfp.png)]

Elements

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HrxfpQrj-1597403621373)(https://i.loli.net/2020/08/14/zBZpwT8ScOmnE7l.png)]

发现了audio标签,src就是刚才的m4a文件,下载下来就是我要的她唱的歌

那么脚本的思路很清晰了:

  1. 获取html
  2. 获取src
  3. 下载m4a

最开始我用的是urllib获取html,后来发现html中没有audio标签

image.png

我在浏览器中禁用JavaScript

image.png

发现页面不播放音乐,同样没有audio标签,页面许多元素消失,所以应该是JavaScript渲染。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jc1nIGDt-1597403621380)(https://i.loli.net/2020/08/14/BZW8zDJi1QEVyw2.png)]

本来想用selenium,但是我的Chrome更新之后没更新驱动,Google一番发现了名为pyppeteer的module,pip安装之后看了一下文档,是异步。

用pyppeteer获取html:

async def getContent(url):
	browser = await launch()
	page = await browser.newPage()
	await page.setJavaScriptEnabled(enabled=True)
	await page.goto(url)

	log("+", "Get content from " + url)
	content = await page.content()
	await browser.close()
	return content

解析html(我用的是bs4),并下载歌曲

def DownloadM4a(url):
	'''
	Download .M4a from share link
	'''
	loop = asyncio.get_event_loop()
	task = asyncio.ensure_future(getContent(url))
	loop.run_until_complete(task)
	soup = BeautifulSoup(task.result(),"html.parser")

	singer = soup.find(name = 'a', attrs = { 'class': 'singer_user__name' }).get_text()
	singer = singer.replace(" ","").replace('\n',"")
	mdir = os.getcwd() 
	path = mdir + "\\Music\\"
	if not os.path.exists(path):
		log("+", "Create a new folder named 'Music'") 
		os.mkdir(path)
	path += singer + "\\"
	if not os.path.exists(path):
		log("+","Create a new folder for singer named " + singer)
		os.mkdir(path)

	name = soup.audio['meta'] + ".m4a"
	uri = soup.audio['src']

	#Download
	if os.path.exists(path + name):
		log("-", " The music which is " + name + " has existed")
		exit(1)

	log("+","Downloading " + name + " from " + uri + " into " + path)
	music = requests.get(uri)
	with open(path + name, 'wb') as fp:
		fp.write(music.content)

因为她唱的歌也不是一两首,所以一首一首下还是很麻烦,毕竟我这么 的人(bushi,逃)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eoctG8sa-1597403621381)(https://i.loli.net/2020/08/14/s7zIangJxK4Hy1M.png)]

所以我又去访问了她的主页,f12

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPZobSlB-1597403621383)(https://i.loli.net/2020/08/14/drCE61K89siuHh2.png)]

发现了一个ul,ul标签下就有各歌曲的class为mod_playlist__cover的a链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YaizvvfF-1597403621384)(https://i.loli.net/2020/08/14/FhQEa2167ysHwK8.png)]

我还发现了查看更多的a标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bDNmnmav-1597403621385)(https://i.loli.net/2020/08/14/hpOjwEnVRfPGlDt.png)]

但是点击之后服务器返回的数组为空

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7inxjEG-1597403621386)(https://i.loli.net/2020/08/14/GV5ADoH1rSP9R8K.png)]

我一开始以为是游客身份访问的缘故,但是我登录之后还是无济于事。后来在移动端试了才发现原来是urlScheme,引导打开全民k歌

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFhZ0gDT-1597403621387)(https://i.loli.net/2020/08/14/AqI6aveQ4LDlZ5W.png)]

气人!没办法,只能先下载主页的8首歌曲了

def DownloadM4aEx(url):
	'''
	Download .M4a from user`s index
	'''
	loop = asyncio.get_event_loop()
	task = asyncio.ensure_future(getContent(url))
	loop.run_until_complete(task)
	soup = BeautifulSoup(task.result(),"html.parser")
	
	links = soup.findAll(name = 'a', attrs = { 'class': 'mod_playlist__cover'})
	for link in links: 
		DownloadM4a(link['href'])

根据主页连接和分享连接的参数,区分一下

def main(url):
	if url:
		if "personal?uid=" in url:
			try:
				DownloadM4aEx(url)
			except Exception as e:
				log("-", str(e))
		elif "play?s=" in url:
			try:
				DownloadM4a(url)
			except Exception as e:
				log("-", str(e))

试试效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wgGwxYy-1597403621388)(https://i.loli.net/2020/08/14/uGrTQHLyI1WF37z.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMI2858W-1597403621389)(https://i.loli.net/2020/08/14/RGSQrvB63iDuM7z.png)]

Github

源码尽在Github

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正崽不emo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值