ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi

ʻO ka mea kākau o ka ʻatikala, ʻo ka unuhi a mākou e paʻi nei i kēia lā, ʻōlelo ʻo kāna pahuhopu e kamaʻilio e pili ana i ka hoʻomohala ʻana i kahi scraper pūnaewele ma Python e hoʻohana ana iā Selenium, e ʻimi nei i nā kumukūʻai tiketi mokulele. Ke ʻimi nei i nā tiketi, hoʻohana ʻia nā lā maʻalahi (+- 3 mau lā e pili ana i nā lā i kuhikuhi ʻia). Mālama ka scraper i nā hualoaʻa ma kahi faila Excel a hoʻouna i ka mea nāna i holo i ka huli ʻana i leka uila me ka hōʻuluʻulu o nā mea i loaʻa iā lākou. ʻO ka pahuhopu o kēia papahana ʻo ia ke kōkua i ka poʻe huakaʻi e ʻimi i nā makana maikaʻi loa.

ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi

Inā, ʻoiai e hoʻomaopopo ana i ka mea, ua nalowale ʻoe, e nānā kēia ʻatikala.

He aha kā mākou e ʻimi ai?

Hiki iā ʻoe ke hoʻohana i ka ʻōnaehana i wehewehe ʻia ma aneʻi e like me kou makemake. No ka laʻana, ua hoʻohana au iā ia e ʻimi i nā huakaʻi huakaʻi hopena pule a me nā tiketi i koʻu kūlanakauhale hānau. Inā koʻikoʻi ʻoe i ka loaʻa ʻana o nā tiketi maikaʻi, hiki iā ʻoe ke holo i ka palapala ma ke kikowaena (maʻalahi kikowaena, no 130 rubles i ka mahina, kūpono loa ia no kēia) a e hōʻoia e holo hoʻokahi a ʻelua paha i ka lā. E hoʻouna ʻia nā hualoaʻa iā ʻoe ma ka leka uila. Eia kekahi, paipai wau i ka hoʻonohonoho ʻana i nā mea āpau i mālama ka palapala i kahi faila Excel me nā hopena ʻimi i loko o kahi waihona Dropbox, e hiki ai iā ʻoe ke nānā i kēlā mau faila mai nā wahi āpau a i kēlā me kēia manawa.

ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi
ʻAʻole i loaʻa iaʻu nā kumukūʻai me nā hewa, akā manaʻo wau he hiki

I ka ʻimi ʻana, e like me ka mea i ʻōlelo ʻia, hoʻohana ʻia kahi "lā maʻalahi"; ʻike ka palapala i nā makana i loko o ʻekolu lā o nā lā i hāʻawi ʻia. ʻOiai i ka holo ʻana i ka palapala, ʻimi ʻo ia i nā hāʻawi ma kahi ʻaoʻao hoʻokahi wale nō, maʻalahi ka hoʻololi ʻana i hiki iā ia ke hōʻiliʻili i nā ʻikepili ma nā kuhikuhi lele. Me kāna kōkua, hiki iā ʻoe ke ʻimi i nā kumukūʻai hewa; hiki ke hoihoi loa ia mau ʻike.

No ke aha ʻoe e makemake ai i kahi mea ʻoki pūnaewele ʻē aʻe?

I koʻu hoʻomaka ʻana i ka ʻili pūnaewele, ʻoiaʻiʻo, ʻaʻole wau i hoihoi nui iā ia. Makemake au e hana i nā papahana hou aʻe ma ke kahua o ka hoʻohālike wānana, ka nānā kālā, a, ma ke ʻano paha, ma ke ʻano o ka nānā ʻana i ke kala ʻana o nā kikokikona. Akā ua ʻike ʻia he mea hoihoi loa ke ʻike pehea e hana ai i kahi papahana e hōʻiliʻili i ka ʻikepili mai nā pūnaewele. I koʻu noʻonoʻo ʻana i kēia kumuhana, ʻike wau ʻo ka ʻili pūnaewele ka "engine" o ka Pūnaewele.

