为一线医护人员加油! 为武汉加油! 为中国加油! 为世界加油!
此爬虫是本人参考了了一位前辈的文章,并修改和优化了代码:
1.改为python3环境;
2.优化了抓取的歌曲时长中带一长串小数的问题;
3.优化了当作者为多个歌手时只能抓取一个歌手的问题;
环境:Ubuntu18.04、Python3.6.9、Google Chrome
python爬取网易云热歌榜歌曲信息(iframe框架内数据爬取,src为空)
思路分析
一、网易云热歌榜https://music.163.com/#/discover/toplist?id=3778678页面是采用嵌入内联框架的方式,若直接访问页面是访问不到iframe框架中歌曲信息数据的,也可用比较简单的方法selenium+chrome等工具进行实现。
二、内嵌的框架实际也是一个网页资源,我们找到它的链接,然后获取这一页面,就可以从中取数据。
需求分析
获取热歌榜上排名,歌名,时长,歌手,专辑,发行时间,其它备注信息
输出到icloud.log文件中
分析页面
打开chrome开发工具,打开热歌榜页面找到iframe元素,发现src为空,可以发现iframe中的内容是js生成的
因此,分析我们需要的api找到所需链接。选择Network,选择Doc,然后重新加载发现有两个文件。
分别在两个文件的response中CTRL+F搜索榜单上的 任意一首歌,发现在第二个文件中
右键这个文件选择copy/copy link address获取内嵌框架的链接。
用此链接另外打开一个页面后发现又跳回原来的页面,因此我们在原来的网页中的歌曲信息的地方右击查看框架的源代码,然后CTRL+F搜索后发现歌曲信息数据是以json的格式存在textarea标签下
使用json在线格式化网站分析这些json数据
获取成功
代码如下:
'''
网易云音乐热歌榜歌曲信息爬取
https://music.163.com/#/discover/toplist?id=377867
beautifulsoup的使用
环境python3.6.9
'''
import json
import sys
import time
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
def get_info(url):
response = requests.get(url=url,headers=headers)