Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan

Qoraaga maqaalkan oo tarjumaaddiisa aan maanta daabacayno ayaa sheegaysa in ujeeddadeedu tahay in laga hadlo samaynta xoqida webka ee Python iyada oo la adeegsanayo Selenium, taas oo ka raadinaysa qiimaha tigidhada diyaaradaha. Marka la raadinayo tigidhada, taariikho dabacsan ayaa la isticmaalaa (+- 3 maalmood marka loo eego taariikhaha la cayimay). Xaraashku wuxuu kaydiyaa natiijooyinka raadinta faylka Excel wuxuuna u soo diraa qofka raadraacay iimayl soo koobaya wixii ay heleen. Hadafka mashruucani waa in laga caawiyo socotada inay helaan heshiisyada ugu fiican.

Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan

Haddii, adigoo fahmaya maaddada, aad dareemayso lumay, eeg tan maqaal.

Maxaan raadineynaa?

Xor ayaad u tahay inaad isticmaasho nidaamka halkan lagu sharaxay sidaad rabto. Tusaale ahaan, waxaan u isticmaalay in aan raadiyo safarada todobaadka iyo tigidhada magaaladayda. Haddii aad dhab ka tahay helitaanka tigidhada faa'iidada leh, waxaad ku socodsiin kartaa qoraalka server-ka (fudud server, 130 rubles bishii, waa arrin ku habboon tan) oo hubi in ay socoto hal ama laba jeer maalintii. Natiijooyinka raadinta waxaa lagugu soo diri doonaa iimayl. Intaa waxaa dheer, waxaan ku talinayaa in wax walba la dejiyo si qoraalku u badbaadiyo faylka Excel oo leh natiijooyinka raadinta ee folder Dropbox, kaas oo kuu ogolaanaya inaad ka aragto faylasha noocaas ah meel kasta iyo wakhti kasta.

Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan
Wali ma helin tacriifooyin khaladaad leh, laakiin waxaan filayaa inay suurtogal tahay

Marka la baadho, sidii horeba loo soo sheegay, "taariikh dabacsan" ayaa la isticmaalaa; qoraalku wuxuu helayaa dalabyo saddex maalmood gudahooda ah taariikhda la bixiyay. In kasta oo marka la socodsiinayo qoraalka, ay raadiso dalabyada hal jiho oo keliya, way fududahay in wax laga beddelo si ay u ururiso xogta dhowr jihooyin duulimaad ah. Caawinteeda, waxaad xitaa raadin kartaa tariifooyin khaldan; Helitaanka noocan oo kale ah waxay noqon kartaa mid aad u xiiso badan.

Maxaad ugu baahan tahay xoqan web kale?

Markii ugu horeysay ee aan bilaabay xoqista shabakada, run ahaantii maan xiiso gaar ah u lahayn. Waxaan rabay inaan sameeyo mashruucyo badan oo ku saabsan qaabaynta saadaalinta, falanqaynta maaliyadeed, iyo, suurtogalnimada, xagga falanqaynta midabaynta shucuureed ee qoraallada. Laakin waxaa soo baxday in ay aad u xiiso badneyd in la ogaado sida loo sameeyo barnaamij xogta laga soo aruuriyo mareegaha. Markii aan mawduucan u dhex galay, waxaan ogaaday in xoqitaanka webku yahay "matoorka" internetka.

Waxaa laga yaabaa inaad u maleyso in tani ay tahay hadal geesinimo leh. Laakin ka fiirso in Google-ku uu ku bilaabay xoqida webka ee Larry Page uu ku abuuray Java iyo Python. Robots-ka Google-ku waxa ay sahminayeen intarneetka, iyaga oo isku dayaya in ay dadka isticmaala u siiyaan jawaabaha ugu wanagsan ee su'aalahooda. Xarigga shabakadu waxay leedahay adeegsi aan dhammaad lahayn, xitaa haddii aad xiisaynayso shay kale oo Sayniska Xogta ah, waxaad u baahan doontaa xirfado xoqin si aad u hesho xogta aad u baahan tahay si aad u falanqeyso.

Waxaan ka helay qaar ka mid ah farsamooyinka halkan loo isticmaalo si cajiib ah buugga ku saabsan xoqitaanka webka, oo aan dhawaan helay. Waxa ay ka kooban tahay tusaalooyin iyo fikrado fudud oo badan oo la taaban karo oo ku saabsan waxa aad baratay. Intaa waxaa dheer, waxaa jira cutub aad u xiiso badan oo ku saabsan ka gudubka hubinta reCaptcha. Tani waxay ii timid war ahaan, maadaama aanan xitaa ogeyn inay jiraan qalab gaar ah iyo xitaa adeegyo dhan oo lagu xalliyo dhibaatooyinkan oo kale.

Ma jeceshahay inaad safarto?!

Su'aasha fudud ee aan dhibka lahayn ee ku xusan ciwaanka qaybtan, waxa aad inta badan maqlaysaa jawaabo togan oo ay weheliso dhawr sheeko oo ka mid ah safarradii qofka la waydiiyay. Inta badan oo naga mid ah waxaan ku heshiin karnaa in socdaalku uu yahay hab wanaagsan oo aad naftaada ku dhex geli karto jawi dhaqameed oo cusub oo aad ku ballaarin karto aragtidaada. Si kastaba ha ahaatee, haddii aad waydiiso qof inuu jecel yahay raadinta tigidhada diyaaradaha, waxaan hubaa in jawaabtu aysan noqon doonin mid wanaagsan. Run ahaantii, Python halkan ayay noogu timaadaa gargaar.

Hawsha ugu horeysa ee aan u baahanahay in aan ku xalino habka abuurista nidaamka raadinta macluumaadka tigidhada diyaaraduhu waa xulashada goob ku habboon oo aan ka qaadaneyno macluumaadka. Xallinta dhibaatadan iimay fududayn, laakiin ugu dambayntii waxaan doortay adeegga Kayak. Waxaan isku dayay adeegyada Momondo, Skyscanner, Expedia, iyo kuwa kale oo yar, laakiin hababka ilaalinta robot-ka ee agabyadani waxay ahaayeen kuwo aan la geli karin. Isku dayo dhowr ah ka dib, inta lagu guda jiro taas oo aan ku khasbanaaday in aan la tacaalo nalalka taraafigga, isgoysyada dadka lugeynaya iyo baaskiiladaha, isku dayga in aan ku qanciyo nidaamyada inaan ahay bini'aadan, waxaan go'aansaday in Kayak uu ahaa mid igu habboon aniga, inkastoo xaqiiqda ah in xitaa haddii bogag aad u badan ay ku raran yihiin waqti gaaban gudaheed, iyo hubinta sidoo kale bilaabataa. Waxaan ku guuleystey inaan sameeyo bot codsiyo u soo diro goobta 4 ilaa 6 saacadood, wax walbana si fiican ayey u shaqeeyeen. Waqti ka waqti, dhibaatooyin ayaa soo baxa markaad la shaqeyneyso Kayak, laakiin haddii ay bilaabaan inay kugu xanuujiyaan jeegaga, markaa waxaad u baahan tahay inaad gacanta ku qabato iyaga ka dibna bilaw bot, ama sug dhowr saacadood oo jeegaggu waa inuu istaagaa. Haddii loo baahdo, waxaad si fudud ula qabsan kartaa koodhka goob kale, haddii aad sidaas sameyso, waxaad ku soo sheegi kartaa faallooyinka.

Haddii aad hadda bilaabayso xoqitaanka webka oo aadan garanayn sababta shabakadaha qaarkood ay ula halgamaan, ka hor intaadan bilaabin mashruucaaga ugu horreeya ee aaggan, naftaada u roonow oo samee raadinta Google ee erayada "akhlaaqda xoqida webka" . Tijaabooyinkaagu waxa laga yaabaa inay ku dhammaadaan si ka dhakhso badan inta aad u malaynayso haddii aad samayso shabakada xoqidda si aan caqli-gal ahayn.

Bilaabidda

Halkan waxaa ah dulmar guud oo ku saabsan waxa ku dhici doona koodka xoqitaanka shabakada:

  • Soo deji maktabadaha loo baahan yahay.
  • Furitaanka tab Google Chrome
  • Wac hawl bilaaba bot-ka, una gudbisa magaalooyinka iyo taariikhaha la isticmaali doono marka la raadinayo tigidhada.
  • Shaqadani waxay qaadaa natiijooyinka raadinta ugu horreeya, oo lagu kala soocaa sida ugu fiican, oo waxay riixdaa badhanka si ay ugu shubto natiijooyin badan.
  • Hawl kale ayaa xogta ka ururisa bogga oo dhan waxayna soo celisaa qaab-dhismeedka xogta.
  • Labadii tillaabo ee hore waxaa lagu fuliyaa iyadoo la isticmaalayo noocyada kala soocida qiimaha tigidhada (jaban) iyo xawaaraha duulimaadka (ugu dhaqsaha badan).
  • Isticmaalaha qoraalka waxaa loo soo diraa iimayl ka kooban qiimaha tigidhada oo kooban (tigidhada ugu jaban iyo celceliska qiimaha), iyo qaab-dhismeedka xogta oo ay ku jiraan macluumaadka lagu kala saaray saddexda tilmaame ee kor ku xusan waxaa loo kaydiyaa sida faylka Excel.
  • Dhammaan falalka kor ku xusan waxaa lagu sameeyaa wareeg ah ka dib muddo cayiman.

Waa in la ogaadaa in mashruuc kasta oo Selenium ah uu ka bilaabmo darawal shabakadeed. waxaan isticmaalaa Chromedriver, Waxaan la shaqeeyaa Google Chrome, laakiin waxaa jira doorashooyin kale. PhantomJS iyo Firefox sidoo kale waa caan. Ka dib markaad soo dejiso darawalka, waxaad u baahan tahay inaad ku dhejiso faylka ku habboon, tani waxay dhamaystiraysaa diyaarinta isticmaalkeeda. Khadadka ugu horreeya ee qoraalkeena waxay furaan tab cusub oo Chrome ah.

Maskaxda ku hay in sheekadeyda aanan isku dayin inaan furto aragtiyo cusub oo lagu helo heshiisyo waaweyn oo tigidhada hawada ah. Waxaa jira habab aad u horumarsan oo lagu raadinayo dalabyadaas. Kaliya waxaan rabaa inaan u soo bandhigo akhristayaasha qoraalkan hab fudud laakiin la taaban karo oo lagu xalliyo dhibaatadan.

Waa kan koodka aan kor kaga soo hadalnay.

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)

Bilawga koodka waxaad arki kartaa amarrada soo dejinta xirmada ee la isticmaalo inta lagu jiro mashruucayaga. Haddaba, randint loo isticmaalo in lagu sameeyo bot-ku "seexdo" tiro aan toos ahayn oo ilbiriqsi ah ka hor inta aan la bilaabin hawlgal cusub oo raadinta. Caadiyan, hal bot ma samayn karo tan la'aanteed. Haddii aad socodsiiso koodka sare, daaqad Chrome ah ayaa furmi doonta, kaas oo bot-ku u isticmaali doono inuu la shaqeeyo goobaha.

Aan sameyno tijaabo yar oo aan furno shabakada kayak.com daaqad gooni ah. Waxaan dooran doonaa magaalada aan ka duuleyno, iyo magaalada aan rabno, iyo sidoo kale taariikhda duulimaadka. Markaad dooranayso taariikhaha, hubi in xadka +-3 maalmood la isticmaalo. Waxaan qoray koodka anigoo ku xisaabtamaya waxa ay goobta soo saarto jawaabaha codsiyadaas. Haddii, tusaale ahaan, aad u baahan tahay inaad raadiso tigidhada kaliya taariikho cayiman, markaa waxaa jirta suurtogalnimo sare oo aad ku qasban tahay inaad wax ka beddesho koodka bot. Marka aan ka hadlo koodka, waxaan bixiyaa sharraxaad ku habboon, laakiin haddii aad dareento jahwareer, ii soo sheeg.

Hadda dhagsii badhanka raadinta oo fiiri xidhiidhka ku yaal barta ciwaanka. Waa inay la mid noqotaa isku xirka aan ku isticmaalo tusaalaha hoose ee doorsoomiyaha lagu dhawaaqay kayak, kaas oo kaydiya URL-ka, iyo habka loo isticmaalo get darawal web. Kadib markaad riixdo badhanka raadinta, natiijadu waa inay ka soo muuqdaan bogga.

Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan
Markii aan isticmaalay amarka get in ka badan laba ama saddex jeer dhowr daqiiqo gudahood, waxa la i waydiistay in aan dhamaystiro xaqiijinta addoo isticmaalaya reCaptcha. Waxaad ku gudbin kartaa jeegan gacanta oo sii wad tijaabinta ilaa nidaamku go'aansado inuu sameeyo jeeg cusub. Markii aan tijaabiyay qoraalka, waxay u muuqatay in fadhiga ugu horreeya ee raadinta uu had iyo jeer u socdo si habsami leh, markaa haddii aad rabto inaad tijaabiso koodka, kaliya waxaad u baahan tahay inaad si xilliyo ah gacanta u hubiso oo u oggolow koodka inuu shaqeeyo, adoo isticmaalaya wakhti dheer oo u dhexeeya fadhiyada raadinta. Iyo, haddii aad ka fikirto, qofku uma badna inuu u baahdo macluumaadka ku saabsan qiimaha tigidhada ee la helay 10-daqiiqo u dhexeeya hawlgallada raadinta.

Ku shaqaynta bogga adoo isticmaalaya XPath

Markaa, waxaanu furnay daaqad oo aanu ku shubnay goobtii. Si aan u helno qiimaha iyo macluumaadka kale, waxaan u baahanahay inaan isticmaalno tignoolajiyada XPath ama xulashada CSS. Waxaan go'aansaday inaan ku sii socdo XPath mana dareemin baahida loo qabo isticmaalka xulashada CSS, laakiin waa suurtogal in sidaas lagu shaqeeyo. Ku wareegitaanka bogga adoo isticmaalaya XPath waxay noqon kartaa mid adag, iyo xitaa haddii aad isticmaasho farsamooyinka aan ku sharraxay tan maqaal, kaas oo ku lug lahaa nuqul ka mid ah tilmaamayaasha u dhigma ee ka soo baxa code-ka bogga, waxaan ogaaday in tani ay tahay, dhab ahaantii, maaha habka ugu wanaagsan ee lagu galo walxaha lagama maarmaanka ah. By habka, in tan Buuggu wuxuu bixiyaa sharraxaad aad u wanaagsan oo ku saabsan aasaaska la shaqeynta bogagga iyadoo la adeegsanayo xulashada XPath iyo CSS. Tani waa sida habka darawalka shabakada ee u dhigma uu u eg yahay.

Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan
Markaa, aan sii wadno shaqada bot-ka. Aan isticmaalno awooda barnaamijka si aan u doorano tigidhada ugu jaban. Sawirka soo socda, koodka xulashada XPath ayaa lagu muujiyay casaan. Si aad u aragto koodka, waxaad u baahan tahay inaad midig-gujiso qaybta bogga aad xiisaynayso oo ka dooro amarka Kormeerka menu ka soo muuqda. Amarkaan waxaa loogu yeeri karaa bogag kala duwan, koodka kaas oo la soo bandhigi doono oo lagu muujin doono muuqaalka code.

Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan
Eeg summada bogga

Si loo helo xaqiijinta sababteyda ku saabsan faa'iido darrada koobiyeynta xulashada code, fiiro gaar ah u yeelo sifooyinka soo socda.

Tani waa waxa aad helayso markaad koobiyayso koodka:

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

Si aad u koobiyayso wax sidan oo kale ah, waxaad u baahan tahay inaad midig-gujiso qaybta koodka aad xiisaynayso oo ka dooro Nuqulka> Koobiyida XPath ee liiska soo muuqda.

Waa tan waxa aan ku qeexay badhanka ugu raqiisan:

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

Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan
Nuqulka Amarka> Koobiye XPath

Waa wax iska cad in doorashada labaad ay u muuqato mid aad u fudud. Marka la isticmaalo, waxay raadisaa curiye a leh sifada data-code, siman price. Marka la isticmaalayo ikhtiyaarka koowaad, curiyaha waa la raadiyaa id oo la siman wtKI-price_aTab, iyo dariiqa XPath ee curiyaha ayaa u eg /div[1]/div/div/div[1]/div/span/span. Weydiinta XPath ee sidan oo kale ah bogga ayaa samayn doonta khiyaamada, laakiin hal mar oo keliya. Waxaan dhihi karaa hadda id wuu beddeli doonaa marka xigta ee bogga la shubo. Isku xigxiga dabeecadda wtKI isbeddelo firfircooni leh mar kasta oo bogga la shubo, markaa koodka isticmaalaya wuxuu noqonayaa mid aan faa'iido lahayn ka dib bogga soo socda dib u soo dejinta. Markaa qaado wakhti aad ku fahanto XPath. Aqoontan ayaa si fiican kuugu adeegi doonta.