Manaʻo paha ʻoe he ʻōlelo wiwo ʻole kēia. Akā e noʻonoʻo ʻoe ua hoʻomaka ʻo Google me kahi scraper pūnaewele i hana ʻia e Larry Page me Java a me Python. Ke ʻimi nei nā robots Google i ka Pūnaewele, e hoʻāʻo ana e hāʻawi i nā mea hoʻohana i nā pane maikaʻi loa i kā lākou nīnau. Loaʻa nā hoʻohana pau ʻole o ka ʻili pūnaewele, a inā makemake ʻoe i kahi mea ʻē aʻe i ka ʻIkepili ʻIkepili, pono ʻoe i kekahi mau mākau ʻōpala no ka loaʻa ʻana o ka ʻikepili āu e pono ai ke kālailai.

Ua loaʻa iaʻu kekahi o nā ʻenehana i hoʻohana ʻia ma kahi nani ka puke e pili ana i ka ʻili pūnaewele, i loaʻa iaʻu i kēia manawa. He nui nā laʻana a me nā manaʻo maʻalahi no ka hoʻohana pono ʻana i nā mea āu i aʻo ai. Eia kekahi, aia kahi mokuna hoihoi loa e pili ana i ke kāʻei ʻana i nā loiloi reCaptcha. Ua hiki mai kēia ma ke ʻano he nūhou iaʻu, ʻoiai ʻaʻole wau i ʻike aia he mau mea hana kūikawā a me nā lawelawe holoʻokoʻa no ka hoʻoponopono ʻana i ia mau pilikia.

Makemake ʻoe e huakaʻi?!

I ka nīnau maʻalahi a maikaʻi ʻole i waiho ʻia ma ke poʻo o kēia ʻāpana, hiki iā ʻoe ke lohe pinepine i kahi pane maikaʻi, i hui pū ʻia me kekahi mau moʻolelo mai nā huakaʻi a ka mea i nīnau ʻia ai. ʻAe ka hapa nui o mākou he ala maikaʻi loa ka huakaʻi e hoʻolulu iā ʻoe iho i nā wahi moʻomeheu hou a hoʻonui i kou ʻike. Eia naʻe, inā e nīnau ʻoe i kekahi inā makemake lākou i ka ʻimi ʻana i nā tiketi mokulele, maopopo iaʻu ʻaʻole maikaʻi loa ka pane. ʻO ka mea ʻoiaʻiʻo, hele mai ʻo Python i kā mākou kōkua ma aneʻi.

ʻO ka hana mua e pono ai mākou e hoʻoponopono i ke ala e hana ai i kahi ʻōnaehana no ka ʻimi ʻana i ka ʻike ma nā tiketi ea e koho i kahi kahua kūpono kahi e lawe ai mākou i ka ʻike. ʻAʻole maʻalahi ka hoʻoponopono ʻana i kēia pilikia iaʻu, akā i ka hopena ua koho wau i ka lawelawe Kayak. Ua hoʻāʻo au i nā lawelawe a Momondo, Skyscanner, Expedia, a me kekahi mau mea ʻē aʻe, akā ʻaʻole hiki ke loaʻa nā ʻōnaehana pale robot ma kēia mau kumuwaiwai. Ma hope o kekahi mau ho'āʻo ʻana, i ka manawa aʻu e hana ai i nā kukui kaʻa, nā ala hele wāwae a me nā kaʻa, e hoʻāʻo ana e hōʻoia i nā ʻōnaehana he kanaka wau, ua hoʻoholo wau ua kūpono ʻo Kayak iaʻu, ʻoiai ʻoiai inā he nui nā ʻaoʻao i hoʻouka ʻia. i ka manawa pōkole, a hoʻomaka hoʻi nā māka. Ua hiki iaʻu ke hana i ka bot e hoʻouna i nā noi i ka pūnaewele ma nā manawa o 4 a 6 mau hola, a ua hana maikaʻi nā mea a pau. I kēlā me kēia manawa, kū mai nā pilikia i ka hana ʻana me Kayak, akā inā hoʻomaka lākou e hoʻopilikia iā ʻoe me nā loiloi, a laila pono ʻoe e hana me lākou me ka lima a laila hoʻomaka i ka bot, a kali paha i kekahi mau hola a pau nā loiloi. Inā pono, hiki iā ʻoe ke hoʻololi maʻalahi i ke code no kahi kahua ʻē aʻe, a inā ʻoe e hana pēlā, hiki iā ʻoe ke hōʻike iā ia ma nā ʻōlelo.

