ááá±á·áá»áœááºá¯ááºááá¯á·áá¯ááºáá±áá±áá±á¬áá¬áá¬ááŒááºáá±á¬ááºážáá«ážááá±ážáá¬ážáá°áááºáááºážááááºááœááºáá»ááºááŸá¬áá±áá¬ááºáááºááŸááºá á»á±ážááŸá¯ááºážáá»á¬ážááá¯ááŸá¬ááœá±áá±ážááá·áº Selenium ááá¯á¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ Python ááŸá web scraper ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážá¡ááŒá±á¬ááºážááŒá±á¬ááá¯áááºááŒá áºáááºá áááºááŸááºáá»á¬ážááá¯ááŸá¬ááœá±áá±á¬á¡áá«á ááŒá±á¬ááºážááœááºááŒááºááœááºáááºá áœá²áá»á¬ážááá¯á¡áá¯á¶ážááŒá¯ááẠ(+- áááºááŸááºáá¬ážáá±á¬áááºá áœá²áá»á¬ážááŸáá·áº áááºá ááºá 3 áááº)á scraper ááẠááŸá¬ááœá±ááŸá¯ááááºáá»á¬ážááᯠExcel ááá¯ááºáá áºáá¯ááœáẠááááºážáááºážááŒá®áž ááŸá¬ááœá±ááŸá¯ááᯠáá¯ááºáá±á¬ááºáá±áá°á¡á¬áž áááºážááá¯á·ááœá±á·ááŸááá²á·ááá·áº á¡áá»ááºážáá»á¯ááºááŸáá·áºá¡áá° á¡á®ážáá±ážááºáá áºá á±á¬áẠáá±ážááá¯á·áááºá á€ááá±á¬áá»ááºá áááºááœááºáá»ááºááŸá¬ ááá®ážááœá¬ážáá»á¬ážá¡á¬áž á¡áá±á¬ááºážáá¯á¶ážáá±á¬ áá»áŸá±á¬á·á á»á±ážáá»á¬ážááᯠááŸá¬ááœá±ááẠáá°áá®áá±ážáááºááŒá áºáááºá
áá
á¹á
ááºážááᯠáá¬ážáááºââáá±áá»áááºâááŸá¬ âáá»á±á¬ááºââáá±áááºâááá¯áááºâ ááŒáá·áºâááá¯ááºâáá«á
áá«ááá¯á·áá¬ááá¯ááŸá¬ááŸá¬áá²?
á€áá±áá¬ááœáẠáá±á¬áºááŒáá¬ážááá·áº á
áá
áºááᯠáááºááá¹áá¡ááá¯ááºáž ááœááºáááºá
áœá¬ á¡áá¯á¶ážááŒá¯ááá¯ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááẠááááºá¹áááœá± ááá®ážá
ááºáá»á¬ážááŸáá·áº áá¬ááááŒáá¯á·ááá¯á· áááºááŸááºáá»á¬ážááᯠááŸá¬ááœá±ááẠáááºážááᯠá¡áá¯á¶ážááŒá¯áá²á·áááºá á¡ááŒááºá¡á
áœááºážááŸááá±á¬ áááºááŸááºáá»á¬ážááᯠááŸá¬ááœá±áá¬ááœáẠá¡áá±ážá¡áááºáá¬ážáá»áŸáẠáá¬áá¬áá±á«áºááœáẠscript ááᯠááẠrun ááá¯ááºááẠ(ááá¯ážááŸááºážáá«áááºá
á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááŒáá·áº á
ááºážááŒááºááœááºáá»á¬áž áááœá±á·ááá±ážáá±á¬áºáááºáž ááŒá
áºááá¯ááºáááºáᯠáááºáá«áááºá
áá±á¬áºááŒáá¬ážááŒá®ážááŒá áºááá·áºá¡ááá¯ááºáž ááŸá¬ááœá±ááá·áºá¡áá«á âááŒá±á¬ááºážááœááºááŒááºááœááºáááºá áœá²â ááá¯á¡áá¯á¶ážááŒá¯áááºá áá¬ááºááœáŸááºážááẠáá±ážáá¬ážááá·áºáááºá áœá²áá»á¬ážá០áá¯á¶ážáááºá¡ááœááºáž áááºážááŸááºážáá»ááºáá»á¬ážááᯠááœá±á·ááŸááááºá áá¬ááºááœáŸááºážááᯠá¡áá¯á¶ážááŒá¯ááá·áºá¡áá«á áááºážááẠáŠážáááºáá»ááºáá áºáá¯áááºážááœáẠáááºážááŸááºážááŸá¯áá»á¬ážááᯠááŸá¬ááœá±áá±á¬áºáááºážá áá»á¶áááºážááŸá¯áááºážááŒá±á¬ááºážáá»á¬ážá áœá¬ááŸá á¡áá»ááºá¡áááºáá»á¬ážááᯠá á¯áá±á¬ááºážááá¯ááºá á±ááẠáááºážááᯠááŒááºáááºááẠááœááºáá°áááºá áááºážáá¡áá°á¡áá®ááŒáá·áº áááºááẠááŸá¬ážááœááºážáá±á¬á¡ááœááºá¡ááá»á¬ážááá¯ááẠááŸá¬ááœá±ááá¯ááºáááºá ááá¯ááá¯á·áá±á¬ááœá±á·ááŸááá»ááºáá»á¬ážááẠá¡ááœááºá áááºáááºá á¬ážá áá¬áá±á¬ááºážáá«áááºá
á¡áááºááŒá±á¬áá·áºá¡ááŒá¬áž web scraper ááá¯á¡ááºááááºážá
áá»áœááºáá±á¬áº web scraping ááᯠá á áá»ááºážáá¯ááºážá ááá¯ážááá¯ážáá¬ážáá¬ážááŒá±á¬áááẠá¡á²áá«ááᯠááááºá áááºááááºá á¬ážáá«áá°ážá ááŒáá¯áááºááá·áºááŸááºážááŸá¯áá¯á¶á á¶á ááœá±ááŒá±ážááá¯ááºážááŒá¬ážá áááºááŒá¬ááŸá¯áááºáááºááœáẠááá±á¬áá»ááºáá»á¬ážááŸáá·áº á á¬áá¬ážáá»á¬ážá á áááºáá¶á á¬ážááŸá¯ááá¯ááºáᬠá¡áá±á¬ááºááŒááºááŒááºážááá¯á·ááᯠááá¯ááºážááŒá¬ážá áááºááŒá¬ááŒááºážáááºáááºááœáẠááŒá áºááá¯ááºááŒá±ááŸááá±á¬ ááá±á¬áá»ááºáá»á¬ážááᯠáá»áœááºááá¯ááºáá»ááºáááºá ááá¯á·áá±á¬áº áááºááá¯ááºáá»á¬ážá០áá±áá¬á á¯áá±á¬ááºážááá·áº áááá¯ááááºáá áºáá¯ááᯠáááºááá¯á·áááºáá®ážááááºááᯠá¡ááŒá±ááŸá¬ááẠá¡ááœááºá áááºáááºá á¬ážá áá¬áá±á¬ááºážááŒá±á¬ááºáž ááœááºáá±á«áºáá¬áá²á·áááºá á€á¡ááŒá±á¬ááºážá¡áá¬ááᯠá á±á·á á±á·á ááºá ááºáá±á·áá¬ááá·áºá¡áá«á web scraping ááẠá¡ááºáá¬áááºá "á¡ááºáá»ááº" ááŒá áºááŒá±á¬ááºáž ááá±á¬áá±á«ááºááá¯ááºáá«áááºá
á€á áá¬ážááẠáá²ááá·áºááœááºážáááºáᯠáááºáááºáá±áááºá ááá¯á·áá±á¬áº Google ááẠJava ááŸáá·áº Python ááᯠá¡áá¯á¶ážááŒá¯á Larry Page áááºáá®ážáá²á·áá±á¬ áááºááŒá áºááŒááºážá០á áááºáá²á·áááºááᯠáá¯á¶ážáááºááŒáá·áºáá«á Google á ááºáá¯ááºáá»á¬ážááẠáááºážáá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡á¬áž áááºážááá¯á·ááá±ážááœááºážáá»á¬ážá¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážá¡ááŒá±áá»á¬ážáá±ážááá¯ááºááẠá¡ááºáá¬áááºááᯠá á°ážá ááºážááŸá¬ááœá±áá»ááºááŸááááºá áááºááŒá áºááŒááºážááœáẠá¡áá¯á¶ážáá²á·á¡áá¯á¶ážááŒá¯ááŸá¯áá»á¬ážááŸáááŒá®áž Data Science ááœáẠá¡ááŒá¬ážá¡áá¬áá áºáá¯áá¯ááᯠáááºá áááºáááºá á¬ážáá«á áááºááœá²ááŒááºážá áááºááŒá¬ááẠááá¯á¡ááºáá±á¬áá±áá¬ááá¯áááŸáááẠááŒá áºáá¯ááºááŒááºážáá»áœááºážáá»ááºááŸá¯á¡áá»áá¯á· ááá¯á¡ááºáááºááŒá áºáááºá
áá®ááŸá¬áá¯á¶ážáá²á· áááºážááá¬á¡áá»áá¯á·ááᯠá¡á¶á·ááŒááœááºááœá±á·áá²á·ááááºá
ááá®ážááœá¬ážááᬠááŒáá¯ááºáá¬áž !
á€ááá¹áá áá±á«ááºážá ááºááœáẠáá±á¬áºááŒáá¬ážáá±á¬ ááá¯ážááŸááºážááŒá®áž á¡áá¹ááá¬ááºáááºážááá·áº áá±ážááœááºážá¡ááœááºá áááºážááᯠáá±ážáá²á·áá°á ááá®ážááœá¬ážááŒááºážá០áá¬ááºáááºážááŸá áºáá¯ááºááŸáá·áºá¡áá° á¡ááŒá¯ááá±á¬áá±á¬ááºáá±á¬ á¡ááŒá±áá áºáá¯ááᯠááẠáááŒá¬áá ááŒá¬ážááá¯ááºáááºá ááá®ážááœá¬ážááŒááºážááẠáááºáá»á±ážááŸá¯áááºáááºážáá»ááºá¡áá áºááœáẠááá·áºááá¯ááºááẠááŸá áºááŒáŸá¯ááºááŒá®áž áááºááá±áá¯ááºá ááºááá¯ááºážáá»á¬ážááᯠáá»á²á·ááœááºááẠáááºážáááºážáá±á¬ááºážáá áºáá¯ááŒá áºááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·á¡áá»á¬ážá á¯á ááá±á¬áá°áááºáá¶ááŒáááºá áá«áá±ááá·áº áá±ááŒá±á¬ááºážááá¯ááºážáááºááŸááºááœá±ááŸá¬ááá¬ááŒáá¯ááºáá¬ážááá¯á· áá áºáá±á¬ááºáá±á¬ááºááá¯áá±ážááẠá¡ááŒá±á áá®áá±á¬ááºá¡ááŒá¯ááá±á¬áá±á¬ááºááŸá¬ááá¯ááºáá°ážááá¯áᬠáá±áá»á¬áá«áááºá ááááºáá±á¬á· Python áᬠáá»áœááºáá±á¬áºááá¯á·áá²á· á¡áá°á¡áá®ááᯠáá®áá±áá¬ááá± áá±á¬ááºááŸááá¬áá«áááºá
áá±áá¬ááºáááºááŸááºáá»á¬ážááá¯ááºáᬠá¡áá»ááºá¡áááºááŸá¬ááœá±ááŒááºážá áá áºáá áºáᯠáááºáá®ážáá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááŒá±ááŸááºážáááá·áº ááááá¯á¶ážá¡áá¯ááºááŸá¬ ááááºážá¡áá»ááºá¡áááºááá°ááá·áº ááá·áºáá»á±á¬áºáá±á¬ááááºáá±á¬ááºážááᯠááœá±ážáá»ááºááŒááºážááŒá áºáááºá áá®ááŒá¿áá¬ááᯠááŒá±ááŸááºážááᬠáá»áœááºáá±á¬á·áºá¡ááœáẠáááœááºáá°áá±ááá·áº áá±á¬ááºáá¯á¶ážááŸá¬áá±á¬á· Kayak áááºáá±á¬ááºááŸá¯ááᯠááœá±ážáá»ááºáá²á·áá«áááºá Momondoá Skyscannerá Expedia ááŸáá·áº á¡ááŒá¬ážáááºáá±á¬ááºááŸá¯á¡áá»áá¯á·ááᯠáá«ááŒáá¯ážá á¬ážáá²á·áá±á¬áºáááºáž á€á¡áááºážá¡ááŒá áºáá»á¬ážáá±á«áºááŸá á ááºáá¯ááºáá¬ááœááºáá±ážááá¹ááá¬ážáá»á¬ážááẠáááºážááá¶ááá¯ááºáá±á¬á·áá±á áá®ážááœáá¯áá·áºáá»á¬ážá áá°áá°ážáá»ááºážááŒá¬ážáá»á¬ážááŸáá·áº á ááºáá®ážáá»á¬ážááᯠááá¯ááºááœááºááŒá±ááŸááºážááẠá¡ááŒáááºááŒáááºááŒáá¯ážá á¬ážááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááẠáá°áá¬ážááŒá áºááŒá±á¬ááºáž á áá áºáá»á¬ážááᯠááœá²áá±á¬ááºááá¯ááºááẠááŒáá¯ážá á¬ážáá²á·áá±á¬áºáááºáž á á¬áá»ááºááŸá¬áá»á¬ážá áœá¬áááºáá±áá±á¬áºáááºáž Kayak ááẠáá»áœááºá¯ááºá¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážááŒá áºáááºáᯠáá¯á¶ážááŒááºáá²á·áááºá á¡áá»áááºááá¯á¡ááœááºáž á á áºáá±ážááŸá¯áá»á¬ážáááºáž á áááºáááºá áá±á¬á·ááºááẠááá¯ááºááᯠ4 áá¬áá®á០6 áá¬áá®ááŒá¬ážáá¬áááœáẠáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá±ážááá¯á·ááá¯ááºáá²á·ááŒá®áž á¡áá¬á¡á¬ážáá¯á¶áž á¡áááºááŒá±áá²á·áááºá á¡áá«á¡á¬ážáá»á±á¬áºá áœá¬á Kayak ááŸáá·áºá¡áá¯ááºáá¯ááºáá±á¬á¡áá«ááœááºá¡áááºá¡áá²áá»á¬ážááŒá áºáá±á«áºáá¬áá±á¬áºáááºážáááºážááá¯á·áááºááá·áºá¡á¬ážá á áºáá±ážááŸá¯áá»á¬ážááŒáá·áºá áááºááŸá±á¬áá·áºááŸááºáá«áá áááºážááá¯á·ááá¯áááºááŒáá·áºááá¯ááºááœááºááŒá®ážáá±á¬áẠbot ááá¯ááœáá·áºáááºááá¯áááºá ááá¯á·ááá¯ááºáá¬áá®á¡áááºážáááºá á±á¬áá·áºááá¯ááºážááŒá®ážá á áºáá±ážááŸá¯áá»á¬ážáááºááá·áºááá·áºáááºá ááá¯á¡ááºáá«áá áááºááẠá¡ááŒá¬ážááááºáá±á¬ááºážá¡ááœáẠáá¯ááºááᯠá¡ááœááºááá° ááá¯ááºáá»á±á¬áá®ááœá±ááŒá áºá¡á±á¬áẠááŒá¯áá¯ááºááá¯ááºááŒá®áž á¡áááºá áááºááẠáááºážááᯠááŸááºáá»ááºáá»á¬ážááœáẠááá¯ááºááŒá¬ážááá¯ááºáá«áááºá
á¡áááºá áááºááẠáááºááŒá áºááŒááºážááᯠá áááºáá¯ááºáá±á¬ááºáá±ááŒá®áž á¡áá»áá¯á·áá±á¬áááºááá¯ááºáá»á¬ážá áááºážááᯠá¡áááºááŒá±á¬áá·áº áá¯ááºážáááºáá±ááááºááᯠááááá«áá áááºááẠá€áááºáááºááœáẠáááºá ááááá¯á¶áž ááá±á¬áá»ááºááᯠáá áááºáá®á ááá·áºááá¯ááºááẠááŸá áºáááºááá±á¬áá»ááŒá®áž "web scraping etiquette" áá°áá±á¬ á áá¬ážáá¯á¶ážáá»á¬ážááŒáá·áº Google ááᯠááŸá¬ááœá±áá«á . á¡áááºá áááºááẠáááºááᯠááá¬áá²á·á áœá¬ ááŒá¯ááºážáá®ážáá«á áááºáááºáááºááẠá á±á¬á á®ážá áœá¬ ááŒá®ážáá¯á¶ážááœá¬ážááá¯ááºáááºá
á áááº
á€áááºááŸá¬ áá»áœááºá¯ááºááá¯á·á áááºááŒá áºáá¬áá¯ááºááœáẠááŒá áºáá»ááºááá·áºá¡áá¬áá»á¬ážá áá±áá¯áá»ááŒá¯á¶áá¯á¶áá¯á¶ážáááºáá»ááºááŒá áºáááº-
- ááá¯á¡ááºáá±á¬ á á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠáááºááœááºážáá«á
- Google Chrome áááºááºááá¯ááœáá·áºááŒááºážá
- áááºááŸááºááŸá¬ááœá±áá¬ááœáẠá¡áá¯á¶ážááŒá¯ááá·áº ááŒáá¯á·áá»á¬ážááŸáá·áº áááºá áœá²áá»á¬ážááᯠááŒááºá bot ááᯠá áááºááá·áº áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá¯áá«á
- á€áá¯ááºáá±á¬ááºáá»ááºááẠááááá¯á¶ážááŸá¬ááœá±ááŸá¯ááááºáá»á¬ážááᯠáá°áá±á¬ááºáᬠá¡áá±á¬ááºážáá¯á¶ážááŒáá·áº á á®áá¬ážáᬠáá±á¬ááºáááºááááºáá»á¬ážááᯠáááºááẠááá¯ááºáá áºáá¯ááᯠááŸáááºáá«á
- á¡ááŒá¬ážáá¯ááºáá±á¬ááºáá»ááºááẠá á¬áá»ááºááŸá¬áá áºáá¯áá¯á¶ážá០áá±áá¬áá»á¬ážááᯠá á¯áá±á¬ááºážááŒá®áž áá±áá¬áá±á¬ááºáá áºáá¯ááᯠááŒááºáá±ážáááºá
- ááááºá¡ááá·áºááŸá áºááá·áºááᯠáááºááŸááºá á»á±ážááŸá¯ááºáž (áá»áá¯áá¬áá±á¬) ááŸáá·áº áá±áá¬ááºá¡ááŒááºááŸá¯ááºáž (á¡ááŒááºáá¯á¶áž) ááŒáá·áº á¡áá»áá¯ážá¡á á¬ážááœá²ááŒááºážááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá
- script ááá¯á¡áá¯á¶ážááŒá¯áá°ááẠáááºááŸááºá á»á±ážááŸá¯ááºážáá»á¬áž (á¡áá±á«áá¯á¶ážáááºááŸááºáá»á¬ážááŸáá·áº áá»ááºážáá»áŸá á»á±ážááŸá¯ááºáž) á¡áá»ááºážáá»á¯ááºáá«ááŸááá±á¬ á¡á®ážáá±ážááºáá áºá á±á¬áẠáá±ážááá¯á·ááŒá®áž á¡áááºáá±á¬áºááŒáá« á¡ááœáŸááºážáá¯á¶ážáá¯ááŒáá·áº á á®áá¬ážáá±á¬ á¡áá»ááºá¡áááºáá±á¬ááºááᯠExcel ááá¯ááºá¡ááŒá Ạááááºážáááºážáá¬ážáááºá
- á¡áááºáá±á¬áºááŒáá« áá¯ááºáá±á¬ááºáá»ááºá¡á¬ážáá¯á¶ážááᯠáááºááŸááºáá¬ážáá±á¬ á¡áá»áááºáá¬ááá áºáá¯ááŒá®ážáá±á¬áẠáááºáááºááŸá¯áá áºáá¯ááœáẠáá¯ááºáá±á¬ááºáááºá
Selenium ááá±á¬áá»ááºááá¯ááºážááẠáááºáááá¯ááºáá¬áá
áºáá¯ááŒáá·áº á
áááºáááºááᯠáááááŒá¯ááá·áºáááºá áá«áá¯á¶ážáááºá
áá»áœááºá¯ááºááá¬ááºáááºážááœáẠáá±áá¬ááºáááºááŸááºáá»á¬ážá áœá¬ááᯠááŸá¬ááœá±ááŒááºážá¡ááœáẠááá¯ážáá¯ááºá ááºááá¯ááºážá¡áá áºáá»á¬ážááœáá·áºááẠáááŒáá¯ážá á¬ážááŒá±á¬ááºáž áááááá«á ááá¯ááá¯á·áá±á¬áááºážááŸááºážáá»ááºáá»á¬ážááá¯ááŸá¬ááœá±ááẠááá¯ááá¯á¡ááá·áºááŒáá·áºáá±á¬áááºážáááºážáá»á¬ážá áœá¬ááŸááá«áááºá á€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááẠááá¯ážááŸááºážáá±á¬áºáááºáž áááºááœá±á·áá»áá±á¬ á€á¡ááŒá±á¬ááºážá¡áá¬ááᯠá á¬áááºáá°áá»á¬ážá¡á¬áž áá»áœááºá¯ááºáááºááŒááá¯áá«áááºá
áá«ááá±á¬á· á¡áááºááŸá¬ááŒá±á¬áá²á·áá²á· code áá«á
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
ááŸá¬ááœá±ááŸá¯á¡áá
áºáá
áºáá¯áá
áááºáá® bot ááᯠáá»áááºážá
áá¹ááá·áºáá»á¬ážá
áœá¬ááŒá¬á¡á±á¬áẠâá¡áááºáá»á±á¬áºá
á±áááºâ ááŒá
áºá¡á±á¬ááºáá¯ááºáááºá á¡áá»á¬ážá¡á¬ážááŒáá·áºá bot áá
áºáá¯á áá«ááá¯ááá«áá² ááá¯ááºááá¯ááºáá°ážá á¡áááºáá±á¬áºááŒáá« áá¯ááºááᯠáááºáá¯ááºáá±á¬ááºáá«áá ááá¯ááºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááẠbot á á¡áá¯á¶ážááŒá¯ááá·áº Chrome áááºážááá¯ážáá
áºáᯠááœáá·áºáá¬áááºááŒá
áºáááºá
á ááºážáááºááŸá¯á¡áááºážáááºáá¯ááºáᬠkayak.com áááºááá¯ááºááᯠáá®ážááŒá¬ážáááºážááá¯ážáá áºáá¯ááœáẠááœáá·áºááŒáá«á áá¯á·á áá»á¶áááºážááá·áºááŒáá¯á·á ááá¯ááºááœá¬ážáá»ááºáá²á·ááŒáá¯á·á¡ááŒáẠáá»á¶áááºážááá·áºáááºááœá±ááᯠááœá±ážáá±ážáááºá áááºá áœá²áá»á¬ážááᯠááœá±ážáá»ááºááá·áºá¡áá« +-3 áááºá¡ááœá¬á¡áá±ážááᯠá¡áá¯á¶ážááŒá¯ááŒá±á¬ááºáž áá±áá»á¬áá«á á±á áá®ááá¯áá±á¬ááºážááá¯ááŸá¯ááœá±ááᯠáá¯á¶á·ááŒááºáá²á·á¡áá±áá²á· áááºááá¯ááºá áá¯ááºáá¯ááºáá¬ááœá±ááᯠááá·áºááœááºážá ááºážá á¬ážááŒá®áž áá¯ááºááᯠáá±ážáá²á·áá«áááºá á¥ááá¬á¡á¬ážááŒáá·áº áááºááẠáááºááŸááºáá¬ážáá±á¬ áááºá áœá²áá»á¬ážá¡ááœááºáᬠáááºááŸááºáá»á¬ážááᯠááŸá¬ááœá±ááẠááá¯á¡ááºáá«áá áááºááẠbot áá¯ááºááᯠááŒááºáááºááẠááŒá áºááá¯ááºááŒá± ááŒáá·áºáá¬ážáááºá áá¯ááºá¡ááŒá±á¬ááºážááŒá±á¬áá²á·á¡áá« ááá·áºáá»á±á¬áºáá²á·ááŸááºážááŒáá»ááºááœá±áá±ážáá«áááºá áá«áá±ááá·áº áááºážá áááºááŸá¯ááºáááºááá¯ááẠáá«á·ááᯠá¡áááá±ážáá«á
ááᯠááŸá¬ááœá±ááŸá¯ááá¯ááºááᯠááŸáááºááŒá®áž ááááºá
á¬áá¬ážááŸá ááá·áºááºááᯠááŒáá·áºááŸá¯áá«á áááºážááẠvariable ááá¯ááŒá±ááŒá¬ááá·áºá¡á±á¬ááºáá«á¥ááá¬ááœááºáá»áœááºá¯ááºá¡áá¯á¶ážááŒá¯áá±á¬ááá·áºááºááŸáá·áºáááºáá°ááá·áºáááºá kayak
URL ááᯠááááºážáááºážáá±ážáá±á¬á ááŸáá·áº áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯áááºá get
web driverá ááŸá¬ááœá±ááŸá¯ááá¯ááºááᯠááŸáááºááŒá®ážáá±á¬áẠááááºáá»á¬ážááẠá
á¬áá»ááºááŸá¬áá±á«áºááœáẠáá±á«áºáá¬áááºááŒá
áºáááºá
áá« command ááá¯áá¯á¶ážáá²á·á¡áá« get
áááá
áºá¡áááºážáááºá¡ááœááºáž ááŸá
áºááŒááẠááá¯á·ááá¯áẠáá¯á¶ážááŒáááºáááºááá reCaptcha ááᯠá¡áá¯á¶ážááŒá¯á á¡áááºááŒá¯áá»ááºááᯠá¡ááŒá®ážáááºááẠáá»áœááºá¯ááºááᯠáá±á¬ááºážááá¯áá²á·áááºá á€á
á
áºáá±ážááŸá¯ááᯠáááºááá¯ááºááá¯ááºáá»á±á¬áºááŒááºááá¯ááºááŒá®áž á
áá
áºá¡áá
áºáá
áºáá¯á
á
áºáá±ážááẠáá¯á¶ážááŒááºáááºá¡áá á
ááºážáááºááŸá¯ááᯠáááºáááºáá¯ááºáá±á¬ááºááá¯ááºáááºá áá¬ááºááœáŸááºážááᯠáá»áœááºá¯ááºá
ááºážáááºáá±á¬á¡áá«á áááááŸá¬ááœá±ááŸá¯ááá¹áááẠá¡ááŒá²áááºážáá»á±á¬ááœá±á·áá±áá¯á¶áá±á«áºáááºá ááá¯á·ááŒá±á¬áá·áº áááºááẠáá¯ááºááᯠá
ááºážáááºááá¯áá«áá ááŸá¬ááœá±ááŸá¯ááá¹ááá»á¬ážááŒá¬áž áá¬áááŸááºááŒá¬á
áœá¬ ááŒá¬ážáá¬ááá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºááᯠá¡áá»áááºá¡áá«á¡ááá¯áẠááá¯ááºááá¯ááºá
á
áºáá±ážááŒá®áž áá¯ááºááᯠáááºáááºááœáá·áºááŒá¯ááẠááá¯á¡ááºáá«áááºá áááºážááá¯áááºá
ááºážá
á¬ážáá«áá ááŸá¬ááœá±ááŸá¯áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááŒá¬áž 10 áááá
áºááŒá¬ážáá¬áááœááºáááŸááá±á¬áááºááŸááºá
á»á±ážááŸá¯ááºážáá»á¬ážááŸáá·áºáááºáááºáá±á¬á¡áá»ááºá¡áááºáá»á¬ážááá¯áá°áá
áºáŠážááŸáááá¯á¡ááºáá«á
XPath ááᯠá¡áá¯á¶ážááŒá¯á á á¬áá»ááºááŸá¬áá áºáá¯ááŸáá·áº á¡áá¯ááºáá¯ááºááŒááºážá
áá®áá±á¬á· áá»áœááºáá±á¬áºááá¯á· áááºážááá¯ážáá
áºáá¯ááœáá·áºááŒá®áž ááá¯ááºááᯠáááºááá¯ááºáááºá á
á»á±ážááŸá¯ááºážááŸáá·áº á¡ááŒá¬ážá¡áá»ááºá¡áááºáá»á¬ážááᯠááá°ááẠXPath áááºážááᬠááá¯á·ááá¯áẠCSS ááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠááá¯á¡ááºáá«áááºá XPath áá²á· áááºááá¯á· áá¯á¶ážááŒááºáá²á·ááŒá®áž CSS Selectors ááœá±ááᯠá¡áá¯á¶ážááŒá¯ááá¯á· áááá¯á¡ááºáá°ážááá¯á· áá¶á
á¬ážááá±ááá·áº á¡á²áá®á¡ááá¯ááºáž áá¯ááºáá±á¬ááºááá¯á· á¡áá±á¬áºáá±áž ááŒá
áºááá¯ááºáááºá XPath ááᯠá¡áá¯á¶ážááŒá¯á á
á¬áá»ááºááŸá¬áá
áºááá¯ááºááœáẠááœá¬ážáá¬ááẠáááºáá²ááá¯ááºááŒá®áž áá»áœááºá¯ááºá áá±á¬áºááŒáá¬ážáá±á¬ áááºážááá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá»áŸááºáááºá
áá®áá±á¬á· bot ááᯠáááºááŒá®áž á¡áá¯ááºáá¯ááºááŒáá¡á±á¬ááºá á
á»á±ážá¡áááºáá¬áá¯á¶áž áááºááŸááºáá»á¬ážááᯠááœá±ážáá»ááºááẠáááá¯ááááºá á
áœááºážáá±á¬ááºáááºááᯠá¡áá¯á¶ážááŒá¯ááŒáá«á
áá¯á·á á¡á±á¬ááºáá«áá¯á¶ááœááºá XPath ááœá±ážáá»ááºááŸá¯áá¯ááºááᯠá¡áá®áá±á¬ááºááŒáá·áº áá®ážáá±á¬ááºážááá¯ážááŒáá¬ážáááºá áá¯ááºááá¯ááŒáá·áºáááºá¡ááœáẠáááºá
áááºáááºá
á¬ážááá·áº á
á¬áá»ááºááŸá¬á¡á
áááºá¡ááá¯ááºážáá±á«áºááœáẠáá¬áááºááá
áºááŸáááºááŒá®áž áá±á«áºáá¬ááá·áºáá®áá°ážá០á
á
áºáá±ážáá±ážá¡áááá·áºááᯠááœá±ážáá»ááºááẠááá¯á¡ááºáááºá á€á¡áááá·áºááᯠáá¯ááºááŒáá·áºááŸá¯áá°ááœáẠááŒáááŒá®áž áá®ážáá±á¬ááºážááá¯ážááŒááá·áº áá¯ááºááᯠááá°áá®áá±á¬ á
á¬áá»ááºááŸá¬á¡á
áááºá¡ááá¯ááºážáá»á¬ážá¡ááœáẠáá±á«áºááá¯ááá¯ááºáá«áááºá
á
á¬áá»ááºááŸá¬áá¯ááºááá¯ááŒáá·áºáá«á
áá¯ááºá០ááœá±ážáá»ááºáá°áá»á¬ážááᯠáá°ážáá°ááŒááºážá á¡á¬ážáááºážáá»ááºáá»á¬ážááŸáá·áº áááºáááºá áá»áœááºá¯ááºá áá»áá¯ážááŒá±á¬ááºážáááºááŒááºááŸá¯ááᯠá¡áááºááŒá¯ááá¯ááºáááºá á¡á±á¬ááºáá«á¡ááºá¹áá«áááºáá»á¬ážááᯠá¡á¬áá¯á¶á áá¯ááºáá«á
áá¯ááºááᯠáááá¹áá°áá°ážáá±á¬á¡áá« á€á¡áá¬ááẠáááºáááŸáááẠá
//*[@id="wtKI-price_aTab"]/div[1]/div/div/div[1]/div/span/span
á€áá²á·ááá¯á·áá±á¬á¡áá¬áá áºáá¯áá¯ááá¯áá°ážáá°áááºá¡ááœááºá áááºá áááºáááºá á¬ážáá±á¬áá¯ááºáááá¹áááá¯áá¬áááºááá áºááŸáááºááŒá®ážáá±á«áºáá¬ááá·áºáá®áá°ážá០Copy> Copy XPath command ááá¯ááœá±ážáá»ááºáááºááá¯á¡ááºáááºá
á€áááºááŸá¬ á á»á±ážá¡áááºáá¬áá¯á¶ážááá¯ááºááᯠáá«áááºááŸááºáááºá¡áá¯á¶ážááŒá¯áá²á·ááá·áºá¡áá¬ááŒá áºáááº-
cheap_results = â//a[@data-code = "price"]â
Command ááᯠáá±á¬áºáá® > XPath ááᯠáá°ážáá°áá«á
áá¯áááááœá±ážáá»ááºááŸá¯ááŸá¬ ááá¯ááá¯ááá¯ážááŸááºážáá¯á¶ááááºááŸá¬ áááºááŸá¬ážáá«áááºá á¡áá¯á¶ážááŒá¯áá±á¬á¡áá«ááœááºá áááºážááẠattribute áá«ááŸááá±á¬ element áá
áºáá¯ááᯠááŸá¬ááœá±áááºá data-code
, áááºážáá° price
. áááááœá±ážáá»ááºááŸá¯ááá¯á¡áá¯á¶ážááŒá¯áá±á¬á¡áá«á á¡á
áááºá¡ááá¯ááºážááá¯ááŸá¬ááœá±áááºá id
ááŸáá·áº áá®áá»áŸáááºá wtKI-price_aTab
á ááŸáá·áº á¡á
áááºá¡ááá¯ááºážááá¯á· XPath áááºážááŒá±á¬ááºážááẠáá¯á¶ááááºá /div[1]/div/div/div[1]/div/span/span
. á
á¬áá»ááºááŸá¬áá
áºáá¯ááá¯á· á€áá²á·ááá¯á·áá±á¬ XPath áá±ážááŒááºážááŸá¯áá
áºáá¯ááẠááŸáá·áºááœááºááᯠáá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž áá
áºááŒáááºáᬠáá¯ááºáá±á¬ááºááá¯ááºáááºááŒá
áºáááºá á¡á²áá«ááᯠá¡áá¯áá² ááŒá±á¬ááá¯ááºáááºá id
á
á¬áá»ááºááŸá¬ááᯠáá±á¬ááºáá
áºááŒááẠáááºááá·áºá¡áá«ááœáẠááŒá±á¬ááºážáá²áá«áááºá á¡áá¹ááᬠá¡á
á®á¡á
á¥áº wtKI
á
á¬áá»ááºááŸá¬ááᯠáááºááá¯ááºáž ááá¯ááºážááá
áºááŒáá·áº ááŒá±á¬ááºážáá²áááºá ááá¯á·ááŒá±á¬áá·áº áááºážááᯠá¡áá¯á¶ážááŒá¯ááá·áº áá¯ááºááẠáá±á¬ááºá
á¬áá»ááºááŸá¬ááᯠááŒááºáááºá
áááºááŒá®ážáá±á¬áẠá¡áá¯á¶ážááááºáá±á¬á·áá«á áá«ááŒá±á¬áá·áº XPath ááᯠáá¬ážáááºááá¯á· á¡áá»áááºá¡áááºážáááºáá°áá«á á€á¡ááááá¬ááẠááá·áºá¡á¬áž áá±á¬ááºážááœááºá
áœá¬ á¡áá»áá¯ážááŒá¯áááá·áºáááºá
ááá¯á·áá±á¬áºá XPath ááœá±ážáá±ážáá°áá»á¬ážááᯠáá°ážáá°ááŒááºážááẠááá¯ážááá¯ážááŸááºážááŸááºáž ááá¯ááºáá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºáá¬ááœáẠá¡áá¯á¶ážáááºááá¯ááºáááºá áááºážááŸáá·áº á¡áááºááŒá±áá«á áááºážááŸáá·áº áááºáááºá á¡ááŸá¬ážá¡ááœááºážáááŸááá±á
á
á¬áááºážáá
áºáá¯á¡ááœááºážá á
á¬ááŒá±á¬ááºážáá»á¬ážá
áœá¬ááŒáá·áº ááŸá¬ááœá±ááŸá¯ááááºá¡á¬ážáá¯á¶ážááᯠááá°ááá¯áá«á ááᯠáá¬áá¯ááºááááºááᯠá
ááºážá
á¬ážááŒáá·áºááŒáá«á
áá¯á·á á¡ááœááºááá¯ážááŸááºážáá«áááºá ááááºáá
áºáá¯á
á®ááẠclass áá
áºáá¯áá«ááŸááá±á¬ object áá
áºáá¯á¡ááœááºážááŒá
áºáááºá resultWrapper
. ááááºá¡á¬ážáá¯á¶ážááᯠá¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááŸáá·áº áááºáá°áá±á¬ á¡ááœááºáá
áºáá¯ááœáẠáá¯ááºáá±á¬ááºááá¯ááºáááºá
á¡áááºáá±á¬áºááŒáá«áá»á¬ážááᯠáá¬ážáááºáá«áá áá»áœááºá¯ááºááá¯á·ááœá²ááŒááºážá
áááºááŒá¬ááá·áº áá¯ááºá¡áá»á¬ážá
á¯ááᯠá¡ááœááºááá° áá¬ážáááºááá¯ááºáááºááŒá
áºááŒá±á¬ááºáž áááááŒá¯ááá·áºáááºá á€áá¯ááºá¡áá¯ááºáá¯ááºáááºááŸáá·áºá¡áá»áŸá áá»áœááºá¯ááºááá¯á·ááẠáááºážááŒá±á¬ááºážáááºááŸááºááŒááºážááá¹ááá¬áž (XPath) áá
áºáá»áá¯ážáá»áá¯ážááᯠá¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºááá¯á· ááá¯á¡ááºááẠ(á¡ááŸááºááŸá¬á ááááºááᯠáá¯ááºááá¯ážáá¬ážááá·áº ááŒááºá
ááº) ááᯠááá°áá¯á¶ážá
áœá²áá«áááºá á€á¡áá¬ááẠááŒááºá
ááºá á
á¬áá¬ážááᯠááá°ááŒá®áž áá±áá¬áááºááŸá¯ááá¯ááºááá·áº á¡áá¬ááá¹áá¯áá
áºáá¯ááœáẠáá¬ážáááºá¡ááá¯á·ááŸá¬ áááºážááᯠáá¯ááºáá±á¬ááºááẠ(áááá¡áá¯á¶ážááŒá¯ááẠflight_containers
ááá¯á·áá±á¬áẠ- flights_list
).
áááá
á¬ááŒá±á¬ááºážáá¯á¶ážááŒá±á¬ááºážááᯠááŒááá¬ážááŒá®áž áá»áœááºá¯ááºááá¯á·ááá¯á¡ááºááá»áŸááᯠááŸááºážááŸááºážáááºážáááºážááŒááºááá¯ááºáááºá ááá¯á·áá±á¬áºá áá»áœááºá¯ááºááá¯á·ááœáẠááááºážá¡áá»ááºá¡áááºáááŸáááẠááá¯ááá¯á
áááºáááºá
á¬ážááœááºáááºážáááºážáá»á¬ážááŸááááºá áá»áœááºá¯ááºááá¯á·ááẠááŒááºá
ááºáá
áºáá¯á
á®á០áá±áá¬ááᯠáá®ážááŒá¬ážá
á®áá°ááẠááá¯á¡ááºáááºá
á¡áá¯ááºááœá¬ážáá«á
áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯áá±ážááẠá¡ááœááºáá°áá¯á¶ážáááºážáááºážááŸá¬ á¡ááá¯ááááºáá»á¬ážááᯠáááºáááºááŒá
áºáááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á· á
áááºáá«áááºá á
á
áºáá±ážááŒááºážáá®ááá¯á· áŠážáááºá
á±áá±á¬ áááºáá±á¬ááºááŸá¯ááœáẠáá¶áááá»á¬áž áááŒáá² áááá¯ááááºá០áááŸáááá·áº áá»á¶áááºážááŸá¯ á¡áá±á¡ááœááºááᯠá¡áá»á¬ážáá¯á¶áž áá»á²á·ááœááºááá¯áááºá ááá¯á·ááŒá±á¬áá·áº á
á¬áá»ááºááŸá¬ááᯠááŒáááá·áºá¡áá«ááá¯ááºáž Load more results ááá¯ááºááᯠááŸáááºááá¯ááºáá«áááºá á€áá¯ááºááœááºá áááºááẠblock ááá¯á¡á¬áá¯á¶á
áá¯ááºááá·áºáááºá 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
ááᯠá€áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá»áááºá¡áá±á¬áºááŒá¬ ááœá²ááŒááºážá áááºááŒá¬ááŒá®ážáá±á¬áẠ(áá áºáá«áá áºáᶠáá»áœááºáá±á¬áº áááºáá±á¬ááºááœá¬ážááá¯ááºáá«áááº)á áá»áœááºá¯ááºááá¯á·ááẠá á¬áá»ááºááŸá¬ááᯠááŒá áºáá¯ááºááá·áº áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯ááᯠááŒá±áá¬ááẠá¡áááºááá·áºááŒá áºáá±áá«ááŒá®á
á¡á±á¬ááºáá« function áá¯áá±á«áºáá±á¬ ááá¯á¡ááºáá±á¬á¡áá¬á¡áá»á¬ážá
á¯ááᯠáá»áœááºá¯ááºá
á¯áá±á¬ááºážáá¬ážááŒá®ážááŒá
áºáááºá 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
- áá¯áááá áá±á¬ááºáá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯ááá¯á· áááºááœá¬ážááŒáá«á
áá¯á·á
á¡áá±á¬ááºá¡áá¶á· ááá¹ááá¬ážáá»á¬áž
ááᯠáá»áœááºá¯ááºááá¯á·ááœáẠáá±á¬ááºááẠááŸá¬ááœá±ááŸá¯ááááºáá»á¬ážááᯠáááºáááºááŸáá·áº ááá¯ááááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠáá¯ááºáá±á¬ááºááá¯ááºááá·áº áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯ááŸááááºá á€áá¯ááºáá±á¬ááºáá»ááºááŸá
áºáá¯ááẠáááºááá¯ááºááá¯ááºááœáá·áºááá¯ááºáá±á¬ á
á¬áá»ááºááŸá¬áá»á¬ážááᯠááŒá
áºááẠááá¯á¡ááºááá·áºá¡áá¬á¡á¬ážáá¯á¶ážááᯠáá±ážá
áœááºážááá¯ááºáá±á¬ááŒá±á¬áá·áº á€áá±á¬ááºážáá«ážááẠá€áá±áá¬ááœáẠááŒá®ážáá¯á¶ážááœá¬ážááá¯ááºáá«áááºá áá«áá±ááá·áº á¡áááºááŸá¬ ááœá±ážááœá±ážáá²á·áá²á· á¡áááºááá¹ááá¬ážá¡áá»áá¯á·ááᯠáá»áœááºáá±á¬áºááá¯á· áá
ááºážá
á¬ážáá±ážáá«áá°ážá á¥ááá¬á¡á¬ážááŒáá·áºá á€áááºááŸá¬ á¡á®ážáá±ážááºááá¯á·ááŒááºážá¡ááœáẠáá¯ááºááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážááŒá
áºáááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠfunction ááœááºááœá±á·ááá¯ááºáááºá 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) ááᯠá¡áá¯á¶ážááŒá¯á ဠscript ááᯠá ááºážáááºáá²á·áááºá Gmail á¡áá±á¬áá·áºáá áºáá¯ááŒáá·áº ááŸááºáááºá áœá¬ á¡áá¯ááºáá¯ááºááẠáááºážááᯠáá»áœááºá¯áẠáá ááºážáááºááá±ážáá«á á€á¡á®ážáá±ážááºá áá áºááẠá¡áá±á¬áºáá±áž áá±áááºážá á¬ážáá±á¬áºáááºáž ááŒá áºááá¯ááºáá±á¬ ááœá±ážáá»ááºá áá¬áá»á¬ážá áœá¬ááŸááá«áááºá á¡áááºá áááºááẠHotmail á¡áá±á¬áá·áºááᯠá¡áá¯á¶ážááŒá¯áá«á á¡áá¬á¡á¬ážáá¯á¶áž á¡áááºááŒá±á á±áááºá¡ááœáẠááá·áºáá±áá¬ááᯠáá¯ááºáá²ááá¯á· ááá·áºáááºáᬠááá¯á¡ááºáá«áááºá
á€áá¯ááºáá±á¬ááºáá»ááºá¡ááœáẠáá¯ááºá áááºááŸááºáá¬ážáá±á¬ ááá¹ááá»á¬ážááœáẠáá¯ááºáá±á¬ááºáá±áááºáá»á¬ážááᯠá¡ááá¡áá» áá¬ážáááºááá¯áá«á áááºážááá¯á·ááᯠáá°ážáá°ááŒá®áž áááºážááá¯á·ááŸáá·áº á ááºážáááºááá¯ááºáá«áááºá áá¯ááºááᯠá ááºážáááºááŒááºážááẠáááºážááᯠá¡ááŸááºáááẠáá¬ážáááºááẠáá áºáá¯áááºážáá±á¬ áááºážáááºážááŒá áºáááºá
á¡áááºááá·áºááŒá áºáá±áá«ááŒá®á
ááá¯áá»áœááºá¯ááºááá¯á·ááŒá±á¬áá²á·ááá»áŸá¡á¬ážáá¯á¶ážááŒá®ážáá«ááŒá®á áá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááá¯áá±á«áºááá¯áá±á¬ááá¯ážááŸááºážáá±á¬ loop áá áºáá¯ááá¯áááºáá®ážááá¯ááºáá«ááŒá®á Script ááẠááŒáá¯á·áá»á¬ážááŸáá·áº áááºá áœá²áá»á¬ážá¡ááŒá±á¬ááºáž á¡áá¯á¶ážááŒá¯áá°áá¶á០á¡áá»ááºá¡áááºááᯠáá±á¬ááºážááá¯áá«áááºá script ááᯠá ááºáááºáááŒáẠááŒááºáááºá áááºááŒááºážááŒáá·áº á ááºážáááºáá±á¬á¡áá«á áááºááẠá€áá±áá¬ááᯠá¡áá»áááºááá¯ááºážááœáẠááá¯ááºááá¯ááºááá·áºááœááºážááá¯áááºááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áº á ááºážáááºáá»áááºá¡ááœáẠáááºááá¯ááºáᬠá á¬ááŒá±á¬ááºážáá»á¬ážááᯠáááºážááá¯á·á¡á±á¬ááºááŸá ááá¯á¡ááºáá»ááºáá»á¬ážááᯠááŸááºáá»ááºááá±ážáá² ááŸááºáá»ááºáá±ážááŒááºážááŒáá·áº ááŸááºáá»ááºáá±ážááá¯ááºáá«áááºá script ááᯠhardcode áá¯ááºáá¬ážáááºá
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.....')
á€á¡áá¬ááẠáá¬ááºááœáŸááºážá á
ááºážáááºááŒá±ážáá¯á¶ááŒá
áºáááºá
Script áá
ááºážáááºááŸá¯
ááááºáá»á¬ážááá¯
áá®áá±á¬ááºááá¡á±á¬ááºááá¯ááºáá²á·ááẠáá¯ááºáá°áá«áááºá áá»áœááºá¯ááºááẠáááºážááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬áẠáá¯ááºáá±á¬ááºááẠáááºážáááºážáá»á¬ážá áœá¬ááᯠááœá±á·ááŒááºááá¯ááºáá±á¬áºáááºáž ááᯠááá·áºááœáẠá¡áá¯ááºáá¯ááºáá±á¬ áááºááŒá áºáááááá¬áá áºáᯠááŸááá±ááŒá®ááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºážááᯠá¡á®ážáá±ážááºáá»á¬ážá¡á á¬áž á á¬áá¬ážáááºáá±á·ááºá»áá±ážááá¯á·ááá¯ááºááẠTwilio ááŸáá·áº áá±á«ááºážá ááºááá¯ááºáááºá áá¬áá¬áá»á¬ážá áœá¬á០ááááºáá»á¬ážááᯠáá áºááŒáá¯ááºááẠáááºáá¶áááŸáááẠVPN ááá¯á·ááá¯áẠá¡ááŒá¬ážáá áºáá¯áá¯ááᯠáááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá áááºááá¯ááºá¡áá¯á¶ážááŒá¯áá°ááᯠá á áºáá±ážáá¬ááœááºáááºáž á¡áá«á¡á¬ážáá»á±á¬áºá áœá¬ áá±á«áºáá±á«ááºáá¬áá±á¬ ááŒá¿áá¬áá áºáá¯áááºáž ááŸááá±á¬áºáááºáž áááºážááŒá¿áá¬ááá¯áááºáž ááŒá±ááŸááºážááá¯ááºáááºá áááºááá¯á·áááºááá¯á á±áá¬áá° ááᯠááá·áºááœáẠáááºááá¹áááŸááá»áŸáẠáá»á²á·ááœááºááá¯ááºáá±á¬ á¡ááŒá±áá¶áá áºáá¯ááŸááááºá á¥ááá¬á¡á¬ážááŒáá·áºá Excel ááá¯ááºááᯠá¡á®ážáá±ážááºááá¯á· áá°ážááœá²áá«ááá¯ááºá¡ááŒá Ạá¡áá¯á¶ážááŒá¯áá°áᶠáá±ážááá¯á·ááŒá±á¬ááºáž áá±áá»á¬áá«á á±á
á
á¬áááºážááœááºážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážáᬠá
á
áºáááºážááœáẠáá«áááºááá¯ááºáá«áááºá
áááºááŒá áºááŒááºážáááºážááá¬áá»á¬ážááᯠáááºá¡áá¯á¶ážááŒá¯áá«ááá¬ážá
-
ááá¯
-
á¡áááºáá°áá»áŸá
á¡áá¯á¶ážááŒá¯áá° áá áŠáž áá²áá±ážáá²á·áááºá á¡áá¯á¶ážááŒá¯áá° 8 áŠáž ááŸá±á¬ááºáá²á·áááºá
source: www.habr.com