Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya

Onye edemede edemede ahụ, nsụgharị nke anyị na-ebipụta taa, na-ekwu na ihe mgbaru ọsọ ya bụ ikwu maka mmepe nke scraper webụ na Python na-eji Selenium, nke na-achọ ọnụ ahịa tiketi ụgbọ elu. Mgbe ị na-achọ tiketi, a na-eji ụbọchị mgbanwe (+- 3 ụbọchị metụtara ụbọchị akọwapụtara). The scraper na-echekwa nsonaazụ ọchụchọ na faịlụ Excel wee ziga onye na-eme ọchụchọ ahụ ozi-e na nchịkọta nke ihe ha chọtara. Ebumnuche nke ọrụ a bụ inyere ndị njem aka ịchọta ahịa kacha mma.

Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya

Ọ bụrụ na, ka ị na-aghọta ihe ahụ, ọ dị gị ka ọ furu efu, lelee ya nke a edemede.

Kedu ihe anyị ga-achọ?

Ị nweere onwe gị iji usoro akọwara ebe a dịka ịchọrọ. Dịka ọmụmaatụ, eji m ya chọọ njegharị izu ụka na tiketi obodo m. Ọ bụrụ na ị na-achọsi ike ịchọta tiketi bara uru, ị nwere ike ịme edemede ahụ na ihe nkesa (dị mfe nkesa, maka 130 rubles kwa ọnwa, dị nnọọ mma maka nke a) ma jide n'aka na ọ na-agba ọsọ otu ugboro ma ọ bụ ugboro abụọ n'ụbọchị. A ga-ezigara gị nsonaazụ ọchụchọ site na email. Na mgbakwunye, ana m akwado ịhazi ihe niile ka edemede ahụ chekwaa faịlụ Excel nwere nsonaazụ ọchụchọ na nchekwa Dropbox, nke ga-enye gị ohere ịlele faịlụ ndị dị otú ahụ n'ebe ọ bụla na n'oge ọ bụla.

Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya
Ahụbeghị m tarifu nwere mperi, mana echere m na ọ ga-ekwe omume

Mgbe ị na-achọ, dị ka ekwuru na mbụ, a na-eji "ụbọchị mgbanwe"; edemede ahụ na-achọta onyinye ndị dị n'ime ụbọchị atọ nke ụbọchị enyere. Ọ bụ ezie na mgbe ọ na-agba akwụkwọ edemede ahụ, ọ na-achọ onyinye na naanị otu ntụziaka, ọ dị mfe ịgbanwe ya ka o wee nwee ike ịnakọta data na ọtụtụ ntụziaka ụgbọ elu. Site n'enyemaka ya, ị nwere ike ịchọ ọbụna tarifu na-ezighị ezi; ihe ndị dị otú ahụ nwere ike ịmasị mmasị.

Kedu ihe mere ị ga-eji chọọ scraper webụ ọzọ?

Mgbe mbụ m malitere scraping webụ, n'eziokwu enweghị m mmasị na ya. Achọrọ m imekwu ọrụ n'ọhịa nke ịkọ amụma, nyocha ego, na, ikekwe, n'ọhịa nke nyochaa agba agba mmetụta uche nke ederede. Mana ọ tụgharịrị na ọ bụ ihe na-adọrọ mmasị ịmata etu esi emepụta mmemme na-anakọta data sitere na weebụsaịtị. Ka m na-abanye n'ime isiokwu a, achọpụtara m na ntanetị weebụ bụ "engine" nke ịntanetị.

Ị nwere ike iche na nke a bụ nkwupụta nkwuwa okwu. Mana tụlee na Google malitere site na scraper webụ nke Larry Page kere site na iji Java na Python. Robots Google anọwo na-enyocha ịntanetị, na-agbalị ịnye ndị ọrụ ya azịza kacha mma maka ajụjụ ha. Web scraping nwere adịghị agwụ agwụ ojiji, na ọbụna ma ọ bụrụ na ị nwere mmasị na ihe ọzọ na Data Science, ị ga-achọ ụfọdụ scraping nkà iji nweta data ị chọrọ iji nyochaa.

