换个平台,爬歌深夜网抑云平台的歌单的相关信息,关于作者、歌名、链接等信息。
打开网抑云平台的歌单,复制这个歌单的网页地址。输入到我下面写的程序里,然后执行程序,就OK了。如下图所示:
代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 播放歌单的网页地址 比如:https://music.163.com/#/playlist?id=26467411
video_url = ''
# 创建一个对象实例,用来表示用哪个浏览器爬取
driver = webdriver.Firefox()
# 某个歌单的地址
driver.get(video_url)
# 等待一下,等打开网页
time.sleep(5)
music_url_list = []
music_title_list = []
music_artist_list = []
# 先加载框架,否则下面的代码无法获取内容
driver.switch_to.frame(driver.find_element(by=By.ID, value='g_iframe'))
以上代码,基本上都是爬虫的基本套路,可以看看我之前写的爬虫教程就明白了。
主要是最后一行代码需要解释一下,以前没有遇到过:
这段代码的作用是在 Selenium 中切换到一个特定的 HTML iframe(内联框架)元素中。以下是对这段代码的详细解释:
driver.switch_to.frame(): 这是 Selenium 提供的一个方法,用于切换当前操作的上下文到指定的 iframe 元素中。在网页中,iframe 是一种常用的嵌入其他网页内容的技术,它可以在一个网页内部显示另一个网页的内容。
driver.find_element(by=By.ID, value='g_iframe'): 这段代码使用 find_element() 方法来查找具有给定 ID 的 HTML 元素。在这个例子中,我们通过 By.ID 参数指定查找方式为 ID,然后通过 value='g_iframe' 指定了要查找的元素 ID 为 "g_iframe"。
整个语句 driver.switch_to.frame(driver.find_element(by=By.ID, value='g_iframe')) 的作用是:首先找到 ID 为 "g_iframe" 的 iframe 元素,然后将 Selenium 的操作上下文切换到这个 iframe 中。这样,后续的 Selenium 操作(如查找元素、点击按钮等)就会在这个 iframe 范围内进行,而不是在主页面上。
之所以需要这样做,是因为在某些情况下,网页中的某些元素(如按钮、链接等)可能存在于 iframe 中,而不在主页面上。如果不先切换到对应的 iframe,Selenium 将无法找到或操作这些元素。因此,这段代码是确保后续操作能够正确执行的重要步骤。
代码如下:
# 获取歌名和链接相关信息
music_list = driver.find_elements(by=By.CSS_SELECTOR, value='.txt a')
# 遍历获取到的所有信息
for music in music_list:
# 获取其中的歌名和链接
music_url = music.get_attribute('href')
music_title = music.find_element(by=By.TAG_NAME, value='b').get_attribute('title')
# 将歌曲名字列表中的\xa0 换成空格
for i in range(len(music_title_list)):
music_title_list[i] = music_title_list[i].replace('\xa0', ' ')
# 将信息添加到列表中
music_url_list.append(music_url)
music_title_list.append(music_title)
代码如下:
# 获取所有的歌曲的作者
music_artists = driver.find_elements(by=By.CSS_SELECTOR, value='.text')
# 遍历获取到的所有信息
for music_artist in music_artists:
# 获取其中作者的名字
music_artis = music_artist.get_attribute('title')
if music_artis:
# 将作者的名字添加到列表中
music_artist_list.append(music_artis)
基本上就是重复上一节的步骤。
代码如下:
# 将每首歌的以上信息一一对应起来
i = 0
while i < len(music_url_list):
song_info = f'歌曲名称:{music_title_list[i]} 歌曲作者:{music_artist_list[i]} 歌曲链接:{music_url_list[i]}'
print(song_info)
i += 1
with open('music.txt', 'a', encoding='utf-8') as f:
f.write(song_info + '\n')
一个简单的一边遍历一边保存的操作。