Я пытаюсь скопировать некоторые данные со страницы поиска рейсов.Медленная прокрутка страницы с использованием Selenium
Эта страница работает следующим образом:
Вы заполнить форму, а затем вы нажмете на кнопку поиска - это нормально. Когда вы нажимаете кнопку, вы перенаправляетесь на страницу с результатами, и вот в чем проблема. Эта страница постоянно добавляет результаты, например, в течение одной минуты, что немаловажно - проблема заключается в том, чтобы получить все эти результаты. Когда вы находитесь в реальном браузере, вам нужно прокрутить страницу вниз, и эти результаты появятся. Поэтому я попытался прокрутить вниз, используя Selenium. Он прокручивается вниз в нижней части страницы, вероятно, так быстро или это прыжок вместо прокрутки, что страница не загружает никаких новых результатов.
Когда вы медленно прокручиваетесь, он перезагружает результаты, но если вы делаете это очень быстро, он прекращает загрузку.
Я не уверен, что мой код помогает понять это, поэтому я его прикрепляю.
SEARCH_STRING = """URL"""
class spider():
def __init__(self):
self.driver = webdriver.Firefox()
@staticmethod
def prepare_get(dep_airport,arr_airport,dep_date,arr_date):
string = SEARCH_STRING%(dep_airport,arr_airport,arr_airport,dep_airport,dep_date,arr_date)
return string
def find_flights_html(self,dep_airport, arr_airport, dep_date, arr_date):
if isinstance(dep_airport, list):
airports_string = str(r'%20').join(dep_airport)
dep_airport = airports_string
wait = WebDriverWait(self.driver, 60) # wait for results
self.driver.get(spider.prepare_get(dep_airport, arr_airport, dep_date, arr_date))
wait.until(EC.invisibility_of_element_located((By.XPATH, '//img[contains(@src, "loading")]')))
wait.until(EC.invisibility_of_element_located((By.XPATH, u'//div[. = "Poprosíme o trpezlivosť, hľadáme pre Vás ešte viac letov"]/preceding-sibling::img')))
self.driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
self.driver.find_element_by_xpath('//body').send_keys(Keys.CONTROL+Keys.END)
return self.driver.page_source
@staticmethod
def get_info_from_borderbox(div):
arrival = div.find('div',class_='departure').text
price = div.find('div',class_='pricebox').find('div',class_=re.compile('price'))
departure = div.find_all('div',class_='departure')[1].contents
date_departure = departure[1].text
airport_departure = departure[5].text
arrival = div.find_all('div', class_= 'arrival')[0].contents
date_arrival = arrival[1].text
airport_arrival = arrival[3].text[1:]
print 'DEPARTURE: '
print date_departure,airport_departure
print 'ARRIVAL: '
print date_arrival,airport_arrival
@staticmethod
def get_flights_from_result_page(html):
def match_tag(tag, classes):
return (tag.name == 'div'
and 'class' in tag.attrs
and all([c in tag['class'] for c in classes]))
soup = mLib.getSoup_html(html)
divs = soup.find_all(lambda t: match_tag(t, ['borderbox', 'flightbox', 'p2']))
for div in divs:
spider.get_info_from_borderbox(div)
print len(divs)
spider_inst = spider()
print spider.get_flights_from_result_page(spider_inst.find_flights_html(['BTS','BRU','PAR'], 'MAD', '2015-07-15', '2015-08-15'))
Таким образом, основная проблема заключается в том, что она прокручивается слишком быстро, чтобы вызвать новую загрузку результатов.
Есть ли у вас какие-либо идеи, как заставить его работать?
Боюсь, что это не сработает. Он возвращает 10 в цикле и когда я попытался поместить это: для результата в результатах: print result.text Я узнал, что он возвращает те же значения. –
@ Милан хорошо, я вижу, что количество результатов увеличивается с каждой итерацией цикла, что означает, что дополнительные результаты загружаются. Извлеките результаты после завершения цикла. – alecxe
Чтобы проверить, найдет ли он новые результаты, я добавляю результаты в набор и в каждую длину печати цикла. Он остается на 15. Здесь вы можете найти код и результаты печати: http://pastebin.com/fkUrCvAm –