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 шт):
Сайт легко можно парсить обычными запросами. Вам стоит привыкнуть использовать selenium в крайних случаях. Он часто выдает баги, и не стабилен. Лучше немного заморочится и сделать все на запросах. Это будет стабильнее, быстрее и меньше нагрузка.
Вот ссылка где находятся все данные о рейсах: https://kbp.aero/wp-content/themes/borispol-magenta/js/board.js?v=1636294241.6202.
Чтоб ее найти достаточно открыть инструменты разработчика, зайти в вкладку сеть. Перезагружайте страницу и вуаля, все запросы которые делает страница у вас на ладони.
В остальном вам нужно только обработать данные json, который отдает вам эта ссылка.