На странице альбома (https://pinterest.com/user/album/) вы можете видеть упорядоченные элементы. Я использую веб-драйвер Firefox с окном размера по умолчанию.
Все элементы имеют одинаковый класс (class = "Yl-MIw Hb7"), и они загружают примерно 20 одновременно. То, что я делаю, - это итерация каждого элемента, проникновение на его страницу просмотра, получение данных, возврат на главную страницу и т. Д.
Когда он достигает последнего элемента массива, он прокручивается вниз к этому элементу, и итератор снова начинается с первого элемента. У этого метода есть две проблемы:
- Некоторые элементы пропускаются при сбросе итератора.
- Высокий шанс получить «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