翻页爬取网易云音乐歌单作者和标题
案例目的:
通过翻页selenium操作网易云音乐,介绍如何切换iframe框架以及如何使用selenium定位数据所在的节点。
代码功能:
输入下载的数据页数,自动获取歌单中歌曲名称以及作者
找到目标的url:
右键检查,找到歌单中歌曲名称和作者所在的节点位置:
通过节点位置,我们可以得到数据的xpath语法:
但是,注意,我们需要的歌单名称和作者是在iframe框架的。意思也就是他们采用的是网页套网页的方式。
因此,我们需要切换到iframe框架下才能提取到目标数据。如下图:
最后,翻页操作:
方法一:通过定义"下一页"所在的节点,模拟点击,进行翻页
方法二:通过找到url的规律实现翻页
这里我们使用方法二,通过寻找url的规律实现翻页操作
对比前三页的url:
/#/discover/playlist/order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0/#/discover/playlist/order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=35/#/discover/playlist/order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=70
由上图,可得到url规律在于offset参数。
分析完毕,上代码:
from selenium.webdriver import Chromeimport jsonif __name__ == '__main__':# 输入要爬取的页数pages = int(input('请输入要爬取的页数:'))# 创建浏览器对象(打开浏览器)chrome = Chrome()# 在网址栏输入目标的url打开网页song_list = []author_list = []for i in range(pages):offset = i*35chrome.get(f'/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset={offset}')# 注意:需要先切换框架chrome.switch_to.frame('g_iframe')# 通过xpath语法定位歌单名称和作者所在的位置nodes = chrome.find_elements_by_xpath('//ul[@id="m-pl-container"]/li')for node in nodes:song_name = node.find_element_by_xpath("./p[1]/a").textauthor_name = node.find_element_by_xpath("./p[2]/a").textsong_list.append(song_name)author_list.append(author_name)for i in range(len(song_list)):dict_ = {}dict_[song_list[i]] = author_list[i]# 将数据转换成json格式json_data = json.dumps(dict_,ensure_ascii=False)+',\n'# 将数据保存到本地with open('网易云歌单信息.json','a',encoding='utf-8')as f:f.write(json_data)
我爬取了两页(每一页对应35个数据)