Проблемы с Selenium, особенно с оптимизацией

#python #selenium

#python #selenium

Вопрос:

Ребята, у меня проблема с эффективностью в моем коде

Мне нужно извлечь определенные данные с веб-страницы с земельными участками / квартирами, а затем проанализировать их, но мой код работает очень медленно, не могли бы вы быть так добры и помочь мне?

PS Я новичок в веб-очистке

 driver.get('https://www.olx.pl/nieruchomosci/dzialki')


innerLayout = driver.find_element_by_id('innerLayout')
print(innerLayout)
container = innerLayout.find_element_by_id('body-container')
offer_wrap = container.find_elements_by_class_name("offer-wrapper")

for i in offer_wrap:
    link = driver.find_element_by_xpath('//*[@id="body-container"]/div[3]/div/div[1]/table[1]/tbody/tr[3]/td/div/table/tbody/tr[1]/td[2]/div/h3/a')
    link.click()

    outerClass = driver.find_element_by_id('offerdescription')

    time.sleep(10)
#price of field

    parcel = outerClass.find_elements_by_xpath('//*[@id="offerdescription"]/div[2]/ul/li[3]/span/strong')

    price= []

    for i in parcel:
        price.append(i.text)
    time.sleep(10)

#surface

    surface = outerClass.find_elements_by_xpath('//*[@id="offerdescription"]/div[2]/ul/li[4]/span/strong')

    surf = []

    for j in surface:
        surf.append(j.text)

    time.sleep(10)
    driver.back()





print(price)
print(surf)
  

Комментарии:

1. У вас есть три time.sleep(10) оператора в вашем цикле, поэтому каждый цикл занимает 30 секунд ожидания. Вероятно, это можно было бы ускорить, используя явные ожидания. Если вы прочтете документы , вы можете узнать, как это сделать.

2. Просто добавляя к тому, что говорит @Beek, используйте лучшие локаторы и wait' кроме того, ваш основной цикл не должен повторять элементы, чтобы избежать StaleElementReferenceException

3. Старайтесь избегать стольких time.sleep . Лучше использовать waits, но в вашем случае, скорее всего, вам это вообще не нужно. Вы можете добавлять time.sleep(1) один раз на 100 циклов, чтобы уменьшить вероятность быть забаненным веб-сайтом. Кроме того, я не уверен на 100%, поскольку не проверял этот веб-сайт, но убедитесь, что вам действительно нужны циклы внутри основного цикла. Похоже, вам просто нужно перебрать предложения один раз (для сбора цен и описаний)

Ответ №1:

Пожалуйста, избегайте time.sleep() . Это своего рода статическое ожидание, которое все равно будет ждать, даже если ваш элемент виден и может взаимодействовать.

Основываясь на вашем коде, я не смог найти лучшей ситуации, например, почему вы используете 10 секунд сна в какой-то момент.

Это один из примеров, когда вы можете заменить свой time.sleep явным ожиданием :

  element = WebDriverWait(driver, 5).until(
        EC.presence_of_element_located((By.XPATH, "Your element Xpath here"))
    )
  

Кроме того, большинство ваших xpath являются абсолютными, пожалуйста, используйте относительные xpath, которые сделают ваш скрипт более стабильным.

У меня есть хороший xpath для вас здесь :

 Your xpath : //*[@id="body-container"]/div[3]/div/div[1]/table[1]/tbody/tr[3]/td/div/table/tbody/tr[1]/td[2]/div/h3/a
Better xpath : (//table[@summary='Ogłoszenie']//tr//td//h3/a)[1]


Your xpath : //*[@id="offerdescription"]/div[2]/ul/li[3]/span/strong
Better xpath : (//span[@class='offer-details__name'])[3]


Your xpath : //*[@id="offerdescription"]/div[2]/ul/li[4]/span/strong
Better xpath : (//span[contains(@class,'name')])[4]
  

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

Ответ №2:

Я понимаю ваше использование time.sleep() , но вам лучше избегать этого. Попробуйте использовать WebDriverWait . Вы можете найти это здесь