ášáœáá á ááá áᬠášáááµáá áµáááá á ááá ášá ášá ááááµ á²á¬á¶áœá áá ášáááááá áŽááášáá á áá áá á áááá ááµá¥ áµá áµáš-áᜠáá§ášá ááááá áá á¥ááᢠá²á¬á¶áœá á ááááá áµ áá, á°áááá áááµ á¥á á áá áááá (+ - ášá°á áá±áµ ááᜠá áá»á 3 áááµ). áá§á á«á ášááá áá€á¶á¹á á á€ááŽá ááá ááµá¥ á«áµááá£ážáá á¥á ááááá ášá®á áá á°á á«áááá á áá ááá« á¢áá ááá«áᢠášáá áá®áááµ áᥠá°ááŠáœ ááá¡á á ááŸáœ á¥áá²á«áá ááá³áµ ááá¢
áµáá
áá±á á¥ášá°ášá³á
ášá áá¥á
ášá°á°áá
á°ááášáµ
áá ááááá áá?
á¥áá°ááááµ á¥áá
ášá°ááážáá áµáááµ ááá áá áá áááµá¢ ááá³áᣠá
á³áá á¥ááµá áá¥áá¶áœá á¥á áá° áµáááµ ášá°áᬠáµá¬á¶áœá ááááá á°á ááá©áµá¢ áµááá áµá¬á¶áœá áááááµ á áá ááá á«áá
áµááªáá±á á á áááá© áá áááµ áµáœááá
(ááá
á¥áµá«áá áµá
á°áµ á«áá£ážáá á³áªáᜠá áááááᣠáá ášáá»á áááµááá
á ááá ááᣠáá°á á²á á¥áá°á°á áá°áᣠâá°áááá ááâ á¥á á áá ááááᣠáµááªáá± ášá°á°á¡áµ áááµ á áá á£ááµ á¶áµáµ áááµ ááµá¥ á ááŸáœá á«áááᢠááá á¥áá³á áµááªáá±á á áá°á«á áµ áá á ááŸáœá á á ááµ á á á£á« á¥á» ááááá ᣠáá áááµá°á«ášá ááá áá ᣠáµáááá á á áá«á³ ášá ášá« á á á£á«áᜠáá áášá áá°á¥á°á¥ ááœááᢠá á¥á± á¥áá³á³ ášá°á³á³á± á³áªááœá á¥áá³á áááá ááœáá, á¥áá°áá á«á ááá¶áœ á á£á á áµá°á³áœ ááá ááœáá.
ááá áá ášáµáš-áᜠáá¥ášáá« á«áµááááá³á?
áµá áá§ášá áµáááᣠá áááááµ á á°áá áá± ááááµ á ááá ášááᢠá áá°áá á ááŽááá ᣠá áááááºá«á áµáá°á á¥á áááá£áµá ášá áááœá áµáá³á ááá á áá°áá°á ááµá áá á°ášá᪠áá®ááá¶áœá áááµá«áµ ááá áá áᢠááá áá ášáµáš-ááŸáœ áášáá ášáá°á áµá¥ áá®áá«á á¥ááŽáµ ááá á á¥áá°áá»á ááá á á£á á áµá°á³áœ áá á. áá°áá áááµ áµáá£á£ áµá áá§ášá ášá¢áá°áááµ âáá°áâ áááá á°áááá¥á©á¢
áá á á£á á°áá áááá« áá á¥áá áá«áµá¡ ááœááᢠááá áá ááá ášááášá á᪠áá áá«á á¥á ááááá á áá áá á áá ášá ášáµáš-áᜠáá§á á« áááá á áµá¡á áµá¢ ááá á®áŠá¶áœ áá°á áááá¹ áá¥á«ááá»ážá ááá¡á áááµ áááµá áµ á²ááá© ááá°ááᢠášáµáš-áᜠáá§ášá áááá« ášáᜠá á áááᜠá ááµá£ á¥á ááá á¥áá³á á á³á³ á³áááµ ááµá¥ áá ááá á¢áááá ᣠááá°áá°á ášáááááµá ááᥠáááááµ á áá³ááµ ášáá§ášá áœáá³ á«áµááááá³áá¢
á¥áá
á¥á
á áá ášáá á áá³ááµ áŽááá®áœá á áá«áµá°áá
ááá³ ááµá¥ á ááá»áá
áœá áœá áµááááœ?!
á áá ááá áááµ áá ááášá á ááá á¥á ááá áá³áµ ášááá á¥á«á ᣠášá°á ášáá á°á áááᜠááµá¥ á¥á á³áªá®áœá á³á አá ááá³á áááµ ááµááµ ááœáá ᢠá á¥ááá»áœá áá á¥á«áµáá á á á²áµ ášá£á á á ášá£á¢áᜠááµá¥ ááá¥áá á¥á ášá áµá°á³á°á¥ á áµááµáá áááµááµ á¥á© ááááµ á¥áá°áá á¥ááµááááᢠáááᣠá ááµ á°á ášá ášá ááááµ áµá¬á¶áœá áááá áááµ á¥áá°áá ášá ášáᣠááá± á«á á«á á á ááá³á á¥áá°áááá á¥ááá á ááᢠá¥áá° á¥ááá± ášáá, Python á¥áá á¥áá áááá³áµ ááá£á.
á á ášá áµá¬á¶áœ áá áášáá ááááá áµáááµ áááá á á ááááµ áá ááá³áµ á«áá¥á ášááááªá«á á°áá£á áášá ášááááµáµá áµá á°áµáá ááµášá ááášá¥ ááᢠáá áá áœáá ááá³áµ áá¥á ááá á ááá ášáᣠáá á áášášá» ášá«á«á á áááááµá áášá¥á©á¢ ášáááá¶á£ áµá«ááµá«ááᣠá€ááµáá²á« á¥á ááᜠá¥ááµ á ááááá¶áœá ááᬠáá áᣠááá áá á á¥ááá áá¥á¶áœ áá á«áá ášá®áŠáµ áášáášá« ááŽáᜠášáááá áá á©á¢ ášá áá«á³ áášá«áᜠá ááᣠášáµá«áá áá¥á«á¶áœá£ ášá¥áášáᜠáá»ááªá« á¥á á¥áµááá¶áœ áá áááááµ áá ášá¥áᣠáµááá±á á°á áááá ááá³áá á¥ášáášáá©áᣠá«á«á á á£á á¥á ááᜠá¢á«áá áá¥á á á£á á°áµáá á¥áá°áá áá°áá©á á á áá áá ááµá¥, á¥á áŒá®áœá áááá«á. áš 4 á¥áµáš 6 á°á á³áµ á£áá áá ááµá¥ áŠáµ á¥á«áááœá áá° á£á¢á«á á¥áá²áá ááµášá á»áá© á¥á ááá ááá á áµááá á áá·áᢠášáá áá° áá ášá«á«á áá á áá°á©á áµ áá áœáá®áœ ááá³á ᣠáá á áŒá®áœ á¥ááµáá áá£ášá ášáá᩠ᣠášáá« á¥áá±á á¥á«áµá ááµá°áááµ á¥á ášáá« áŠá±á ááµááá á«áµááááá³á ᣠááá á¥ááµ á°áá³áµ áá á¥á á¥á áŒá®áœ ááááᢠá áµááá ášáá á®á±á ááá ááµášá á ááá ááµá°á«ášá ááœáá, á¥á áá á á«á°ášá, á á áµá°á«ášá¶á¹ ááµá¥ áªáááµ ááµášá ááœáá.
áá á áµáš-áᜠáá§ášá ášáááá á¥á á áá³ááµ áµá áš ááᜠááá á¥áá°áá³áá á«ááá á á áá á á«á£á¢ ášááááªá«á á áá®áááµ ášááááá á ááµ áá«áµá ááá«á ááá á áµáá á¥á "ášáµá ááá áµáááá£á" á áááµ áááµ ááá áááᢠ. á á¥á ᥠá£ááá ááááµ áµáá ááá ášá°á© áášá«ááœá á¥ááµá ášáá«áµá¡áµ á áá áá¥áá áá«á á ááœááá¢
á¢á«áµáá¥áá áá áááá© áá
á á¥á áµá áµáá«áá á®áµ ááµá¥ áá á¥áá°ááá á á á ááá á¥áá³ áážááá¡
- ášáááááµá á€á°-áá»áááµ á«áµáá¡á¢
- ášááá áá®á áµáá á ááááµ ááá¢
- á²á¬á¶áœá á ááááá áµ áá á¥á á áá ášááááµá ášá°áᜠá¥á áááµ á ááá áŠá±á ášáááá á°áá£á áá°ááá¢
- áá á°áá£á ášááááªá«áá ášááá áá€á¶áœ áááµá³áᣠá ááᥠášá°á°ášá°áš á¥á á°ášá᪠áá€á¶áœá ááá«á á ááµ á áá«á á á á«á°áááá¢
- áá á°áá£á ášááá áᜠáá áášáá áá°á áµá£á á¥á ášááᥠáá¬á áááá³áá¢
- ááá± áá°ááµ á¥ááááᜠášáášááááµ ášááá« áááá¶áœá á á²á¬áµ áá (áá«áœ) á¥á á á ášá« áá¥ááµ (áá£á) á áá áá ááá¢
- ášáµááªáá± á°á áá ášá²á¬áµ áá áá ááá« (áá«áœ á²á¬á¶áœ á¥á á áá«á áá) ášá«á á¢áá ááá«á á¥á ášáá á á°á áá±áµ á¶áµáµ á áááᜠášá°á°ášá°á© ášáášá áá¬á á¥áá° á€ááŽá ááá á°ááá§áá¢
- ášáá á«ááµ ááá áµááá¶áœ ášá°áá°á áá á áá á á ááµ áá°áµ ááµá¥ áášáááá.
á¥á«áá³áá± ášáŽááášá áá®áááµ ášáááášá á áµá áŸáá áááá áᥠáá£á ááá£á. á¥á áááá
á á³áªá¬ ááµá¥ á á ášá áµá¬á¶áœ áá á¥á© á ááŸáœá áááááµ á á²áµ á áµááµ áááááµ á¥ášáášáá© á¥áá³ááá á áµá³ááµá¢ á¥áá°áá á«á á ááŸáœá ááááá á á£á ášáá ááŽáᜠá áᢠáá áá áœáá áááá³áµ ášáá á áœáá ááá áá á°áá£á«á ááááµ áá áá£á¢áᜠáá ášá¥ á¥áááááá¢
ášáá ášá°áááááá á®áµ áážáá.
from time import sleep, strftime
from random import randint
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import smtplib
from email.mime.multipart import MIMEMultipart
# ÐÑпПлÑзÑйÑе ÑÑÑ Ð²Ð°Ñ Ð¿ÑÑÑ Ðº chromedriver!
chromedriver_path = 'C:/{YOUR PATH HERE}/chromedriver_win32/chromedriver.exe'
driver = webdriver.Chrome(executable_path=chromedriver_path) # ÐÑПй кПЌаМЎПй ПÑкÑÑваеÑÑÑ ÐŸÐºÐœÐŸ Chrome
sleep(2)
á á®á± ááááªá« áá á áá®ááá³áœá ááµá¥ á áá á¥á
á áá ášááá ášá¥á
á ááµáá£áµ áµááááœá áášáµ ááœááᢠáµááá
ᣠrandint
á á²áµ ášááá ááá ášáááá© á ááµ áŠáµ áá¥ááµ á°ášáá¶áœ á«á
á âá¥áá²á°áâ áááµášá áá á
ááᢠá¥ááá áá, á ááµ áŠáµ á«ááá
ááµášá á ááœáá. ášáá á«ááá á®áµ á«áµá¬á± áš Chrome ááµá®áµ áášáá³á, áá
á áŠáµ ášá£á¢á«áᜠáá áááµá«áµ áá ááá.
áµáᜠáášá« á¥ááµáá á¥á áš kayak.com áµá áš ááœá á á°ááš ááµá®áµ á¥ááááµá¢ ášááá áá áµá ášá°á á¥á ášááááááá ášá°á á¥áá²áá ášá ášá« áááµá á¥áááá£áá ᢠáááœá á áááá¡á áµ áá áš + -3 áááµ ááá á¥á á áá áááá á«ášááá¡á¢ áá¥áá°áá á áááµ á¥á«ááᜠááᜠá£á¢á«á ášáá«ááá°áá áááµ ááµá¥ á ááµáá£áµ á®á±á á»áá©áµá¢ ááá³á, á²á¬á¶áœá áá°áá°á áááµ á¥á» áááá á«áá¥ááµ, áš bot á®áµá ááášá á«áá¥ááµ ášáá°á ááµá á á. áµá á®á± áµááá á°áᢠáá¥á«áªá«ááœá á¥á°á£áá, ááá áá áá« ááá£áµ ášá°á°áááµ á«á³ááá.
á áá ášááá á áá«á©á á á
á«áµáá á¥á á á áµá«á» á ááá ááµá¥ á«ááá á ááá áááášá±. á°ááááá á ááááœá áµ ášá³áœ á£áá áá³á áá ášáá ááá áµ á ááá áá á°áá³á³á ááá á áá áµ kayak
, á©á áá€áá ášáá«ášáᜠá¥á ááŽá á¥á
á áá áááá get
ášáµá áá. ášááá á áá«á©á á á
á«á°ášá á áá áá€á¶áœ á áá¹ áá áá³ášáµ á áá£ážá.
áµáááá áµá áá get
ášáááµ ááá á¶áµáµ áá á áá á á¥ááµ á°áááᜠááµá¥á£ reCaptcha á áá áá áášááá« á¥áá³á áá
á
á°á ášá
á©á¢ áµááá± á á²áµ áŒá ááááµ á¥áµáªááµá áµášáµ áá
áá áŒá á¥á«áµá ááá á¥á ááášá©á ááá á ááœááᢠáµááªáá±á áµááá ášááááá«á ášáá°á» ááá áá áá áá á«ááœáá ášáááµ áááµáá áá á áµááá
á á®á± ááášá ášáááá á ášááá á¥á«áµá ááµáœ á®á± á¥áá²á°á« ááµášá á¥á» áá á ááá ááá áááᜠáá«ášá ášá
á ááá°á¶áœá á áá ááᢠá¥á áµáá¥á± á«á°á¡ ᣠá ááµ á°á á ááá áµá«áᜠáá«ášá á 10 á°áá áá©ááµ ááµá¥ áµáá°áá ááµ ášá²á¬áµ áááᜠáášá ášáá«áµáááá á ááááá¢
XPath á áá áá ášáᜠáá á ááµá«áµ áá
áµááá
, ááµá®áµ ášáá°á á£á¢á«áá á«áá. ášáá á áá£á¥ á¥á ááᜠáášáááœá áááááµ áš XPath áŽááááá ááá ášá²á€áµá€áµ ááášá«ááœá áá áá á áá¥áᢠᚠXPath áá áááášáµ áá°áá© á¥á ášá²á€áµá€áµ ááášá«ááœá áá áá á¥áá³áá¥á á áá°á°ááá, ááá áá á áá
ááááµ ááµá«áµ á á£á áá»áá. á€ááµááµá á áá áá á á ááµ áᜠáá áá°áµ á áµážá᪠ááá ááœááᣠá¥á ááá á¥áá³á ášáááœá³ážáá áŽááá®áœ á¥áµá áááá¢
áµááá
ᣠá áŠáµ áá ááµá«á³áœáá á¥ááá¥áᢠá á£á áá«á¹á á²á¬á¶áœá áááášá¥ ášáá®áá«áá á á
á á¥áá ááᢠá áášá°áá ááµá áš XPath ááášá« á®áµ á áá ááᶠáá³á«áᢠá®á±á ááášáµ á áááááµ áᜠáá á áá á á
ááµášá á¥á ášáá³ášá ááá ááµá¥ ášááá᪠áµáááá ááášá¥ á«áµááááá³á ᢠáá
áµá¥áá áá°áá«á© ášáᜠáááᜠáá á« ááœáá ᣠášá¥á± á®áµ á á®áµ áááášá»á ááµá¥ áá³á«á á¥á áá°áááá¢
ášáᜠá®áµ áááášá±
áá«á®áœá ášá®áµ áá á³áµ áµááá«áµášáµáážá áá³á¶áœ ášáááá«áŽá áášááá« áááááµ ááášá°ááµ á£á áªá«áµ áµá©ášáµ ááµá¡á¢
á®á±á á²ááá¥á¡ ášáá«áááµ áá ááá¡-
//*[@id="wtKI-price_aTab"]/div[1]/div/div/div[1]/div/span/span
á¥áá°áá á«á ááá ááá á³áµ á áááááµ ášá®áµ ááá áá á áá á á ááµášá á¥á ášáá³ášá ááá ááµá¥ á®á> áš XPath áµáááá ááášá¡á¢
á á£á áá«á¹á ááá ááááᜠášá°á ááá©áµ áážááá¡-
cheap_results = â//a[@data-code = "price"]â
áµááá á
á³ > XPath á
á³
ááá°áá á áá«á á á£á ááá á¥áá°áááµá ááᜠáá. á¥á
á áá á²áá, á£á
᪠á«áá á€ááááµ ááááá data-code
á¥á©á áááá price
. ášááááªá«áá á áá«á á²á áá, á€áááá± ááááá id
áá á¥á©á ášáá wtKI-price_aTab
, á¥á áá° á€ááááµ áš XPath ááááµ áááµáá /div[1]/div/div/div[1]/div/span/span
. á¥áá°áá
á«á áš XPath áá áá
áá° áᜠááá áá á á«á°ááááᣠáá á ááµ áá á¥á»á¢ á áá á¥áá²á
áááµ á¥áœááá id
áá¹ á áá«áá áµ á ááá¥áá áá áááá£á. ášááá á
á°á á°ášá°á wtKI
áá¹ á á°á«á áá¥á á°áááá á áá ááá© ááááá£áᣠáµááá
ášáá ááá á®áµ ášááá¥áá áᜠá¥áá°áá ášá°á«á á áá áá á¢áµ ááááᢠáµááá
XPathá ááášá³áµ áµáᜠáá ááá°á±á¢ áá
á¥áááµ á á°áᥠá«áááááá³á.
ááá ᣠᚠXPath ááášá«ááœá áááá ᥠá á£á ááá ášáá á£á¢á«áᜠáá á²á°á« á áá ááá á¥áá°ááœá áᥠáá£á ááá£á ᣠá¥á á áá ášá°áážááµ ááá áœáá ášáá áµáá¢
á áá áááá ášááá áá€á¶áœ á á áá«á³ ááµáá®áœ ááµá¥ á áááá© ááµá¥ ááááµ ášááá áá ááµášá á¥áá³ááŠáµ á¥ááµá¥á¢ á á£á áááᢠá¥á«áá³áá± áá€áµ ááá á£áá áá ááµá¥ ááᢠresultWrapper
. áááá áá€á¶áœ áá«á ášá³áœ ášáá³ášá áá á°áá³á³á á áá áá°áµ ááµá¥ áášááá ááœáá.
ášáá á«ááá ášá°ášá±áµ, á¥á ášáááášáášáá á á¥áááá¹á á®áµ á ááá áášá³áµ á¥áá³ááŠáµ áᥠáá£á ááá£á. áá
á®áµ á áá°á«á áµ ááᣠášááááááá (á á¥ááᥠáá€á± ášá³ážáá áµá áá¥áš ááá) á áá³ááµ á áááµ á±á« ášááá ááŽá (XPath) á áá áá á¥áááááᢠáá
ášáá°ášáá ášáá¥áá áœáá áááááµ á¥á ááᥠááá ᥠá ááœá áá ááµá¥ áááµááᥠáá (ááááªá« á¥á
á áá ášáá) flight_containers
ášáá«á - flights_list
).
ášááááªá«áá¹ á¶áµáµ ááµáá®áœ á³áá°áá á¥á ášááááááá áá á ááá
áášáµ á¥ááœááá. áááᣠáášá ášááááµ ášá áá á áµá°á³áœ áááá¶áœ á ááᢠáášá¥á» ášá¥á«áá³áá± á á«á áášá ááá°áµ á áá¥áá¢
áá° á¥á« áá£!
á°áá£áá ááá»á ááá ááááµ á°ášá᪠áá€á¶áœá áá«á áá, áµááá
á¥á ášááááášá. áá° áá°á» á áá«áá«á á áááááµ áá á¥áá£á¬ááœá á³ááá³ áá®áá«á ášááá ááá ášá ášá« áá¥á ášá ááµášá á¥ááááá áµááá
áá¹ á á³áš áá¥á á°ášá᪠ášáá€áµ áááá á á
á á°ááááᢠá áá
á®áµ ááµá¥, áá¥áá³á áµá©ášáµ ááµá áµ á áá¥ááµ try
á áá³ááµ áá á áá«á© á áµááá áµáááá«á á«ášáá©áµá¢ á¥ááµáá áá
á á«áá áááµ á á°áá£á© á®áµ ááµá¥ ááá
á°áá£á á¥áªááœá á áµá°á«ášáµ ááµá¡ start_kayak
, ášáá
á á³áœ á¥áááášá³áá.
# ÐагÑÑзка бПлÑÑегП кПлОÑеÑÑва ÑезÑлÑÑаÑПв ÐŽÐ»Ñ ÑПгП, ÑÑÐŸÐ±Ñ ÐŒÐ°ÐºÑОЌОзОÑПваÑÑ ÐŸÐ±ÑÑÐŒ ÑПбОÑаеЌÑÑ
ЎаММÑÑ
def load_more():
try:
more_results = '//a[@class = "moreButton"]'
driver.find_element_by_xpath(more_results).click()
# ÐÑвПЎ ÑÑОÑ
заЌеÑПк в Ñ
ПЎе ÑабПÑÑ Ð¿ÑПгÑÐ°ÐŒÐŒÑ Ð¿ÐŸÐŒÐŸÐ³Ð°ÐµÑ ÐŒÐœÐµ бÑÑÑÑП вÑÑÑМОÑÑ ÑП, ÑеЌ ПМа заМÑÑа
print('sleeping.....')
sleep(randint(45,60))
except:
pass
á ááᣠáá á á°áá£á ášášá¥á áµáá³á á áá (á áá³ááµ áá ááá°áµ á¥áœááá)ᣠáá¹á ášáá°áá á°áá£á áááá á°ááá á°ááá¢
á áášá°áá á°áá£á ááµá¥ ášáááááµá á á¥ááá á°á¥áµá€á ááᢠpage_scrape
. á áá³ááµ áá ášá°ááá°á á±á« ááᥠáá£áá«áᣠáµááá
á¥á±á áááášáµ ááá ááŽá á¥á ááááᢠááá³á áááááªá« áá á°áááá®áœá áµá áá section_a_list
О section_b_list
. ášá¥á á°áá£á ášááᥠáá¬á áááá³á flights_df
, áá
ášá°áá«á© ášáášá á ášááá ááŽáᜠášá°áá áá€á¶áœá áááášáµ á¥á á áá áá ááá£áá á«áµáœááá.
def page_scrape():
"""This function takes care of the scraping part"""
xp_sections = '//*[@class="section duration"]'
sections = driver.find_elements_by_xpath(xp_sections)
sections_list = [value.text for value in sections]
section_a_list = sections_list[::2] # Ñак ÐŒÑ ÑазЎелÑеЌ ОМÑПÑЌаÑÐžÑ ÐŸ ЎвÑÑ
пПлÑÑаÑ
section_b_list = sections_list[1::2]
# ÐÑлО Ð²Ñ ÐœÐ°ÑкМÑлОÑÑ ÐœÐ° reCaptcha, ваЌ ÐŒÐŸÐ¶ÐµÑ Ð¿ÐŸÐœÐ°ÐŽÐŸÐ±ÐžÑÑÑÑ ÑÑП-ÑП пÑеЎпÑОМÑÑÑ.
# Ð ÑПЌ, ÑÑП ÑÑП-ÑП пПÑлП Ме Ñак, Ð²Ñ ÑзМаеÑе ОÑÑ
ÐŸÐŽÑ ÐžÐ· ÑПгП, ÑÑП вÑÑепÑОвеЎÑММÑе ÑпОÑкО пÑÑÑÑ
# ÑÑП вÑÑажеМОе if пПзвПлÑÐµÑ Ð·Ð°Ð²ÐµÑÑОÑÑ ÑабПÑÑ Ð¿ÑПгÑÐ°ÐŒÐŒÑ ÐžÐ»Ðž ÑЎелаÑÑ ÐµÑÑ ÑÑП-МОбÑÐŽÑ
# ÑÑÑ ÐŒÐŸÐ¶ÐœÐŸ пÑОПÑÑаМПвОÑÑ ÑабПÑÑ, ÑÑП Ð¿ÐŸÐ·Ð²ÐŸÐ»ÐžÑ Ð²Ð°ÐŒ пÑПйÑО пÑПвеÑÐºÑ Ðž пÑПЎПлжОÑÑ ÑкÑапОМг
# Ñ ÐžÑпПлÑзÑÑ ÑÑÑ SystemExit Ñак как Ñ
ПÑÑ Ð¿ÑПÑеÑÑОÑПваÑÑ Ð²ÑÑ Ñ ÑаЌПгП МаÑала
if section_a_list == []:
raise SystemExit
# Я бÑÐŽÑ ÐžÑпПлÑзПваÑÑ Ð±ÑÐºÐ²Ñ A ÐŽÐ»Ñ ÑÑ
ПЎÑÑОÑ
ÑейÑПв О B ÐŽÐ»Ñ Ð¿ÑОбÑваÑÑОÑ
a_duration = []
a_section_names = []
for n in section_a_list:
# ÐПлÑÑаеЌ вÑеЌÑ
a_section_names.append(''.join(n.split()[2:5]))
a_duration.append(''.join(n.split()[0:2]))
b_duration = []
b_section_names = []
for n in section_b_list:
# ÐПлÑÑаеЌ вÑеЌÑ
b_section_names.append(''.join(n.split()[2:5]))
b_duration.append(''.join(n.split()[0:2]))
xp_dates = '//div[@class="section date"]'
dates = driver.find_elements_by_xpath(xp_dates)
dates_list = [value.text for value in dates]
a_date_list = dates_list[::2]
b_date_list = dates_list[1::2]
# ÐПлÑÑаеЌ ÐŽÐµÐœÑ ÐœÐµÐŽÐµÐ»Ðž
a_day = [value.split()[0] for value in a_date_list]
a_weekday = [value.split()[1] for value in a_date_list]
b_day = [value.split()[0] for value in b_date_list]
b_weekday = [value.split()[1] for value in b_date_list]
# ÐПлÑÑаеЌ ÑеМÑ
xp_prices = '//a[@class="booking-link"]/span[@class="price option-text"]'
prices = driver.find_elements_by_xpath(xp_prices)
prices_list = [price.text.replace('$','') for price in prices if price.text != '']
prices_list = list(map(int, prices_list))
# stops - ÑÑП бПлÑÑПй ÑпОÑПк, в кПÑПÑПЌ пеÑвÑй ÑÑÐ°Ð³ÐŒÐµÐœÑ Ð¿ÑÑО МаÑ
ПЎОÑÑÑ Ð¿ÐŸ ÑÑÑÐœÐŸÐŒÑ ÐžÐœÐŽÐµÐºÑÑ, а вÑПÑПй - пП МеÑÑÑМПЌÑ
xp_stops = '//div[@class="section stops"]/div[1]'
stops = driver.find_elements_by_xpath(xp_stops)
stops_list = [stop.text[0].replace('n','0') for stop in stops]
a_stop_list = stops_list[::2]
b_stop_list = stops_list[1::2]
xp_stops_cities = '//div[@class="section stops"]/div[2]'
stops_cities = driver.find_elements_by_xpath(xp_stops_cities)
stops_cities_list = [stop.text for stop in stops_cities]
a_stop_name_list = stops_cities_list[::2]
b_stop_name_list = stops_cities_list[1::2]
# ÑÐ²ÐµÐŽÐµÐœÐžÑ ÐŸ кПЌпаМОО-пеÑевПзÑОке, вÑÐµÐŒÑ ÐŸÑпÑÐ°Ð²Ð»ÐµÐœÐžÑ Ðž пÑОбÑÑÐžÑ ÐŽÐ»Ñ ÐŸÐ±ÐŸÐžÑ
ÑейÑПв
xp_schedule = '//div[@class="section times"]'
schedules = driver.find_elements_by_xpath(xp_schedule)
hours_list = []
carrier_list = []
for schedule in schedules:
hours_list.append(schedule.text.split('n')[0])
carrier_list.append(schedule.text.split('n')[1])
# ÑазЎелÑеЌ ÑÐ²ÐµÐŽÐµÐœÐžÑ ÐŸ вÑеЌеМО О П пеÑевПзÑОкаÑ
ÐŒÐµÐ¶ÐŽÑ ÑейÑаЌО a О b
a_hours = hours_list[::2]
a_carrier = carrier_list[1::2]
b_hours = hours_list[::2]
b_carrier = carrier_list[1::2]
cols = (['Out Day', 'Out Time', 'Out Weekday', 'Out Airline', 'Out Cities', 'Out Duration', 'Out Stops', 'Out Stop Cities',
'Return Day', 'Return Time', 'Return Weekday', 'Return Airline', 'Return Cities', 'Return Duration', 'Return Stops', 'Return Stop Cities',
'Price'])
flights_df = pd.DataFrame({'Out Day': a_day,
'Out Weekday': a_weekday,
'Out Duration': a_duration,
'Out Cities': a_section_names,
'Return Day': b_day,
'Return Weekday': b_weekday,
'Return Duration': b_duration,
'Return Cities': b_section_names,
'Out Stops': a_stop_list,
'Out Stop Cities': a_stop_name_list,
'Return Stops': b_stop_list,
'Return Stop Cities': b_stop_name_list,
'Out Time': a_hours,
'Out Airline': a_carrier,
'Return Time': b_hours,
'Return Airline': b_carrier,
'Price': prices_list})[cols]
flights_df['timestamp'] = strftime("%Y%m%d-%H%M") # вÑÐµÐŒÑ ÑбПÑа ЎаММÑÑ
return flights_df
á®á± ááášá³áµ á¥áá²á»á á°áááá®á¹á ááá°ášá áášáá©á¢ á°áááá®áœ ášáááá©áµ á«áµá³áá± a
ášáááá± ášááááªá« á°ášá á£áá€áµ áážá, á¥á b
- áá° ááá°áá. áá°ááá¥áá á°áá£á á¥áááµá¢
ášáµáá ááŽááœ
á áá á°ášá᪠ášááá áá€á¶áœá á¥ááµááá á¥á á¥ááá«á áá€á¶áœ áááµá¬áµ ášáá«áµáœá á°áá£á á ááᢠá¥ááá
áááµ á°áá£á«áµ á¥ááµá á¥á«áµá ášáášáá±áµá ááŸáœ ááá§ášá ášáá«áµáááááµá ááá®áœ áá áµááá«ááá¡ áá
áœáá á¥áá
áá«á á ááœá áá áᢠááá áá ášáá ášá°ááá¹áµá á áá³ááµ ášá³áµ ááŽááœá á¥áµá«áá á áá€ááá. ááá³áᣠá¢ááááœá á¥á á áá³ááµ ááᜠááá®áœá áááá áá
á®áµ ááᢠáá
áá á á°áá£á© ááµá¥ ááá ááœáá start_kayak
, á áá á¥áááášá³áá.
áá
á°áá£á á¥áá²á°á« áµá ášá°áᜠá¥á áááµ áášá á«áµááááá³áᢠáá
áá áášá á áá áá á á°áááá ááµá¥ á ááá ááá¥á«á kayak
, á¥ááµáá áá° á ááµ áᜠáááá°áµ á¥á
á áá ášáááá ášááá áá€á¶áœá ášá¥á«áá áá á á°á»á á°ááá
ááµ ášá°á°ášá°á© áážá. ášááááªá«á ášáá§ášá ááá áá á áá, á áá¹ á ááµ áá á£áá á áá ášá¥ ááµá¥ á«á áááᜠáá á¥áá°á«áá. áááµá á ááµá°ááá ášá²á¬áµ áá á¥á á áá«á ááá á¥áááááᢠáá
áá, á á£á¢á«á ášá°á°á áµáá á« áá, á á¢áá ááá«á. á áá¹ áá, á°áá³á á ášáŽáá á áááá áá« á¥á áá ááá á áá áµ. á ááá«áœá áá ášáá
á°áá ášá¥ áá á á¥á® ááµá«áµ áµáááá áááœá á áá áá ááá áá áµá
á°áµ ááá¥á ááœáá, áááá«á±á á áá
ááá³ á ášáŽáá á áá¹ áá á áá³áá.
def start_kayak(city_from, city_to, date_start, date_end):
"""City codes - it's the IATA codes!
Date format - YYYY-MM-DD"""
kayak = ('https://www.kayak.com/flights/' + city_from + '-' + city_to +
'/' + date_start + '-flexible/' + date_end + '-flexible?sort=bestflight_a')
driver.get(kayak)
sleep(randint(8,10))
# ОМПгЎа пПÑвлÑеÑÑÑ Ð²ÑплÑваÑÑее ПкМП, ÐŽÐ»Ñ Ð¿ÑПвеÑкО Ма ÑÑП О егП закÑÑÑÐžÑ ÐŒÐŸÐ¶ÐœÐŸ вПÑпПлÑзПваÑÑÑÑ Ð±Ð»ÐŸÐºÐŸÐŒ try
try:
xp_popup_close = '//button[contains(@id,"dialog-close") and contains(@class,"Button-No-Standard-Style close ")]'
driver.find_elements_by_xpath(xp_popup_close)[5].click()
except Exception as e:
pass
sleep(randint(60,95))
print('loading more.....')
# load_more()
print('starting first scrape.....')
df_flights_best = page_scrape()
df_flights_best['sort'] = 'best'
sleep(randint(60,80))
# ÐПзÑÐŒÑÐŒ ÑаЌÑÑ ÐœÐžÐ·ÐºÑÑ ÑÐµÐœÑ ÐžÐ· ÑаблОÑÑ, ÑаÑпПлПжеММПй в веÑÑ
Мей ÑаÑÑО ÑÑÑаМОÑÑ
matrix = driver.find_elements_by_xpath('//*[contains(@id,"FlexMatrixCell")]')
matrix_prices = [price.text.replace('$','') for price in matrix]
matrix_prices = list(map(int, matrix_prices))
matrix_min = min(matrix_prices)
matrix_avg = sum(matrix_prices)/len(matrix_prices)
print('switching to cheapest results.....')
cheap_results = '//a[@data-code = "price"]'
driver.find_element_by_xpath(cheap_results).click()
sleep(randint(60,90))
print('loading more.....')
# load_more()
print('starting second scrape.....')
df_flights_cheap = page_scrape()
df_flights_cheap['sort'] = 'cheap'
sleep(randint(60,80))
print('switching to quickest results.....')
quick_results = '//a[@data-code = "duration"]'
driver.find_element_by_xpath(quick_results).click()
sleep(randint(60,90))
print('loading more.....')
# load_more()
print('starting third scrape.....')
df_flights_fast = page_scrape()
df_flights_fast['sort'] = 'fast'
sleep(randint(60,80))
# СПÑ
ÑаМеМОе МПвПгП ÑÑейЌа в Excel-Ñайл, ÐžÐŒÑ ÐºÐŸÑПÑПгП ПÑÑÐ°Ð¶Ð°ÐµÑ Ð³ÐŸÑПЎа О ЎаÑÑ
final_df = df_flights_cheap.append(df_flights_best).append(df_flights_fast)
final_df.to_excel('search_backups//{}_flights_{}-{}_from_{}_to_{}.xlsx'.format(strftime("%Y%m%d-%H%M"),
city_from, city_to,
date_start, date_end), index=False)
print('saved df.....')
# ÐПжМП ÑлеЎОÑÑ Ð·Ð° ÑеЌ, как пÑПгМПз, вÑЎаваеЌÑй ÑайÑПЌ, ÑППÑМПÑОÑÑÑ Ñ ÑеалÑМПÑÑÑÑ
xp_loading = '//div[contains(@id,"advice")]'
loading = driver.find_element_by_xpath(xp_loading).text
xp_prediction = '//span[@class="info-text"]'
prediction = driver.find_element_by_xpath(xp_prediction).text
print(loading+'n'+prediction)
# ОМПгЎа в пеÑеЌеММПй loading ПказÑваеÑÑÑ ÑÑа ÑÑÑПка, кПÑПÑаÑ, пПзже, вÑзÑÐ²Ð°ÐµÑ Ð¿ÑÐŸÐ±Ð»ÐµÐŒÑ Ñ ÐŸÑпÑавкПй пОÑÑЌа
# еÑлО ÑÑП пÑПзПÑлП - ЌеМÑеЌ ÐµÑ ÐœÐ° "Not Sure"
weird = '¯_(ã)_/¯'
if loading == weird:
loading = 'Not sure'
username = '[email protected]'
password = 'YOUR PASSWORD'
server = smtplib.SMTP('smtp.outlook.com', 587)
server.ehlo()
server.starttls()
server.login(username, password)
msg = ('Subject: Flight Scrapernn
Cheapest Flight: {}nAverage Price: {}nnRecommendation: {}nnEnd of message'.format(matrix_min, matrix_avg, (loading+'n'+prediction)))
message = MIMEMultipart()
message['From'] = '[email protected]'
message['to'] = '[email protected]'
server.sendmail('[email protected]', '[email protected]', msg)
print('sent email.....')
áá áá áµááªááµ ášáášáá©áµ áš Outlook ááá« (hotmail.com) á áá áá ááᢠášáááá á á«áááµ áá á áµááá á¥áá²á°á« á ááášáá©áµá ᣠáá ášá¢áá áµáááµ á á£á á°áá³á áá ᣠáá á¥á ááá ášááœá á áá«á®áœ á áᢠᚠHotmail ááá«á ášáá áá ášáá ááá ááá á¥áá²á°á« ᣠááá¥áá áá° á®á± ááµá¥ ááµáá£áµ á¥á» á«áµááááá³áá¢
ááá á°áá£á á á°áá°á ášá®á± áááᜠááµá¥ á áµááá áá á¥ášá°á°ášá á¥áá³á ááášá³áµ ášááá á¥áá±á áá á³áµ á¥á ášá¥áá± áá ááášá ááœááᢠá®áµá á áµááá ááášá³áµ á¥ážáá ááááµ ááášá ááá¢
ááá áµáááµ
á áá ášá°áááááá áá áµáá°ášáá á°áá£á«áœáá ášáá á« ááá áá°áµ ááá á á¥ááœáááᢠáµááªáá± áµá ášá°áᜠá¥á áááµ áášá ášá°á ááá áá áááᢠášáµááªáá±á ášáá«ááᥠá³áá ááµááá á²áá᩠ᣠáá áá ááᥠáá áá á¥á«áµá ááµáá£áµ á ááááá ᣠáµáááá á°áá³á ááµáá®á¹á ááášá« áá ášáá± á á³áœ á«ááµá á áµá°á«ášáµ á ááµá áµ á áµá°á«ášáµ ááµá áµ ááœáá ᣠá áá ááµá¥ á áµáááá áášá áµááªááµ áááµ á®áµ ááá¢
city_from = input('From which city? ')
city_to = input('Where to? ')
date_start = input('Search around which departure date? Please use YYYY-MM-DD format only ')
date_end = input('Return when? Please use YYYY-MM-DD format only ')
# city_from = 'LIS'
# city_to = 'SIN'
# date_start = '2019-08-21'
# date_end = '2019-09-07'
for n in range(0,5):
start_kayak(city_from, city_to, date_start, date_end)
print('iteration {} was complete @ {}'.format(n, strftime("%Y%m%d-%H%M")))
# ÐÐŽÑÐŒ 4 ÑаÑа
sleep(60*60*4)
print('sleep finished.....')
ášáµááªáá± ášáášá« áá°áµ áá
á áááµááá¢
ášáµááªááµ á ááµ áášá«
áá€á¶áœ
á¥áµášáá áµášáµ ášá°ášáµáᣠá¥áá³á á°áµ á«áá ! á áá á¥á ášáá»á»á« áááá¶áœá áášáµ á¥áœáá á áá ášáá°á« ášáµá áá§á á« á áá ᢠááá³á ášá¢áá ááá ášáœáá ááá¥ááµ á¥áá²áá ášáµááá® áá áá£áá ááœááᢠášá áá«á³ á áááá®áœ á á°áá³á³á áá áá€á¶áœá áááá á VPN ááá áá ááá áá áá áµáœááá ᢠá¥áá²áá ášá£á¢á«áá á°á áá á°á áááá ááášááᥠá ášááá ášááá³ áœáá á áᣠááá áá áá áœáá ááá³ ááœááᢠá ááááá ááá³, á áá ášááá á¥ááµá ááµááµ ášááœáá áµ áá°ášáµ á áááµ. ááá³á ášá€ááŽá ááá ášá¢áá áá á¥áá° á á£áª áá°á ááá ááá©á á«ášááá¡á¢
á á³á°á³ á¥áá± ááµá¥ ášá°áááá¡ á°á áááᜠá¥á» áá³á°á ááœááá¢
ášáµá ááá áŽááááááœá áµá áááá ?
-
á«
-
ášáá
8 á°á áááᜠáµáᜠá°á¥á°ááᢠ1 á°á áááᜠáµáá á°á á
አá áµááááá¢
ááá: hab.com