获取指定歌单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
:用于启动和控制浏览器。
Service
和GeckoDriverManager
:用于管理GeckoDriver,这是Firefox的WebDriver。
By
:用于定位元素,支持CSS选择器等方式。
设置Firefox浏览器选项
首先请确保在Firefox浏览器上,顺利完成的操作
firefox_options = Options() firefox_options.add_argument("--headless" )
无头模式意味着浏览器将以无界面的方式运行,这样不会占用屏幕空间。虽然通常在运行自动化测试时使用,但如果您希望查看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) 语句可以暂停程序执行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文件中
关闭浏览器
在所有操作完成后,关闭浏览器实例以释放资源。
确保代码在实际运行中能够顺利完成操作。
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 webdriverfrom selenium.webdriver.firefox.service import Servicefrom selenium.webdriver.firefox.options import Optionsfrom selenium.webdriver.common.by import Byfrom webdriver_manager.firefox import GeckoDriverManagerimport timefirefox_options = Options() firefox_options.add_argument("--headless" ) driver = webdriver.Firefox( service=Service(GeckoDriverManager().install()), options=firefox_options ) url = "https://y.qq.com/musicmac/v6/playlist/detail.html?id=7628192870" driver.get(url) time.sleep(5 ) 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} " ) song_list_text = "\n" .join(song_list) 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" )driver.quit()