繁体   English   中英

Python 网页抓取、Spotify 网络播放器、滚动到页面底部的问题

[英]Python webscraping, Spotify webplayer, issues with scrolling to bottom of page

我想制作一个 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 首?

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

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

请注意,您一次最多只能获得 100 个曲目标题,因此您必须发出多个请求并使用 offset 参数。 这也是您的浏览器一次只能加载 100 首歌曲的原因。

Spotify API 要求您注册一个许可证,这对于我正在处理的一个小项目来说有点过分,但是我已经设法将这个脚本组合在一起。 如果以后有人看到这个帖子希望和我做一个类似的项目,请不要复制这段代码。 这很糟糕。

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM