本文使用到的工具是Selenium。简单的多Selenium就是一个web自动化测试工具,提供IDE以及插件多种方式。
本文的目标是使用Selenium抓取网易云音乐用户的所有时间的听歌排行。
下面结合代码解释:
from selenium import webdriver
import selenium.webdriver.support.ui as ui
# 存储为文本
def write2txt(data,path):
file = open(path,"w")
file.write(data)
file.close()
driver = webdriver.Chrome(executable_path='./drv/chromedriver')#chrome浏览器的驱动,下载链接:https://chromedriver.storage.googleapis.com/2.31/chromedriver_linux64.zip
driver.get("http://music.163.com/#/user/songs/rank?id=39686047")#需要抓取的用户链接,这里注意的是这里的id不是用户的id,而是用户听歌形成的所有时间排行的排行版的id
driver.switch_to.frame('g_iframe') # 从windows切换到frame,切换到歌曲列表所在的frame
data=''#用来保存数据
try:
wait = ui.WebDriverWait(driver, 15)
#找到歌曲列表所在的父标签
if wait.until(lambda driver: driver.find_element_by_class_name('g-bd')):
print('success!')
data+=driver.find_element_by_id('rHeader').find_element_by_tag_name('h4').text+'\n'
print(data)#抓取用户听了多少首歌
lists = driver.find_element_by_class_name('m-record').find_elements_by_tag_name('li')
print(len(lists))#网易只给出了前100首听的最频繁的歌
for l in lists:
temp='歌曲名:'+l.find_element_by_tag_name('b').text+' 歌手:'+l.find_element_by_class_name('s-fc8').text.replace('-','')+' 频率:'+l.find_element_by_class_name('bg').get_attribute('style')
print(temp)#解析出歌名 歌手 频率
data+=temp+'\n'
finally:
driver.quit()
write2txt(data,'./data/songs.txt')#保存文件中
执行完毕可以看到songs.txt文件的生成。
这里给出结果示例作为参考:
累积听歌4157首
歌曲名:为你我受冷风吹 歌手:林忆莲 频率:width: 100%;
歌曲名:演员 歌手:薛之谦 频率:width: 91%;
歌曲名:悟空 歌手:戴荃 频率:width: 78%;
歌曲名:一生中最爱 (Live) - live 歌手:陈奕迅 频率:width: 73%;
歌曲名:好久不见 歌手:陈奕迅 频率:width: 70%;
歌曲名:女儿情 歌手:万晓利 频率:width: 70%;
歌曲名:山丘 歌手:李宗盛 频率:width: 62%;
歌曲名:离人 歌手:张学友 频率:width: 60%;
歌曲名:董小姐 歌手:宋冬野 频率:width: 60%;
歌曲名:藏起来 歌手:倪安东 频率:width: 59%;
歌曲名:活着 歌手:郝云 频率:width: 57%;
歌曲名:Break Again(Original Mix) 歌手:Jack Howes 频率:width: 55%;
歌曲名:她说 歌手:林俊杰 频率:width: 55%;
歌曲名:天后 歌手:陈势安 频率:width: 55%;
歌曲名:追梦赤子心 歌手:GALA 频率:width: 55%;
歌曲名:红玫瑰(国) 歌手:陈奕迅 频率:width: 55%;
歌曲名:爱的勇气 歌手:曲婉婷 频率:width: 55%;
....