2015-08-02 3 views
2

Я пытаюсь получить все элементы на странице, но имеет неограниченную прокрутку. Я пытаюсь прокрутить страницу вниз, а затем получить атрибуты, но она не собирает их всех? Почему-то я получаю только половину из них?Selenium получает все атрибуты python

driver = webdriver.Firefox() 
driver.get("http://www.amazon.com/gp/pdp/profile/A2A46BUQRGSAB0/ref=cm_cr_dp_pdp") 
lastHeight = driver.execute_script("return document.body.scrollHeight") 
while True: 
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    time.sleep(3) 
    newHeight = driver.execute_script("return document.body.scrollHeight") 
    print newHeight, lastHeight 
    if newHeight == lastHeight: 
     break 
    lastHeight = newHeight 
tree = etree.HTML(driver.page_source) 
product = tree.xpath('//span[@class="a-size-base product-title pr-multiline-ellipses-container"]//text()')[::3] 
print len(product) 
+0

Я хочу, чтобы человек просматривал конкретный продукт в моем списке. Поэтому я просто пытаюсь получить названия продуктов там профиля. @birthofearth – bentest

ответ

-1

Вам нужно подождать, пока эффект прокрутки будет действовать. В противном случае вы получите исходный код перед обновлением.

Простой, но не идеальный обходной путь заключается в использовании time.sleep достаточно времени:

import time 

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
time.sleep(1) # <--- 
newHeight = driver.execute_script("return document.body.scrollHeight") 
+0

Я до сих пор не получаю> 25 отзывов, когда этот профиль действительно имеет его, даже когда я сплю скрипт в течение 5 секунд. – bentest

+0

@bentest, даже если я делаю это вручную с помощью браузера, 75 (25 * 3) - это максимум, который я могу получить. – falsetru

1

Глядя на Selenium Python bindings doc, вы можете попробовать использовать выжидательную, либо прямой или косвенной. Этот ответ от SO Selenium random timeout exceptions without any message может быть полезен для реализации явной реализации ожидания.

Для неявного ожидания вы можете попробовать что-то подобное (не проверено):

def reached_bottom(driver): 
    try: 
     return driver.find_element_by_class_name("no-more")   
    except: 
     return False  

driver = webdriver.Firefox() 
driver.implicitly_wait(10)  
driver.get("http://www.amazon.com/gp/pdp/profile/A2A46BUQRGSAB0/ref=cm_cr_dp_pdp") 

while not reached_bottom(driver): 
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 

product = ... 

Я использовал no-more класс, который показывает, в конце как условие остановки, предполагающей он добавляется к DOM при достижении конца , но опять же, не проверял.