python webscraping,spotifywebplayer,滚动到页面底部的问题

2024-04-25 22:32:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个python程序,当给它一个指向Spotify播放列表的链接时,它将返回一个曲目名列表。这就是我目前所拥有的。你知道吗

from bs4 import BeautifulSoup
from selenium import webdriver

url="https://open.spotify.com/playlist/1xXEN6UhQEMsVhX4KitlhW"
driver = webdriver.Firefox()
driver.get(url)

page = driver.page_source
page_soup = BeautifulSoup(page,'html.parser')

tracks = page_soup.findAll("div",{"class":"tracklist-name"})

print(tracks)
print(len(tracks))

driver.close()

然而,这只返回前100首歌曲。我发现在浏览器的开发者控制台中输入document.getElementsByClassName("tracklist-name")也只会返回前100首歌曲,除非我已经滚动到页面底部,所以我想先滚动到页面底部,但是window.scrollTo(0, document.body.scrollHeight)不起作用,因为播放列表不在主体中,页面的实际主体根本无法滚动(我不知道所有的技术术语,我是Javascript的新手)。你知道吗

那么,我该如何编写一个脚本,滚动到Spotify播放列表的底部,这样我就可以提取所有的歌曲,而不仅仅是前100首?你知道吗


Tags: namefromimporturldriverpage页面播放列表
2条回答

SpotifyAPI要求你注册一个许可证,这是一个有点过头了,只是一个小项目我的工作,但我已经设法博得这个脚本一起工作。如果有人在未来看到这个职位希望做一个类似的项目,我,请不要复制这个代码。太可怕了。你知道吗

import time
from selenium import webdriver

url="https://open.spotify.com/playlist/1xXEN6UhQEMsVhX4KitlhW"
driver = webdriver.Firefox()
driver.get(url)

cont = False
previousScrollHeight = 0

while cont == False:
    time.sleep(1)
    driver.execute_script("var HTMLCollection = document.getElementsByClassName('main-view-container__scroll-node'); var objDiv = HTMLCollection[0]; objDiv.scrollTop = objDiv.scrollHeight;")
    scrollTop = driver.execute_script("var HTMLCollection = document.getElementsByClassName('main-view-container__scroll-node'); var objDiv = HTMLCollection[0]; return objDiv.scrollTop;")

    time.sleep(1)
    scrollHeight = driver.execute_script("var HTMLCollection = document.getElementsByClassName('main-view-container__scroll-node'); var objDiv = HTMLCollection[0]; return objDiv.scrollHeight;")

    if previousScrollHeight == scrollHeight:
        cont = True

    previousScrollHeight = scrollHeight


tracks = driver.execute_script("obj = document.getElementsByClassName('tracklist-name'); var lst = []; for (var i = 0; i < obj.length; i++) { lst.push(obj[i].innerText) }; return lst;")
artists = driver.execute_script("obj = document.getElementsByClassName('TrackListRow__artists'); var lst = []; for (var i = 0; i < obj.length; i++) { lst.push(obj[i].innerText) }; return lst;")

driver.close()

zipped = zip(tracks, artists)
print(list(zipped))

这不是使用滚动的答案,但您可以直接从Spotify api获取数据:

https://developer.spotify.com/documentation/web-api/reference/playlists/get-playlists-tracks/

请注意,一次最多只能获取100个曲目标题,因此必须发出多个请求并使用offset参数。这也是为什么你的浏览器一次只能加载100首歌曲。你知道吗

相关问题 更多 >