Si kastaba ha ahaatee, waa in la ogaadaa in koobiyeynta xulashada XPath ay faa'iido u yeelan karto markaad la shaqeyneyso goobo fudud oo fudud, iyo haddii aad ku qanacsan tahay tan, ma jiraan wax qalad ah.

Hadda aan ka fikirno waxa la sameeyo haddii aad u baahan tahay inaad ku hesho dhammaan natiijooyinka raadinta dhowr sadar, gudaha liiska. Aad u fudud. Natiija kastaa waxay ku jirtaa gudaha shay leh fasal resultWrapper. Soo dejinta dhammaan natiijooyinka waxaa lagu samayn karaa wareeg la mid ah kan hoose.

Waa in la ogaadaa in haddii aad fahamto kor ku xusan, markaa waa inaad si fudud u fahamtaa inta badan koodka aan falanqeyn doono. Siduu koodhkani u shaqeeyo, waxaanu galnaa waxa aanu u baahanahay (xaqiiqda, qaybta ay natiijadu ku duuduuban tahay) anagoo adeegsanayna nooc ka mid ah habka-dariiqa cayima (XPath). Tan waxaa loo sameeyaa si loo helo qoraalka curiyaha oo lagu dhejiyo shay laga soo akhrin karo xogta (marka ugu horeysa ee la isticmaalo flight_containers, ka dibna - flights_list).

Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan
Saddexda xariiq ee ugu horreeya waa la soo bandhigay, waxaana si cad u arki karnaa wax kasta oo aan u baahanahay. Si kastaba ha ahaatee, waxaan haynaa siyaabo aad u xiiso badan oo lagu helo macluumaadka. Waxaan u baahanahay inaan xogta ka soo qaadno cunsur walba si gooni ah.

Shaqada tag!

Habka ugu fudud ee hawl loo qoro waa in la soo shubo natiijooyin dheeraad ah, markaa waa meesha aan ka bilaabi doono. Waxaan jeclaan lahaa in aan kordhiyo tirada duulimaadyada uu barnaamijku helo macluumaadka ku saabsan, iyada oo aan kor u qaadin shakiyada adeegga ee u horseedaya kormeerka, markaa waxaan riixaa batoonka Load natiijooyin badan mar kasta oo bogga la soo bandhigo. Koodhkan, waa inaad fiiro gaar ah u yeelataa xannibaadda try, taas oo aan ku daray sababtoo ah mararka qaarkood badhanka si sax ah uma shubto. Haddii aad sidoo kale la kulanto kan, faallo ka bixi wicitaannada shaqadan ee koodka shaqada start_kayak, oo aan hoos ku eegi doono.

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

Hadda, ka dib falanqayn dheer oo ku saabsan shaqadan (mararka qaarkood waa la iga qaadi karaa), waxaan diyaar u nahay inaan ku dhawaaqno shaqo ka tirtiri doonta bogga.

Waxaan hore u soo ururiyay inta badan waxa loo baahan yahay shaqada soo socota ee loo yaqaan page_scrape. Mararka qaarkood xogta dariiqa la soo celiyay ayaa la isku daraa, markaa waxaan isticmaalaa hab fudud si aan u kala saaro. Tusaale ahaan, marka aan isticmaalo doorsoomayaasha markii ugu horeysay section_a_list и section_b_list. Shaqadayadu waxay soo celisaa qaab-dhismeedka xogta flights_df, tani waxay noo ogolaanaysaa inaan kala saarno natiijooyinka laga helay hababka kala-soocidda xogta oo hadhow aan isku darno.

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

Waxaan isku dayay inaan magacaabo doorsoomayaasha si koodku u noqdo mid la fahmi karo. Xusuusnow doorsoomayaasha ka bilaabma a ka tirsan tahay marxaladda koowaad ee waddada, iyo b - ilaa labaad. Aan u gudubno shaqada xigta.

Hababka taageerada

Hadda waxaan haynaa shaqo noo ogolaanaysa inaan ku shubno natiijooyin raadin dheeri ah iyo shaqo lagu farsameeyo natiijooyinkaas. Maqaalkani wuxuu ku dhamaan karaa halkan, maadaama labadan hawlood ay bixiyaan wax kasta oo aad u baahan tahay si aad u xoqdo boggaga aad adigu furi karto. Laakiin weli ma aynaan tixgelin qaar ka mid ah hababka caawinta ee kor looga hadlay. Tusaale ahaan, kani waa koodhka dirida iimaylada iyo waxyaalo kale. Waxaas oo dhan waxaa laga heli karaa shaqada start_kayak, oo aan hadda ka fiirsan doono.

Si hawshani u shaqeyso, waxaad u baahan tahay macluumaad ku saabsan magaalooyinka iyo taariikhaha. Isticmaalka macluumaadkan, waxay samaysaa xiriiriye doorsoome kayak, kaas oo loo isticmaalo in lagu geeyo bog ay ku jiraan natiijooyin raadin oo ay u kala sooceen sida ugu fiican ee u dhigma weydiinta. Ka dib fadhiga ugu horreeya ee xoqidda, waxaanu la shaqayn doonaa qiimaha miiska sare ee bogga. Magac ahaan, waxaan heli doonaa qiimaha tigidhada ugu yar iyo qiimaha celceliska. Waxaas oo dhan, oo ay la socdaan saadaasha ay soo saartay goobta, waxaa lagu soo diri doonaa email ahaan. Bogga, miiska u dhigma waa inuu ku yaal geeska bidix ee sare. La shaqeynta miiskaan, jidka, waxay keeni kartaa qalad marka la raadinayo taariikhda saxda ah, tan iyo kiiskan miiska laguma soo bandhigin bogga.

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

Waxaan tijaabiyay qoraalkan anigoo isticmaalaya Outlook account (hotmail.com). Anigu ma tijaabin in aan si sax ah ugu shaqeeyo xisaab Gmail, nidaamka emailkan waa mid caan ah, laakiin waxaa jira fursado badan oo suurtagal ah. Haddii aad isticmaasho akoonka Hotmail, markaas si wax walba u shaqeeyaan, kaliya waxaad u baahan tahay inaad geliso xogtaada koodhka.

Haddii aad rabto inaad fahamto waxa saxda ah ee lagu sameeyo qaybo gaar ah oo ka mid ah koodka shaqadan, waad koobi kartaa iyaga oo tijaabin kartaa. Ku tijaabinta koodka ayaa ah habka kaliya ee si dhab ah loo fahmi karo.

Nidaam diyaarsan

Hadda oo aanu samaynay wax kasta oo aan ka hadalnay, waxaan samayn karnaa wareeg fudud oo wacaya hawlahayaga. Qoraalku wuxuu ka codsadaa xogta isticmaalaha ee ku saabsan magaalooyinka iyo taariikhaha. Markaad tijaabinayso dib u bilaabista joogtada ah ee qoraalka, uma badna inaad rabto inaad xogtan ku geliso gacanta mar kasta, sidaa darteed khadadka u dhigma, wakhtiga tijaabada, ayaa laga faalloon karaa iyada oo aan faallo ka bixin kuwa ka hooseeya, taas oo xogta loo baahan yahay script waa 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.....')

Tani waa sida tijaabada qoraalka u eg yahay.
Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan
Tijaabi socodsiinta qoraalka

Natiijooyinka

Haddii aad ilaa hadda samaysay, hambalyo! Hadda waxaad haysataa xoqan webka shaqeeya, inkastoo aan horayba u arki karo siyaabo badan oo lagu hagaajin karo. Tusaale ahaan, waxaa lagu dhex dari karaa Twilio si ay u soo dirto farriimaha qoraalka ah halkii emails. Waxaad isticmaali kartaa VPN ama shay kale si aad isku mar u hesho natiijooyinka dhowr server. Waxaa sidoo kale jira dhibaato xilliyo soo ifbaxa oo la xiriirta hubinta isticmaalaha goobta si loo arko inuu qof yahay iyo in kale, laakiin dhibaatadan sidoo kale waa la xallin karaa. Si kastaba ha ahaatee, hadda waxaad haysataa saldhig aad ku ballaarin karto haddii aad rabto. Tusaale ahaan, hubi in faylka Excel loo soo diro isticmaalaha si lifaaq ah iimaylka.

Python - kaaliye u helida tigidhada hawada jaban ee kuwa jecel inay safraan

Isticmaalayaasha diiwaangashan oo keliya ayaa ka qaybqaadan kara sahanka. Soo gal, soo dhawoow.

Ma isticmaasha tignoolajiyada xoqitaanka webka?

  • Haa

  • No

8 isticmaale ayaa codeeyay. 1 isticmaale waa ka aamusay.

Source: www.habr.com

Add a comment