Achọtara m ụfọdụ usoro eji ebe a na ọmarịcha akwụkwọ ahụ banyere mkpocha weebụ, nke m nwetara na nso nso a. O nwere ọtụtụ ihe atụ na echiche dị mfe maka itinye ihe ị mụtara n'ọrụ. Na mgbakwunye, enwere isiakwụkwọ na-atọ ụtọ maka ịgafe ndenye ego reCaptcha. Nke a bịara dị ka akụkọ nye m, ebe ọ bụ na amaghị m na e nwere ngwá ọrụ pụrụ iche na ọbụna ọrụ niile maka idozi nsogbu ndị dị otú ahụ.

Ọ na-amasị gị ịga njem?!

Maka ajụjụ dị mfe na nke na-adịghị emerụ ahụ a na-ajụ na isiokwu nke ngalaba a, ị nwere ike ịnụ azịza dị mma, yana akụkọ ole na ole sitere na njem nke onye a jụrụ ya. Ọtụtụ n'ime anyị ga-ekweta na njem bụ ụzọ dị mma isi tinye onwe gị na gburugburu omenala ọhụrụ wee gbasaa echiche gị. Agbanyeghị, ọ bụrụ na ị jụọ mmadụ ma ọ na-amasị ya ịchọ tiketi ụgbọ elu, ejiri m n'aka na azịza ya agaghị adị mma. N'ezie, nke a bụ ebe Python na-abịa nyere anyị aka.

Ọrụ mbụ anyị kwesịrị idozi na ụzọ ịmepụta usoro maka ịchọ ozi na tiketi ụgbọ elu ga-abụ nhọrọ nke ikpo okwu kwesịrị ekwesị nke anyị ga-esi nweta ozi. Idozi nsogbu a adịghịrị m mfe, ma n’ikpeazụ m họọrọ ije ozi Kayak. Agbalịrị m ọrụ Momondo, Skyscanner, Expedia, na ndị ọzọ ole na ole, mana usoro nchebe robot na akụrụngwa ndị a enweghị ike ịpụ. Mgbe ọtụtụ mgbalị gasịrị, n'oge nke m ga-emeso ọkụ okporo ụzọ, ndị na-agafe agafe na ịnyịnya ígwè, na-agbalị ime ka usoro ahụ kwenye na m bụ mmadụ, ekpebiri m na Kayak kacha mma maka m, n'agbanyeghị eziokwu ahụ bụ na ọ bụrụgodị na ọtụtụ ibe na-ebuju. n'oge dị mkpirikpi, na ndenye ego na-amalitekwa. Ejisiri m ike mee ka bot ziga arịrịọ na saịtị ahụ n'oge oge 4 ruo 6, na ihe niile na-arụ ọrụ nke ọma. Site n'oge ruo n'oge, nsogbu na-ebilite mgbe ị na-arụ ọrụ na Kayak, ma ọ bụrụ na ha na-amalite pestering gị na ndenye ego, mgbe ahụ, i kwesịrị ma na-emeso ha aka wee malite bot, ma ọ bụ chere a awa ole na ole na ndenye ego kwesịrị ịkwụsị. Ọ bụrụ na ọ dị mkpa, ị nwere ike ịmegharị koodu ahụ ngwa ngwa maka ikpo okwu ọzọ, ma ọ bụrụ na ịmee ya, ị nwere ike ịkọ ya na nkwupụta.

Ọ bụrụ na ị na-amalite na ntanetị weebụ ma ị maghị ihe kpatara na ụfọdụ weebụsaịtị na-alụ ọgụ, mgbe ahụ, tupu ịmalite ọrụ mbụ gị na mpaghara a, mee onwe gị ihu ọma ma mee ọchụchọ Google na okwu ndị a "web scraping etiquette" . Nnwale gị nwere ike kwụsị ngwa ngwa karịa ka ị chere ma ọ bụrụ na ị na-ehichapụ weebụ n'amaghị ama.

-amalite Amalite