Inā ʻoe e hoʻomaka wale ana me ka ʻili pūnaewele a ʻaʻole ʻoe i ʻike i ke kumu e hakakā ai kekahi mau pūnaewele me ia, a laila ma mua o kou hoʻomaka ʻana i kāu papahana mua ma kēia wahi, e hana ʻoluʻolu iā ʻoe iho a hana i kahi hulina Google ma nā huaʻōlelo "web scraping etiquette" . Hiki ke hoʻopau koke ʻia kāu mau hoʻokolohua ma mua o kou manaʻo inā hana ʻoe me ke akamai ʻole.

noho hoʻomaka 'ana

Eia kahi hiʻohiʻona nui o nā mea e hiki mai ana i kā mākou code scraper pūnaewele:

  • Hoʻokomo i nā hale waihona puke i makemake ʻia.
  • Ke wehe nei i kahi pā Google Chrome.
  • Kāhea i kahi hana e hoʻomaka ai ka bot, e hāʻawi iā ia i nā kūlanakauhale a me nā lā e hoʻohana ʻia i ka wā e ʻimi ai i nā tiketi.
  • Lawe kēia hana i nā hualoaʻa mua, hoʻokaʻawale ʻia e ka maikaʻi, a kaomi i kahi pihi e hoʻouka i nā hopena hou aʻe.
  • ʻO kahi hana ʻē aʻe e hōʻiliʻili i ka ʻikepili mai ka ʻaoʻao holoʻokoʻa a hoʻihoʻi i kahi kiʻi ʻikepili.
  • Hana ʻia nā ʻanuʻu ʻelua me ka hoʻohana ʻana i nā ʻano ʻano ma ke kumukūʻai tiketi (cheap) a me ka wikiwiki o ka lele (wikiwiki).
  • Hoʻouna ʻia ka mea hoʻohana o ka palapala i leka uila me kahi hōʻuluʻulu o nā kumukūʻai tiketi (nā tikiki haʻahaʻa loa a me ke kumu kūʻai maʻamau), a mālama ʻia kahi kiʻi ʻikepili me ka ʻike i hoʻokaʻawale ʻia e nā hōʻailona ʻekolu i ʻōlelo ʻia ma ke ʻano he faila Excel.
  • Hana ʻia nā hana a pau i luna ma kahi pōʻai ma hope o kahi manawa i ʻōlelo ʻia.

Pono e hoʻomaopopo i kēlā me kēia papahana Selenium e hoʻomaka me kahi mea hoʻokele pūnaewele. Hoʻohana wau Chromedriver, Hana wau me Google Chrome, akā aia nā koho ʻē aʻe. Ua kaulana hoʻi ʻo PhantomJS a me Firefox. Ma hope o ka hoʻoiho ʻana i ka mea hoʻokele, pono ʻoe e kau iā ia i loko o ka waihona kūpono, a hoʻopau kēia i ka hoʻomākaukau no kona hoʻohana ʻana. ʻO nā laina mua o kā mākou palapala e wehe i kahi pā Chrome hou.

E hoʻomanaʻo i kaʻu moʻolelo ʻaʻole wau e hoʻāʻo e wehe i nā ʻike hou no ka loaʻa ʻana o nā makana nui ma nā tiketi ea. Nui aʻe nā ala ʻoi aku ka holomua o ka ʻimi ʻana i ia mau makana. Makemake wau e hāʻawi i ka poʻe heluhelu o kēia mea i kahi ala maʻalahi akā kūpono e hoʻoponopono ai i kēia pilikia.

Eia ke code a mākou i kamaʻilio ai ma luna.

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)

I ka hoʻomaka ʻana o ke code hiki iā ʻoe ke ʻike i nā kauoha hoʻokomo pūʻulu i hoʻohana ʻia i loko o kā mākou papahana. No laila, randint hoʻohana ʻia e hana i ka bot "hiamoe" no kekona kekona ma mua o ka hoʻomaka ʻana i kahi hana ʻimi hou. ʻO ka maʻamau, ʻaʻole hiki i kahi bot hoʻokahi ke hana me ka ʻole o kēia. Inā holo ʻoe i ke code i luna, e wehe ʻia kahi pukaaniani Chrome, kahi e hoʻohana ai ka bot e hana me nā pūnaewele.

