2

我正在尝试使用 python 和 splinter 从 Spotify 上的许多艺术家那里获得顶级歌曲的播放次数。

如果你在下面填写用户名和密码,你应该可以运行代码。

from splinter import Browser
import time
from bs4 import BeautifulSoup

browser = Browser()
url = 'http://play.spotify.com'
browser.visit(url)
time.sleep(2)
button = browser.find_by_id('has-account')
button.click()
time.sleep(1)
browser.fill('username', 'your_username')
browser.fill('password', 'your_password')
buttons = browser.find_by_css('button')
visible_buttons = [button for button in buttons if button.visible]
login_button = visible_buttons[-1]
login_button.click()
time.sleep(1)
browser.visit('https://play.spotify.com/artist/5YGY8feqx7naU7z4HrwZM6')
time.sleep(10)

到目前为止,一切都很好。如果你打开 Firefox,你会看到 Miley Cyrus 的艺术家页面,包括热门曲目的播放次数。

如果您打开 Firefox 开发者工具检查器并悬停,您可以在元素中看到歌曲的名称,.tl-highlight以及在元素中的播放次数.tl-listen-count。但是,我发现(至少在我的机器上)无法使用splinter. 此外,当我尝试获取整个页面的源代码时,在 Firefox 中通过将鼠标悬停在它们上面可以看到的元素不会出现在表面上的页面源代码中。

html = browser.html
soup = BeautifulSoup(html)
output = soup.prettify()
with open('miley_cyrus_artist_page.html', 'w') as output_f:
    output_f.write(output)
browser.quit()

我认为我对 Web 编程了解得不够多,无法知道问题出在哪里——Firefox 清楚地看到了所有 DOM 元素,但驱动 Firefox 的分裂却没有。

4

2 回答 2

1

关键问题是有一个iframe包含艺术家的页面和曲目列表。在搜索元素之前,您需要切换到它的上下文:

frame = browser.driver.find_element_by_css_selector("iframe[id^=browse-app-spotify]")
browser.driver.switch_to.frame(frame)
于 2015-07-15T19:30:33.327 回答
0

非常感谢@alecxe,下面的代码可以提取艺术家的信息。

from splinter import Browser
import time
from bs4 import BeautifulSoup
import codecs

browser = Browser()
url = 'http://play.spotify.com'
browser.visit(url)
time.sleep(2)
button = browser.find_by_id('has-account')
button.click()
time.sleep(1)
browser.fill('username', 'your_username')
browser.fill('password', 'your_password')
buttons = browser.find_by_css('button')
visible_buttons = [button for button in buttons if button.visible]
login_button = visible_buttons[-1]
login_button.click()
time.sleep(1)
browser.visit('https://play.spotify.com/artist/5YGY8feqx7naU7z4HrwZM6')
time.sleep(30)

CORRECT_FRAME_INDEX = 6
with browser.get_iframe(CORRECT_FRAME_INDEX) as iframe:
    html = iframe.html
    soup = BeautifulSoup(html)
    output = soup.prettify()
    with codecs.open('test.html', 'w', 'utf-8') as output_f:
        output_f.write(output)
browser.quit()
于 2015-07-15T20:13:19.633 回答