Pinterest: выборка данных из часто обновляемого массива элементов - PullRequest
0 голосов
/ 10 апреля 2019

На странице альбома (https://pinterest.com/user/album/) вы можете видеть упорядоченные элементы. Я использую веб-драйвер Firefox с окном размера по умолчанию.

Все элементы имеют одинаковый класс (class = "Yl-MIw Hb7"), и они загружают примерно 20 одновременно. То, что я делаю, - это итерация каждого элемента, проникновение на его страницу просмотра, получение данных, возврат на главную страницу и т. Д.

Когда он достигает последнего элемента массива, он прокручивается вниз к этому элементу, и итератор снова начинается с первого элемента. У этого метода есть две проблемы:

  1. Некоторые элементы пропускаются при сбросе итератора.
  2. Высокий шанс получить «IndexError: список индекса вне диапазона» из-за изменения размера массива при перемещении драйвера через страницу и загружает новые элементы.

Я прокомментировал почти каждую строку, но если у вас есть вопросы, пожалуйста, задавайте. Я был бы рад получить некоторые предложения или даже новую стратегию для достижения основной цели, получить все данные со страницы. Заранее спасибо!

Использование Python 3.7 с Selenium WebDriver.

def getData():              
    i = 0
    j = 0   
    while True:
        time.sleep(1.5)

        elems = driver.find_elements_by_class_name("Yl-") # Load array of elements in page

        #see if we are in limit
        if len(elems) == i:
            #driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") Old way: Go to bottom of the page
            driver.execute_script("arguments[0].scrollIntoView();", elems[i]) # New way: Go to the last element.
            time.sleep(2) # Wait new elements to load
            elems = driver.find_elements_by_class_name("Yl-") # Reload array
            i = 0 # Reset

        elems[i].click() # Go to element view page
        time.sleep(0.75)

        try:
            elems = driver.find_elements_by_class_name("hCL") # Array with some itens, the image we want is the third one
        except NoSuchElementException:
            print("...")        

        imgsrc = elems[2].get_attribute('src') # Image source link
        imgsrc2 = imgsrc.replace("564x", "originals", 1) # Get better quality image

        try:
            urllib.request.urlretrieve(imgsrc2, "files/file" + str(j) + ".jpg")
        except:
            urllib.request.urlretrieve(imgsrc, "files/file" + str(j) + ".jpg") # If better qiality image isn't avaliable, get the normal one
            pass    

        try:
            elems = driver.find_elements_by_class_name("gUZ") # Array with some itens, the back button is the third last
        except NoSuchElementException:
            print("Can't find back button...")

        elems = driver.find_elements_by_class_name("gUZ")
        elems[-3].click() # Go back to album page
        i = i + 1
        j = j + 1
...