E hana i kahi hoʻokolohua liʻiliʻi a wehe i ka pūnaewele kayak.com ma kahi pukaaniani ʻokoʻa. E koho mākou i ke kūlanakauhale a mākou e lele ai, a me ke kūlanakauhale a mākou e makemake ai e hele ai, a me nā lā lele. I ke koho ʻana i nā lā, e hōʻoia e hoʻohana ʻia ka laulā o +-3 mau lā. Ua kākau wau i ke code e noʻonoʻo ana i ka mea a ka pūnaewele e hana ai i ka pane ʻana i ia mau noi. Inā, no ka laʻana, pono ʻoe e ʻimi i nā tiketi no nā lā kikoʻī wale nō, a laila aia ke kūlana kiʻekiʻe e pono ai ʻoe e hoʻololi i ka code bot. Ke kamaʻilio wau e pili ana i ke code, hāʻawi wau i nā wehewehe kūpono, akā inā pilihua ʻoe, e haʻi mai iaʻu.

I kēia manawa e kaomi i ke pihi huli a nānā i ka loulou i ka pahu helu wahi. Pono ia e like me ka loulou aʻu e hoʻohana ai i ka laʻana ma lalo kahi i haʻi ʻia ai ka loli kayak, nāna e mālama i ka URL, a hoʻohana ʻia ke ʻano get mea hoʻokele pūnaewele. Ma hope o ke kaomi ʻana i ke pihi huli, pono e ʻike ʻia nā hopena ma ka ʻaoʻao.

ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi
I koʻu hoʻohana ʻana i ke kauoha get ʻoi aku ma mua o ʻelua a ʻekolu mau manawa i loko o kekahi mau minuke, ua noi ʻia iaʻu e hoʻopau i ka hōʻoia me ka hoʻohana ʻana i reCaptcha. Hiki iā ʻoe ke hāʻawi i kēia hōkeo me ka lima a hoʻomau i ka hoʻokolohua a hiki i ka hoʻoholo ʻana o ka ʻōnaehana e holo i kahi loiloi hou. I koʻu hoʻāʻo ʻana i ka palapala, me he mea lā ua hele mālie ka hālāwai huli mua, no laila, inā makemake ʻoe e hoʻokolohua me ke code, pono ʻoe e nānā lima me ka lima a hoʻokuʻu i ke code, me ka hoʻohana ʻana i nā wā lōʻihi ma waena o nā kau huli. A inā ʻoe e noʻonoʻo e pili ana, ʻaʻole pono ke kanaka i ka ʻike e pili ana i nā kumukūʻai tiketi i loaʻa ma 10 mau minuke ma waena o nā hana ʻimi.

Ke hana nei me kahi ʻaoʻao me XPath

No laila, wehe mākou i kahi puka makani a hoʻouka i ka pūnaewele. No ka loaʻa ʻana o ke kumukūʻai a me nā ʻike ʻē aʻe, pono mākou e hoʻohana i ka ʻenehana XPath a i ʻole nā ​​mea koho CSS. Ua hoʻoholo wau e pili pū me XPath a ʻaʻole i manaʻo i ka pono e hoʻohana i nā mea koho CSS, akā hiki ke hana pēlā. ʻO ka hoʻokele ʻana a puni kahi ʻaoʻao me ka hoʻohana ʻana iā XPath hiki ke paʻakikī, a inā ʻoe e hoʻohana i nā ʻenehana aʻu i wehewehe ai kēia ʻatikala, kahi e pili ana i ke kope ʻana i nā mea ʻike pili mai ka code ʻaoʻao, ʻike wau ʻaʻole kēia ke ala maikaʻi loa e komo ai i nā mea pono. Ma ke ala, ma kēia Hāʻawi ka puke i kahi wehewehe maikaʻi loa o nā kumu o ka hana ʻana me nā ʻaoʻao me ka hoʻohana ʻana i nā mea koho XPath a me CSS. ʻO kēia ke ʻano o ke ala hoʻokele pūnaewele pili.

ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi
No laila, e hoʻomau kākou i ka hana ma ka bot. E hoʻohana kākou i nā hiki o ka papahana e koho i nā tiketi haʻahaʻa loa. Ma ke kiʻi aʻe, hōʻike ʻia ke code koho XPath i ka ʻulaʻula. I mea e ʻike ai i ke code, pono ʻoe e kaomi ʻākau ma ka ʻaoʻao ʻaoʻao āu e makemake ai a koho i ke kauoha Inspect mai ka papa kuhikuhi i hōʻike ʻia. Hiki ke kāhea ʻia kēia kauoha no nā ʻaoʻao ʻaoʻao like ʻole, e hōʻike ʻia ke code o ia mea a hōʻike ʻia i ka mea nānā code.

ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi
Nānā palapala ʻaoʻao

