#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
. Вы можете найти это здесь