Python, Selenium - парсинг. Не могу получить информацию с динамически заполняемых полей

Я хочу научиться, как получать информацию из динамически генерируемых полей. Когда я пробовал простые сайты, все работало. Тогда я решил попробовать посложнее и теперь не могу разобраться. Мне потребовалось около двух недель, чтобы вычеркнуть варианты решения, которые я снова и снова находил в Интернете. Теперь я не уверен, что смогу получить информацию, которая появляется на сайтах таким образом. Конечно, скорее всего, я что-то делаю не так, но я не могу понять, как это сделать. Теперь я решил спросить здесь. Возможно, есть те, кто это понимает и может подсказать. Если да - приведите пожалуйста пример.

Сайт где я пробовал это - kbp.aero/en

Информация которую я пытался получить (график прилетов) - .tbody .tr .td

Пример того что я пробовал:

1.

URL = 'https://kbp.aero/en/'
    HEADERS = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
    }
    time.sleep(1)
    response = requests.get(URL, headers = HEADERS)
    soup = BeautifulSoup(response.content, 'html.parser')
    items = soup.find('div', class_ = 'table_wrp out yesterday')
    items = items.findAll('tr', class_ = 'tr')
    comps = []
    if(len(items) > 0):
        for item in items:
            comps.append({
                'title':item.find('td', class_ = 'td').get_text(strip = True),
            })
    for comp in comps:
        print(comp['title'])
    # for item in items:
    #     comps.append({
    #         'text': item.get_text(strip=True)
    #     })
    #
    # for comp in comps:
    #     print(comp['text'])
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def main():
    driver = webdriver.Chrome()
    driver.get("https://kbp.aero/en/")

    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'tbody'), ''))

    tds = element.find_elements(By.CLASS_NAME, "td")
    for td in tds:
        print(td.text)

    # try:
    #     element = WebDriverWait(driver, 10).until(
    #         EC.presence_of_element_located((By.CLASS_NAME, "tbody"))
    #     )
    #     tds = element.find_elements(By.CLASS_NAME, "td")
    #     for td in tds:
    #         print(td.text)
    #
    # finally:
    #     driver.quit()

Спасибо за любую помощь.


Ответы (1 шт):

Автор решения: ProgerOffline

Сайт легко можно парсить обычными запросами. Вам стоит привыкнуть использовать selenium в крайних случаях. Он часто выдает баги, и не стабилен. Лучше немного заморочится и сделать все на запросах. Это будет стабильнее, быстрее и меньше нагрузка.

Вот ссылка где находятся все данные о рейсах: https://kbp.aero/wp-content/themes/borispol-magenta/js/board.js?v=1636294241.6202.

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

В остальном вам нужно только обработать данные json, который отдает вам эта ссылка.

→ Ссылка