I mea e ʻike ai i ka hōʻoia ʻana o koʻu manaʻo e pili ana i nā hemahema o ke kope ʻana i nā mea koho mai ke code, e hoʻolohe i kēia mau hiʻohiʻona.

ʻO kēia ka mea e loaʻa iā ʻoe ke kope ʻoe i ke code:

//*[@id="wtKI-price_aTab"]/div[1]/div/div/div[1]/div/span/span

I mea e kope ai i kekahi mea e like me kēia, pono ʻoe e kaomi ʻākau ma ka ʻāpana o ke code āu e makemake ai a koho i ke kauoha Copy> Copy XPath mai ka papa kuhikuhi i hōʻike ʻia.

Eia kaʻu mea i hoʻohana ai e wehewehe i ka pihi cheapest:

cheap_results = ‘//a[@data-code = "price"]’

ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi
Kauoha kope > kope XPath

He mea maopopo loa ke nānā aku i ka maʻalahi o ka koho lua. Ke hoʻohana ʻia, ʻimi ʻo ia i kahi mea a nona ka ʻano data-codelike me price. Ke hoʻohana ʻia ka koho mua, ʻimi ʻia ka mea id ka mea like me wtKI-price_aTab, a ua like ke ala XPath i ka mea /div[1]/div/div/div[1]/div/span/span. ʻO kahi nīnau XPath e like me kēia i kahi ʻaoʻao e hana i ka hoʻopunipuni, akā hoʻokahi wale nō. Hiki iaʻu ke ʻōlelo i kēia manawa id e hoʻololi i ka manawa aʻe e hoʻouka ʻia ai ka ʻaoʻao. Kaʻina o ke ʻano wtKI hoʻololi ikaika i kēlā me kēia manawa e hoʻouka ʻia ka ʻaoʻao, no laila e lilo ke code e hoʻohana ana ia mea ma hope o ka hoʻouka hou ʻana o ka ʻaoʻao aʻe. No laila e lawe i kekahi manawa e hoʻomaopopo iā XPath. E lawelawe maikaʻi ana kēia ʻike iā ʻoe.

Eia naʻe, pono e hoʻomaopopo ʻia hiki ke hoʻohana ʻia ke kope ʻana i nā mea koho XPath i ka hana ʻana me nā pūnaewele maʻalahi, a inā ʻoluʻolu ʻoe i kēia, ʻaʻohe hewa.

I kēia manawa e noʻonoʻo kākou i ka mea e hana ai inā pono ʻoe e kiʻi i nā hopena hulina āpau ma nā laina he nui, i loko o kahi papa inoa. Maʻalahi loa. Aia kēlā me kēia hopena i loko o kahi mea me kahi papa resultWrapper. Hiki ke hana ʻia ka hoʻouka ʻana i nā hopena a pau i loko o kahi loop e like me ka mea i hōʻike ʻia ma lalo nei.

Pono e hoʻomaopopo ʻia inā maopopo ʻoe i ka mea i luna, a laila pono ʻoe e hoʻomaopopo maʻalahi i ka hapa nui o ke code a mākou e loiloi ai. Ke holo nei kēia code, loaʻa iā mākou ka mea e pono ai mākou (ʻoiaʻiʻo, ʻo ka mea i hoʻopili ʻia ka hopena) me ka hoʻohana ʻana i kekahi ʻano o ke ala-specifying mechanism (XPath). Hana ʻia kēia i mea e loaʻa ai ke kikokikona o ka mea a waiho i loko o kahi mea e hiki ke heluhelu ʻia ka ʻikepili (hoʻohana mua ʻia. flight_containers, a laila - flights_list).

ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi
Hōʻike ʻia nā laina mua ʻekolu a hiki iā mākou ke ʻike maopopo i nā mea āpau a mākou e pono ai. Eia naʻe, loaʻa iā mākou nā ala hoihoi e loaʻa ai ka ʻike. Pono mākou e lawe kaʻawale i ka ʻikepili mai kēlā me kēia mea.