Nke a bụ nkọwa zuru ezu nke ihe ga-eme na koodu scraper webụ anyị:

  • Bubata ọba akwụkwọ achọrọ.
  • Na-emepe taabụ Google Chrome.
  • Kpọọ ọrụ na-amalite bot, na-ebufe ya obodo na ụbọchị a ga-eji mee ihe mgbe ị na-achọ tiketi.
  • Ọrụ a na-ewe nsonaazụ ọchụchọ mbụ, hazie ya nke ọma, wee pịa bọtịnụ iji buo nsonaazụ ndị ọzọ.
  • Ọrụ ọzọ na-anakọta data site na ibe dum wee weghachi etiti data.
  • A na-eme usoro abụọ gara aga site na iji ụdị nhazi site na ọnụahịa tiketi (dị ọnụ ala) yana site na ọsọ ụgbọ elu (ọsọ ọsọ).
  • A na-ezigara onye na-eji edemede ahụ ozi-e nwere nchịkọta ọnụahịa tiketi (tiketi dị ọnụ ala na nkezi ọnụ ahịa), na a na-echekwa etiti data nwere ozi nke ihe ngosi atọ a kpọtụrụ aha n'elu ahazi dị ka faịlụ Excel.
  • Omume niile a dị n'elu na-eme n'ime okirikiri mgbe oge a kapịrị ọnụ.

Ekwesiri ighota na oru Selenium ọ bụla na-amalite site na onye ọkwọ ụgbọ ala. m na-eji Chromedriver, M na-arụ ọrụ na Google Chrome, ma enwere nhọrọ ndị ọzọ. PhantomJS na Firefox bụkwa ndị ewu ewu. Mgbe nbudata onye ọkwọ ụgbọ ala, ịkwesịrị itinye ya na folda kwesịrị ekwesị, nke a mezuru nkwadebe maka iji ya. Ahịrị izizi nke edemede anyị mepere taabụ Chrome ọhụrụ.

Buru n'uche na n'akụkọ m, anaghị m agbalị imeghe ọhụụ ọhụrụ maka ịchọta nnukwu azụmahịa na tiketi ụgbọ elu. Enwere ụzọ dị elu karịa nke ịchọ ụdị onyinye ahụ. Achọrọ m inye ndị na-agụ akwụkwọ a ụzọ dị mfe ma dị irè isi dozie nsogbu a.

Nke a bụ koodu anyị kwuru maka ya n'elu.

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)

Na mmalite nke koodu ị nwere ike ịhụ iwu mbubata ngwugwu a na-eji n'oge ọrụ anyị niile. Yabụ, randint eji mee ka bot "daa n'ụra" maka ọnụọgụ ọnụọgụ nke sekọnd tupu ịmalite ọrụ ọchụchọ ọhụrụ. Ọtụtụ mgbe, ọ bụghị otu bot nwere ike ime na-enweghị nke a. Ọ bụrụ na ị na-agba ọsọ koodu dị n'elu, windo Chrome ga-emeghe, nke bot ga-eji na-arụ ọrụ na saịtị.

Ka anyị mee ntakịrị nnwale wee mepee webụsaịtị kayak.com na mpio dị iche. Anyị ga-ahọrọ obodo nke anyị ga-esi na ya fepụ, na obodo anyị chọrọ ịbanye, yana ụbọchị ụgbọ elu. Mgbe ị na-ahọrọ ụbọchị, gbaa mbọ hụ na ejiri oke nke +-3 ụbọchị. Edere m koodu ahụ na-eburu n'uche ihe saịtị ahụ na-emepụta na nzaghachi maka arịrịọ ndị dị otú ahụ. Ọ bụrụ, dịka ọmụmaatụ, ịchọrọ ịchọ tiketi naanị maka ụbọchị a kapịrị ọnụ, mgbe ahụ enwere ike dị elu na ị ga-agbanwe koodu bot. Mgbe m na-ekwu maka koodu ahụ, m na-enye nkọwa kwesịrị ekwesị, mana ọ bụrụ na ọ dị gị mgbagwoju anya, mee ka m mara.

Ugbu a pịa bọtịnụ ọchụchọ wee lelee njikọ dị na ogwe adreesị. O kwesiri ịdị ka njikọ m na-eji na ihe atụ dị n'okpuru ebe a na-ekwupụta mgbanwe kayak, nke na-echekwa URL, na usoro a na-eji get onye ọkwọ ụgbọ ala webụ. Mgbe ịpịrị bọtịnụ ọchụchọ, nsonaazụ kwesịrị ịpụta na ibe ahụ.

Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya
Mgbe m ji iwu ahụ get Ihe karịrị ugboro abụọ ma ọ bụ atọ n'ime nkeji ole na ole, a gwara m ka m mechaa nkwenye site na iji reCaptcha. Ị nwere ike iji aka gị gafere nlele a wee gaa n'ihu na-anwale ruo mgbe sistemụ ahụ kpebiri ịme nlele ọhụrụ. Mgbe m nwalere edemede ahụ, ọ dị ka nnọkọ ọchụchọ nke mbụ na-aga nke ọma mgbe niile, yabụ ọ bụrụ na ịchọrọ ịnwale koodu ahụ, naanị ị ga-eji aka na-elele oge ụfọdụ wee hapụ koodu ahụ ka ọ na-agba ọsọ, na-eji ogologo oge n'etiti oge ọchụchọ. Ma, ọ bụrụ na ị na-eche maka ya, o yighị ka mmadụ ga-achọ ozi gbasara ọnụ ahịa tiketi enwetara na nkeji nkeji iri n'etiti ọrụ ọchụchọ.

Iji XPath na-arụ ọrụ na ibe

Ya mere, anyị meghere windo wee buru saịtị ahụ. Iji nweta ọnụahịa na ozi ndị ọzọ, anyị kwesịrị iji teknụzụ XPath ma ọ bụ ndị na-ahọpụta CSS. Ekpebiri m ịrapara na XPath na echeghị m na ọ dị m mkpa iji CSS selectors, mana ọ ga-ekwe omume ịrụ ọrụ otú ahụ. Ịgagharị na ibe site na iji XPath nwere ike ịghọ aghụghọ, ma ọ bụrụgodi na ị na-eji usoro m kọwara na ya nke a isiokwu, nke gụnyere iṅomi ihe njirimara kwekọrọ na koodu ibe, achọpụtara m na nke a bụ, n'ezie, ọ bụghị ụzọ kachasị mma iji nweta ihe ndị dị mkpa. Site n'ụzọ, na nke a Akwụkwọ ahụ na-enye nkọwa magburu onwe ya nke isi ihe na-arụ ọrụ na ibe site na iji XPath na CSS selectors. Nke a bụ ka usoro ọkwọ ụgbọ ala webụ kwekọrọ dị ka.

Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya
Yabụ, ka anyị gaa n'ihu na-arụ ọrụ na bot. Ka anyị jiri ike mmemme họrọ tiketi dị ọnụ ala. N'onyinyo na-esote, a na-eme ka koodu nhọrọ XPath pụta ìhè na uhie. Iji lelee koodu ahụ, ịkwesịrị ịpị aka nri na mmewere ibe ị nwere mmasị na ya wee họrọ iwu nyocha site na menu gosipụtara. Enwere ike ịkpọ iwu a maka ihe dị iche iche nke ibe, koodu nke a ga-egosipụta ma gosipụta ya na onye na-ekiri koodu.

Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya
Lelee koodu ibe

Iji chọta nkwenye nke echiche m gbasara adịghị mma nke iṅomi ndị na-ahọrọ na koodu, ṅaa ntị na atụmatụ ndị a.

Nke a bụ ihe ị ga-enweta mgbe idetuo koodu:

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

Iji detuo ihe dị ka nke a, ịkwesịrị ịpị aka nri na ngalaba koodu ị nwere mmasị na ya wee họrọ Detuo> Detuo iwu XPath site na menu gosipụtara.

Nke a bụ ihe m ji kọwaa bọtịnụ Dị ọnụ ala:

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

Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya
Detuo Iwu> Detuo XPath

O doro anya na nhọrọ nke abụọ dị nnọọ mfe karị. Mgbe ejiri ya, ọ na-achọ mmewere a nwere njirimara data-codeprice. Mgbe ị na-eji nhọrọ mbụ, a na-achọ ihe ahụ id nke hà nhata wtKI-price_aTab, na ụzọ XPath na mmewere dị ka /div[1]/div/div/div[1]/div/span/span. Ajụjụ XPath dị ka nke a na ibe ga-eme aghụghọ ahụ, mana naanị otu ugboro. Enwere m ike ikwu ugbu a id ga-agbanwe oge ọzọ ebudatara ibe ahụ. Usoro agwa wtKI na-agbanwe n'ike n'ike oge ọ bụla a na-ebugo ibe ahụ, yabụ koodu na-eji ya agaghị abaghị uru ma e bugharịa ibe na-esote. Yabụ wepụta oge iji ghọta XPath. Ihe ọmụma a ga-abara gị uru.

