Обработка медленной загрузки веб-страницы, устранение жестко заданной задержки из моего скрипта - PullRequest
0 голосов
/ 03 мая 2018

Я написал скрипт на python в сочетании с селеном для анализа некоторых имен с веб-страницы, обрабатывая метод отложенной загрузки, для которого веб-страница отображает свое содержимое при каждой прокрутке вниз. Мой скрипт делает это без ошибок. Однако единственная проблема, которую я не могу решить, это убрать жестко заданную задержку из моего скрипта. Я действительно не могу найти ни малейшего представления о том, как я могу использовать explicit wait вместо hardcoded delay, сохраняя логику (примененную в скрипте), чтобы сделать ее более эффективной. Заранее спасибо за любую помощь.

Ссылка на веб-страницу

Это то, что я пробовал до сих пор (рабочий):

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("find_the_link_above")

last_len = len(driver.find_elements_by_class_name("listing__name--link"))
new_len = last_len

while True:
    last_len = new_len
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(3) ##I wish to kick out this harcoded delay and use explicit wait in place

    items = driver.find_elements_by_class_name("listing__name--link")
    new_len = len(items)
    if last_len == new_len:break

for item in items:
    print(item.text)
driver.quit()

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Это способ, которым вы можете реализовать ExplicitWait:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.common.exceptions import TimeoutException

driver = webdriver.Chrome()
driver.get("https://www.yellowpages.ca/search/si/1/coffee/all%20states")

last_len = len(driver.find_elements_by_class_name("listing__name--link"))

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    try:
        wait(driver, 3).until(lambda driver: len(driver.find_elements_by_class_name("listing__name--link")) > last_len)
        items = driver.find_elements_by_class_name("listing__name--link")
        last_len = len(items)
    except TimeoutException:
        break

for item in items:
    print(item.text)
driver.quit()

Это должно позволить вам прокрутить вниз и подождать до 3 секунд (увеличить время ожидания, если это необходимо), пока число элементов в цикле не увеличится или не прервать цикл while, если число остается прежним

0 голосов
/ 03 мая 2018

Для анализа имен с веб-страницы вы можете использовать следующий блок кода:

  • Кодовый блок :

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    items = []
    
    options = Options()
    options.add_argument("start-maximized")
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")
    options.add_argument("--no-sandbox")
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get('https://www.yellowpages.ca/search/si/1/coffee/all%20states')
    items=driver.find_elements_by_css_selector("h3[itemprop='name']>a.listing__name--link")
    while(driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")):
        items.append(driver.find_elements_by_css_selector("h3[itemprop='name']>a.listing__name--link"))
    for item in items:
        print(item.text)
    
  • Консольный вывод :

    Tim Hortons
    Downtown Expresso Café
    Tim Hortons
    Tim Hortons
    Tim Hortons
    Starbucks
    Tim Hortons
    Tim Hortons
    Tim Hortons
    Tim Hortons
    Tim Hortons
    Tim Hortons
    Tim Hortons
    Starbucks
    Tim Hortons
    Tim Hortons
    Budokan
    Anchor Cafe House
    Starbucks
    Tim Hortons
    Tim Hortons
    Starbucks
    Tim Hortons
    Starbucks
    Tim Hortons
    Tim Hortons
    Colonial Coffee Co Ltd
    Personal Service Coffee
    Tim Hortons
    Suzie's Grill Cafe Inc
    Loaves N Fishes Catering & Cafe
    Tim Hortons
    Tim Hortons
    Tim Hortons
    Tim Hortons
    Elizabeth Houte Coiffure
    The Grind House Cafe
    Tim Hortons
    Black Bench Coffee Roasters
    Tim Hortons
    
...