E hele i ka hana!

ʻO ke ala maʻalahi loa e kākau i kahi hana ʻo ka hoʻouka ʻana i nā hopena hou aʻe, no laila mākou e hoʻomaka ai. Makemake au e hoʻonui i ka helu o nā mokulele i loaʻa i ka papahana ka ʻike e pili ana, me ka ʻole o ka hoʻāla ʻana i nā kānalua i ka lawelawe e alakaʻi ai i kahi nānā, no laila kaomi wau i ka pihi Load more results i kēlā me kēia manawa e hōʻike ʻia ka ʻaoʻao. Ma kēia code, pono ʻoe e hoʻolohe i ka poloka try, aʻu i hoʻohui ai no ka mea i kekahi manawa ʻaʻole hoʻouka pono ke pihi. Inā ʻoe e hālāwai me kēia, e haʻi i nā kelepona i kēia hana ma ke code hana start_kayak, a mākou e nānā ai ma lalo nei.

# Загрузка большего количества результатов для того, чтобы максимизировать объём собираемых данных
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

I kēia manawa, ma hope o ka loiloi lōʻihi o kēia hana (i kekahi manawa hiki iaʻu ke lawe ʻia), ua mākaukau mākou e haʻi i kahi hana e ʻoki ai i ka ʻaoʻao.

Ua hōʻiliʻili mua wau i ka hapa nui o nā mea e pono ai i kēia hana i kapa ʻia page_scrape. I kekahi manawa ua hui ʻia ka ʻikepili ala i hoʻihoʻi ʻia, no laila hoʻohana wau i kahi ala maʻalahi e hoʻokaʻawale ai. No ka laʻana, ke hoʻohana au i nā mea hoʻololi no ka manawa mua section_a_list и section_b_list. Hoʻihoʻi kā mākou hana i kahi kiʻi ʻikepili flights_df, ʻae kēia iā mākou e hoʻokaʻawale i nā hopena i loaʻa mai nā ʻano hoʻokaʻina ʻikepili like ʻole a ma hope e hui pū ai.

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

Ua ho'āʻo wau e inoa i nā mea hoʻololi i hiki ke hoʻomaopopo ʻia ke code. E hoʻomanaʻo e hoʻomaka ana nā mea hoʻololi me a pili i ka pae mua o ke ala, a b - i ka lua. E neʻe kākou i ka hana aʻe.

Nā mīkini kākoʻo

Loaʻa iā mākou kahi hana e hiki ai iā mākou ke hoʻouka i nā hualoaʻa hou aʻe a me kahi hana e hana ai i kēlā mau hopena. Ua pau paha kēia ʻatikala ma ʻaneʻi, no ka mea, hāʻawi kēia mau hana ʻelua i nā mea āpau e pono ai ʻoe e ʻoki i nā ʻaoʻao i hiki iā ʻoe ke wehe iā ʻoe iho. Akā ʻaʻole mākou i noʻonoʻo i kekahi o nā mea kōkua i kūkākūkā ʻia ma luna. Eia kekahi laʻana,ʻo kēia ke code no ka hoʻounaʻana i nā leka uila a me kekahi mau mea'ē aʻe. Hiki ke loaʻa kēia mau mea a pau i ka hana start_kayak, a kakou e noonoo ai.