Otú ọ dị, ekwesịrị iburu n'obi na iṅomi XPath selectors nwere ike ịba uru mgbe ị na-arụ ọrụ na saịtị ndị dị mfe, ma ọ bụrụ na ọ dị gị mma na nke a, ọ dịghị ihe dị njọ na ya.

Ugbu a, ka anyị chee maka ihe ị ga-eme ma ọ bụrụ na ịchọrọ ịnweta nsonaazụ ọchụchọ niile n'ọtụtụ ahịrị, n'ime ndepụta. Dị mfe. Nsonaazụ ọ bụla dị n'ime ihe nwere klaasị resultWrapper. Ịkwado nsonaazụ niile enwere ike ịme na akaghị aka dịka nke egosiri n'okpuru.

Ekwesiri iburu n'uche na ọ bụrụ na ị ghọtara ihe ndị dị n'elu, mgbe ahụ ị ga-aghọta ngwa ngwa ọtụtụ koodu anyị ga-enyocha. Ka koodu a na-agba ọsọ, anyị na-enweta ihe anyị chọrọ (n'ezie, mmewere nke etinyere nsonaazụ ya) na-eji ụdị usoro akọwapụtara ụzọ (XPath). A na-eme nke a iji nweta ederede nke mmewere ma tinye ya n'ime ihe nwere ike ịgụta data (nke mbụ eji. flight_containers, mgbe ahụ - flights_list).

Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya
A na-egosipụta ahịrị atọ nke mbụ na anyị nwere ike ịhụ nke ọma ihe niile anyị chọrọ. Agbanyeghị, anyị nwere ụzọ na-atọ ụtọ karị isi nweta ozi. Anyị kwesịrị ịnara data sitere na mmewere ọ bụla iche iche.

Gaa ọrụ!

Ụzọ kachasị mfe iji dee ọrụ bụ ịkwanye nsonaazụ ndị ọzọ, yabụ ebe ahụ ka anyị ga-amalite. Ọ ga-amasị m ịbawanye ọnụ ọgụgụ ụgbọ elu nke mmemme ahụ na-enweta ozi gbasara ya, na-ebulighị enyo na ọrụ nke na-eduga na nyocha, yabụ m pịa bọtịnụ Budata nsonaazụ ọzọ otu ugboro n'oge ọ bụla gosipụtara ibe ahụ. Na koodu a, ị kwesịrị ịṅa ntị na ngọngọ try, nke m gbakwunyere n'ihi na mgbe ụfọdụ bọtịnụ anaghị ebu nke ọma. Ọ bụrụ na ị hụkwara nke a, kwupụta oku maka ọrụ a na koodu ọrụ start_kayak, nke anyị ga-ele anya n'okpuru.

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

Ugbu a, mgbe nyochachara ogologo ọrụ a (mgbe ụfọdụ enwere m ike ibupụ), anyị dị njikere ikwupụta ọrụ nke ga-ehichapụ ibe ahụ.

Anakọtala m ọtụtụ ihe achọrọ na ọrụ na-esonụ a na-akpọ page_scrape. Mgbe ụfọdụ, a na-ejikọta data ụzọ azụghachi azụ, ya mere m na-eji usoro dị mfe ikewapụ ya. Dịka ọmụmaatụ, mgbe m na-eji mgbanwe maka oge mbụ section_a_list и section_b_list. Ọrụ anyị na-eweghachite etiti data flights_df, nke a na-enye anyị ohere ikewapụta nsonaazụ enwetara site na ụzọ nhazi data dị iche iche wee jikọta ha.

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

Agbalịrị m ịkpọ ndị mgbanwe aha ka koodu ahụ wee nwee nghọta. Cheta na mgbanwe na-amalite na a bụ nke mbụ ogbo nke ụzọ, na b - na nke abụọ. Ka anyị gaa n'ihu na ọrụ ọzọ.

Usoro nkwado

Anyị nwere ugbu a ọrụ na-enye anyị ohere ibunye nsonaazụ ọchụchọ ndị ọzọ yana ọrụ iji hazie nsonaazụ ndị ahụ. Edemede a nwere ike ịkwụsị ebe a, ebe ọ bụ na ọrụ abụọ a na-enye ihe niile ịchọrọ iji kpochapụ ibe ị nwere ike imeghe onwe gị. Mana anyị atụlebeghị ụfọdụ usoro inyeaka ndị a tụlere n'elu. Dịka ọmụmaatụ, nke a bụ koodu maka izipu ozi-e yana ụfọdụ ihe ndị ọzọ. Enwere ike ịchọta ihe a niile na ọrụ ahụ start_kayak, nke anyị ga-atụle ugbu a.

Ka ọrụ a rụọ ọrụ, ịchọrọ ozi gbasara obodo na ụbọchị. Iji ozi a, ọ na-etolite njikọ na mgbanwe kayak, nke a na-eji eburu gị gaa na ibe nke ga-enwe nsonaazụ ọchụchọ haziri site na egwuregwu kacha mma na ajụjụ a. Mgbe nnọkọ nchịkọta nke mbụ, anyị ga-arụ ọrụ na ọnụahịa dị na tebụl n'elu ibe. Ya bụ, anyị ga-ahụ ọnụahịa tiketi kacha nta na ọnụ ahịa nkezi. Ihe ndị a niile, yana amụma saịtị ahụ nyere, ga-eziga site na email. Na ibe, tebụl kwekọrọ kwesịrị ịdị na akuku aka ekpe elu. Na-arụ ọrụ na tebụl a, n'ụzọ, nwere ike ime ka njehie mgbe ị na-achọ iji kpọmkwem ụbọchị, ebe ọ bụ na nke a na tebụl adịghị egosipụta na ibe.

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

Eji m akaụntụ Outlook (hotmail.com) nwalee edemede a. Anaghị m anwale ya ka ọ rụọ ọrụ nke ọma na akaụntụ Gmail, usoro email a na-ewu ewu, mana enwere ọtụtụ nhọrọ. Ọ bụrụ na ị na-eji akaụntụ Hotmail, ka ihe niile wee rụọ ọrụ, naanị ị ga-etinye data gị na koodu.

Ọ bụrụ na ịchọrọ ịghọta kpọmkwem ihe a na-eme na mpaghara ụfọdụ nke koodu maka ọrụ a, ị nwere ike iṅomi ha ma jiri ha mee nnwale. Inyocha koodu ahụ bụ naanị ụzọ isi ghọta ya n'ezie.

Usoro njikere

Ugbu a anyị emeela ihe niile anyị kwuru, anyị nwere ike ịmepụta loop dị mfe nke na-akpọ ọrụ anyị. Edemede a na-arịọ data sitere n'aka onye ọrụ gbasara obodo na ụbọchị. Mgbe ị na-anwale na ịmalitegharị edemede ahụ mgbe niile, o yighị ka ị ga-achọ iji aka tinye data a n'oge ọ bụla, yabụ ahịrị ndị kwekọrọ, maka oge nnwale, enwere ike ịkọwapụta ndị nọ n'okpuru ha, nke data achọrọ site na script bụ hardcoded.

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

Nke a bụ ihe nnwale nke edemede dị ka.
Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya
Nwalee ọsọ nke edemede

Nsonaazụ

Ọ bụrụ na ịmeela ya nke a, daalụ! Ị nwere ugbu a scraper webụ na-arụ ọrụ, ọ bụ ezie na enwere m ike ịhụ ọtụtụ ụzọ iji melite ya. Dịka ọmụmaatụ, enwere ike ijikọ ya na Twilio ka ọ na-ezigara ozi ederede kama izipu ozi ịntanetị. Ị nwere ike iji VPN ma ọ bụ ihe ọzọ iji nweta nsonaazụ n'otu oge site na ọtụtụ sava. Enwekwara nsogbu na-ebilite kwa oge na ịlele onye ọrụ saịtị ka ọ mara ma ọ bụ mmadụ, mana enwere ike idozi nsogbu a. N'ọnọdụ ọ bụla, ugbu a ị nwere ntọala nke ị nwere ike gbasaa ma ọ bụrụ na ịchọrọ. Dịka ọmụmaatụ, jide n'aka na ezigara onye ọrụ faịlụ Excel dịka mgbakwunye na email.

Python - onye inyeaka n'ịchọta tiketi ụgbọ elu adịghị ọnụ maka ndị hụrụ njem n'anya

Naanị ndị ọrụ edebanyere aha nwere ike isonye na nyocha a. banye, Biko.

Ị na-eji teknụzụ scraping weebụ?

  • Ee

  • Ọ dịghị

Ndị ọrụ 8 tụrụ vootu. 1 onye ọrụ anabataghị.

isi: www.habr.com

Tinye a comment