获取指定歌单id的方法

首先,通常需要打开某个QQ音乐的歌单详情页面,然后获取到的数字,即可用于后续的操作,例如获取的歌曲信息,便于后续对数据进行处理。

示例

通常打开页面后:https://y.qq.com/musicmac/v6/playlist/detail.html?id=xxxxxxxx (id为获取到的QQ音乐歌单的数字)
可以获取到相关的歌曲信息。

注意事项

首先请确保在Firefox浏览器上,顺利完成的操作

安装相关库

可以使用python进行相关操作:

pip install selenium webdriver-manager

接下来主要用到的Python库和Selenium模块:

  • Options:用于设置Firefox的浏览器选项。
  • webdriver:用于启动和控制浏览器。
  • ServiceGeckoDriverManager:用于管理GeckoDriver,这是Firefox的WebDriver。
  • By:用于定位元素,支持CSS选择器等方式。

设置Firefox浏览器选项

首先请确保在Firefox浏览器上,顺利完成的操作

firefox_options = Options()
firefox_options.add_argument("--headless") # 启用无头模式运行Firefox浏览器

无头模式意味着浏览器将以无界面的方式运行,这样不会占用屏幕空间。虽然通常在运行自动化测试时使用,但如果您希望查看UI操作,可以关闭此选项。

启动Selenium WebDriver

driver = webdriver.Firefox(
service=Service(GeckoDriverManager().install()),
options=firefox_options
)

这里通过GeckoDriverManager自动下载和管理GeckoDriver,然后通过webdriver.Firefox启动一个新的Firefox浏览器实例。

打开指定网页

url = "https://y.qq.com/musicmac/v6/playlist/detail.html?id=7628192870"
driver.get(url)

url为获取到的链接。
通过driver.get(url)方法打开指定的QQ音乐歌单详情页面。

等待页面加载

time.sleep(5)

在代码中使用 time.sleep(5) 语句可以暂停程序执行5秒,这样可以确保页面加载完成。这样做的目的是为了避免因页面尚未加载而导致的错误和延迟。

获取歌曲信息

songs = driver.find_elements(By.CSS_SELECTOR, ".songlist__item")

通过CSS选择器.songlist__item获取页面中所有的歌曲信息,保存在songs列表中。

循环获取每首歌的信息

for song in songs:
song_name = song.find_element(By.CSS_SELECTOR, ".mod_songname__name").get_attribute('title') if song.find_element(By.CSS_SELECTOR, ".mod_songname__name") else "Unknown Song"
singer_name = song.find_element(By.CSS_SELECTOR, ".singer_name").get_attribute('title') if song.find_element(By.CSS_SELECTOR, ".singer_name") else "Unknown Singer"
album_name = song.find_element(By.CSS_SELECTOR, ".album_name").get_attribute('title') if song.find_element(By.CSS_SELECTOR, ".album_name") else "Unknown Album"
song_time = song.find_element(By.CSS_SELECTOR, ".songlist__time").text.strip() if song.find_element(By.CSS_SELECTOR, ".songlist__time") else "Unknown Time"

song_list.append(f"{song_name} - {singer_name} - {album_name} - {song_time}")

段代码循环获取每首歌曲的信息:

  • 歌曲名:.mod_songname__name
  • 歌手名:.singer_name
  • 专辑名:.album_name
  • 歌曲时长:.songlist__time
    获取到的信息之后添加到song_list列表中。

保存歌曲信息到文件

song_list_text = "\n".join(song_list)

with open('song_list.txt', 'w', encoding='utf-8') as file:
file.write(song_list_text)

最后将获取到的歌曲信息通过换行符连接后保存到song_list.txt文件中

关闭浏览器

driver.quit()

在所有操作完成后,关闭浏览器实例以释放资源。

确保代码在实际运行中能够顺利完成操作。

  • 如上方法只能在特定浏览器中实现。 -

3. 另一个选择

进入网站https://y.qq.com/musicmac/v6/playlist/detail.html?id=xxxxxxxx 在开发者控制台中执行以下JS代码可以直接获取歌单中的歌曲信息

function printSongList() {
console.log("Printing song list:");

const songList = Array.from(document.querySelectorAll(".songlist__item"))
.map((v) => {
const songName = v.querySelector(".mod_songname__name")?.title || "Unknown Song";
const singerName = v.querySelector(".singer_name")?.title || "Unknown Singer";
const albumName = v.querySelector(".album_name")?.title || "Unknown Album";
const songTime = v.querySelector(".songlist__time")?.textContent.trim() || "Unknown Time";
return `${songName} - ${singerName} - ${albumName} - ${songTime}`;
})
.reduce((s1, s2) => s1 + "\n" + s2, "");

console.log(songList);
}

// 调用函数
printSongList();

瀵煎嚭鎺у埗鍙板唴瀹癸紝鑾峰緱鏃ュ織鏂囦欢锛岀敤姝e垯琛ㄨ揪寮�(r"^\s*(.?)\s±\s+(.?)\s±\s+(.?)\s±\s+(.?)\s*$")鍖归厤姝屾洸淇℃伅鍗冲彲

完整代码如下

from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from webdriver_manager.firefox import GeckoDriverManager
import time

# Configure Firefox options
firefox_options = Options()
firefox_options.add_argument("--headless") # Run headless Firefox

# Set up the Selenium WebDriver
driver = webdriver.Firefox(
service=Service(GeckoDriverManager().install()),
options=firefox_options
)

# Open the webpage
url = "https://y.qq.com/musicmac/v6/playlist/detail.html?id=7628192870"
driver.get(url)

# Wait for content to load (adjust sleep time if necessary)
time.sleep(5)

# Extract song information
songs = driver.find_elements(By.CSS_SELECTOR, ".songlist__item")
song_list = []

for song in songs:
song_name = song.find_element(By.CSS_SELECTOR, ".mod_songname__name").get_attribute('title') if song.find_element(
By.CSS_SELECTOR, ".mod_songname__name") else "Unknown Song"
singer_name = song.find_element(By.CSS_SELECTOR, ".singer_name").get_attribute('title') if song.find_element(
By.CSS_SELECTOR, ".singer_name") else "Unknown Singer"
album_name = song.find_element(By.CSS_SELECTOR, ".album_name").get_attribute('title') if song.find_element(
By.CSS_SELECTOR, ".album_name") else "Unknown Album"
song_time = song.find_element(By.CSS_SELECTOR, ".songlist__time").text.strip() if song.find_element(By.CSS_SELECTOR,
".songlist__time") else "Unknown Time"

song_list.append(f"{song_name} - {singer_name} - {album_name} - {song_time}")

# Join all song information with newline
song_list_text = "\n".join(song_list)

# Save to a text file
with open('song_list.txt', 'w', encoding='utf-8') as file:
file.write(song_list_text)

print("Song list has been saved to song_list.txt")

# Close the browser
driver.quit()