No kēia hana e hana, pono ʻoe i ka ʻike e pili ana i nā kūlanakauhale a me nā lā. Me ka hoʻohana ʻana i kēia ʻike, hana ia i kahi loulou i kahi loli kayak, i hoʻohana ʻia no ka lawe ʻana iā ʻoe i kahi ʻaoʻao e loaʻa nā hopena hulina i hoʻokaʻawale ʻia e ko lākou hoʻokūkū maikaʻi loa i ka nīnau. Ma hope o ke kau ʻōpala mua, e hana mākou me nā kumukūʻai ma ka papa ma luna o ka ʻaoʻao. ʻO ia, e ʻike mākou i ke kumu kūʻai tiketi liʻiliʻi a me ke kumu kūʻai maʻamau. ʻO kēia mau mea a pau, me ka wānana i hoʻopuka ʻia e ka pūnaewele, e hoʻouna ʻia ma ka leka uila. Ma ka ʻaoʻao, pono ka pākaukau e pili ana ma ka ʻaoʻao hema hema. ʻO ka hana ʻana me kēia papa ʻaina, ma ke ala, hiki ke hana i kahi hewa i ka wā e ʻimi ai i ka hoʻohana ʻana i nā lā kikoʻī, ʻoiai ma kēia hihia ʻaʻole i hōʻike ʻia ka papa ma ka ʻaoʻao.

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.....')

Ua hoʻāʻo au i kēia palapala me ka hoʻohana ʻana i kahi moʻokāki Outlook (hotmail.com). ʻAʻole au i hoʻāʻo iā ia e hana pololei me kahi moʻokāki Gmail, kaulana loa kēia ʻōnaehana leka uila, akā he nui nā koho. Inā hoʻohana ʻoe i kahi moʻokāki Hotmail, a laila i mea e hana ai nā mea āpau, pono ʻoe e hoʻokomo i kāu ʻikepili i loko o ke code.

Inā makemake ʻoe e hoʻomaopopo i ka mea i hana ʻia ma nā ʻāpana kikoʻī o ke code no kēia hana, hiki iā ʻoe ke kope iā lākou a hoʻokolohua me lākou. ʻO ka hoʻāʻo ʻana me ke code ʻo ia ke ala e hoʻomaopopo maoli ai.

Pūnaehana mākaukau

I kēia manawa ua hana mākou i nā mea āpau a mākou i kamaʻilio ai, hiki iā mākou ke hana i kahi loop maʻalahi e kāhea i kā mākou mau hana. Noi ka palapala i ka ʻikepili mai ka mea hoʻohana e pili ana i nā kūlanakauhale a me nā lā. I ka hoʻāʻo ʻana me ka hoʻomaka hou ʻana o ka palapala, ʻaʻole paha ʻoe e makemake e hoʻokomo i kēia ʻikepili me ka lima i kēlā me kēia manawa, no laila hiki ke haʻi ʻia nā laina kūpono, no ka manawa o ka hoʻāʻo ʻana, me ka wehe ʻole ʻana i nā mea ma lalo o lākou, kahi e pono ai ka ʻikepili e pono ai. paʻa ʻia ka palapala.

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.....')

ʻO kēia ke ʻano o ka hoʻāʻo ʻana o ka palapala.
ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi
E ho'āʻo i ka palapala

Nā hopena

Inā ua hiki ʻoe i kēia mamao, mahalo! Loaʻa iā ʻoe kahi scraper pūnaewele hana, ʻoiai ua hiki iaʻu ke ʻike i nā ala he nui e hoʻomaikaʻi ai. No ka laʻana, hiki ke hoʻohui ʻia me Twilio i mea e hoʻouna ai i nā leka uila ma mua o nā leka uila. Hiki iā ʻoe ke hoʻohana i kahi VPN a i ʻole kekahi mea ʻē aʻe e loaʻa i nā hopena i ka manawa like mai nā kikowaena. Aia kekahi pilikia i kēlā me kēia manawa me ka nānā ʻana i ka mea hoʻohana pūnaewele e ʻike inā he kanaka ʻo ia, akā hiki ke hoʻoponopono ʻia kēia pilikia. I kekahi hihia, i kēia manawa ua loaʻa iā ʻoe kahi waihona e hiki ai iā ʻoe ke hoʻonui inā makemake ʻoe. No ka laʻana, e hōʻoia e hoʻouna ʻia kahi faila Excel i ka mea hoʻohana ma ke ʻano he hoʻopili i kahi leka uila.

ʻO Python - he mea kōkua i ka loaʻa ʻana o nā tiketi ea inexpensive no ka poʻe makemake i ka huakaʻi

Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi. Eʻe, e 'oluʻolu.

Ke hoʻohana nei ʻoe i nā ʻenehana ʻili pūnaewele?

  • ia

  • No

8 mea hoʻohana i koho. 1 mea hoʻohana i hōʻole.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka