Поле прокрутки находится на стороне Так что в основном я изучаю python и подумал, что было бы интересно создать бота, который входит в Spotify и возвращает вам понравившиеся песни, но не в список воспроизведения . У Spotify есть некоторая странная особенность в плеере, которая не позволяет вам осматривать определенный элемент, поэтому мне нужно поискать в инспекторе, чтобы найти поле прокрутки в понравившихся песнях. Я пытаюсь сохранить путь к scroll_box, но он просто отправляет обратно:

Message: no such element: Unable to locate element: {"method":"css selector","selector":".scroller.context-event"}
  (Session info: chrome=81.0.4044.113)

Я пробовал так много вариантов find_element_by и так много путей, и я не могу его получить. В конце мне нужно прокрутить вниз окно и загрузить все песни, а затем я буду работать оттуда. Вот мой код:

from selenium import webdriver
from time import sleep
from secrets import pw2
from secrets import email
import selenium
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

class Spotbot:
    def __init__(self, email, username, pw2):
        self.driver = webdriver.Chrome()
        self.driver.get('https://spotify.com')
        self.driver.maximize_window()
        sleep(1)
        self.driver.find_element_by_xpath("//a[contains(text(), 'Log In')]")\
            .click()
        sleep(1)
        self.driver.find_element_by_xpath("//input[@name=\"username\"]")\
            .send_keys(email)
        self.driver.find_element_by_xpath("//input[@name=\"password\"]")\
            .send_keys(pw2)
        self.driver.find_element_by_xpath("//button[contains(text(), 'Log In')]")\
            .click()
        sleep(2)
        self.driver.get('https://open.spotify.com/collection/tracks')
        sleep(2)
        #scroll_box = self.driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[4]/div[1]/div/div[2]/div[1]/section/div/div/div[2]/section/ol')
        page = self.driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[4]/div[1]/div/div[2]/div[1]/section/div/div/div[2]')
        self.driver.execute_script("""arguments[0].scrollTo(0, arguments[0].scrollHeight);""", page)
        sleep(10)



Spotbot(email, 'kallen_selby', pw2)

Вот ссылка на поле прокрутки: https://open.spotify.com/collection/tracks Пожалуйста, помогите, я действительно потерян ...

4
crazy kalo 23 Апр 2020 в 19:06

2 ответа

Лучший ответ

Вы можете прокручивать, используя JavaScript, не зная, что вы подразумеваете под «полем прокрутки»:

#Specific height (1080 pixel in my monitor)
driver.execute_script("window.scrollTo(0, 1080);")

#Bottom of page
page = driver.find_element_by_xpath('/html')
driver.execute_script("""arguments[0].scrollTo(0, arguments[0].scrollHeight);""", page)
2
Pete 23 Апр 2020 в 16:36

Хорошо, я нашел решение своей проблемы :)

from selenium import webdriver
from time import sleep
from secrets import pw2
from secrets import email
import selenium
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

class Spotbot:
    def __init__(self, email, username, pw2):
        self.driver = webdriver.Chrome()
        self.driver.get('https://spotify.com')
        self.driver.maximize_window()
        self.username = username
        self.email = email
        sleep(1)
        self.driver.find_element_by_xpath("//a[contains(text(), 'Log In')]")\
            .click()
        sleep(1)
        self.driver.find_element_by_xpath("//input[@name=\"username\"]")\
            .send_keys(email)
        self.driver.find_element_by_xpath("//input[@name=\"password\"]")\
            .send_keys(pw2)
        self.driver.find_element_by_xpath("//button[contains(text(), 'Log In')]")\
            .click()
        sleep(2)

    def get_liked_songs(self):
        self.driver.get('https://open.spotify.com/collection/tracks')
        sleep(2)
        #(/html/body/div[3]/div/div[3]/div[4]/div[1]/div/div[2])
        scroll_box = self.driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[4]/div[1]/div')
        last_ht, ht = 0, 1
        while last_ht != ht:
            last_ht = ht
            sleep(1)
            ht = self.driver.execute_script("""
                arguments[0].scrollTo(0, arguments[0].scrollHeight); 
                return arguments[0].scrollHeight;
                """, scroll_box)
        sleep(1)
        liked_songs= scroll_box.find_elements_by_tag_name('a')
        songs= [name.text for name in liked_songs if name != '']
        print(songs)






my_bot = Spotbot(email, 'kallen_selby', pw2)
my_bot.get_liked_songs()

Поэтому мне просто нужно было создать резервную копию xpath и затем использовать цикл while для прокрутки, пока я не смогу больше.

0
crazy kalo 23 Апр 2020 в 17:48