Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha

Ny mpanoratra ny lahatsoratra, ny dikanteny izay avoakanay anio, dia milaza fa ny tanjony dia ny hiresaka momba ny fivoaran'ny scraper amin'ny tranonkala amin'ny Python mampiasa Selenium, izay mikaroka ny vidin'ny tapakila fiaramanidina. Rehefa mikaroka tapakila dia ampiasaina ny daty miovaova (+- 3 andro raha oharina amin'ny daty voafaritra). Ny scraper dia mitahiry ny valin'ny fikarohana ao anaty rakitra Excel ary mandefa mailaka miaraka amin'ny famintinana ny zavatra hitany ilay olona nihazakazaka ny fikarohana. Ny tanjon'ity tetikasa ity dia ny hanampy ny mpandeha hahita ny fifanarahana tsara indrindra.

Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha

Raha toa ianao ka mahatsapa ho very, rehefa mahatakatra ny fitaovana, dia jereo izany lahatsoratra.

Inona no hotadiavintsika?

Afaka mampiasa ny rafitra voalaza eto ianao araka izay tianao. Ohatra, nampiasako izy io mba hitadiavana fitsangatsanganana faran'ny herinandro sy tapakila mankany amin'ny tanindrazako. Raha matotra ianao amin'ny fitadiavana tapakila mahasoa dia azonao atao ny mampandeha ny script amin'ny mpizara (simple mpizara, ho an'ny 130 roubles isam-bolana, dia mety amin'izany) ary ataovy azo antoka fa mandeha indray mandeha na indroa isan'andro. Ny valin'ny fikarohana dia halefa any aminao amin'ny alàlan'ny mailaka. Ho fanampin'izay, manoro hevitra aho ny hametraka ny zava-drehetra mba hamonjena ny rakitra Excel miaraka amin'ny valin'ny fikarohana ao anaty lahatahiry Dropbox, izay ahafahanao mijery rakitra toy izany na aiza na aiza sy amin'ny fotoana rehetra.

Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha
Mbola tsy nahita tariff misy lesoka aho fa heveriko fa azo atao izany

Rehefa mikaroka, araka ny efa voalaza, dia ampiasaina ny “daty mora azo”; Na dia eo aza ny fampandehanana ny script, dia mitady tolotra amin'ny lalana iray ihany izy, mora ny manova azy mba hahafahany manangona angona amin'ny torolalana sidina maromaro. Miaraka amin'ny fanampiany, azonao atao mihitsy aza ny mitady karama diso;

Nahoana ianao no mila mpikirakira tranonkala hafa?

Tamin'ny voalohany nanombohako ny fikikisana tranonkala dia tsy dia liana loatra tamin'izany aho. Te-hanao tetikasa bebe kokoa aho eo amin'ny sehatry ny fanodinkodinana, famakafakana ara-bola, ary, mety, eo amin'ny sehatry ny famakafakana ny fandokoana ara-pihetseham-po amin'ny lahatsoratra. Saingy hita fa tena mahaliana ny mamantatra ny fomba hamoronana programa manangona angona avy amin'ny tranokala. Rehefa nandinika an'io lohahevitra io aho dia tsapako fa ny fikikisana tranonkala no "motera" an'ny Internet.

Mety hieritreritra ianao fa fanambarana feno fahasahiana loatra izany. Saingy hevero fa nanomboka tamin'ny scraper web iray noforonin'i Larry Page tamin'ny fampiasana Java sy Python i Google. Nikaroka ny Internet ny robots Google, miezaka manome valiny tsara indrindra amin'ny fanontaniany ireo mpampiasa azy. Ny fikikisana tranonkala dia manana fampiasana tsy misy fiafarana, ary na dia liana amin'ny zavatra hafa amin'ny Data Science aza ianao, dia mila fahaiza-manao kikisana mba hahazoana ny angon-drakitra ilainao hamakafaka.

Hitako ny sasany amin'ireo teknika ampiasaina eto amin'ny mahafinaritra ny boky momba ny fikikisana tranonkala, izay azoko vao haingana. Ahitana ohatra sy hevitra tsotra maro izy io mba hampiharana ny zavatra nianaranao. Ho fanampin'izay, misy toko tena mahaliana momba ny fandalovana ny fisavana reCaptcha. Tonga ho vaovao tamiko izany, satria tsy fantatro akory fa misy fitaovana manokana ary na dia serivisy manontolo aza mba hamahana olana toy izany.

Tia mandeha ve ianao?!

Ho an'ny fanontaniana tsotra sy tsy mampidi-doza apetraka amin'ny lohatenin'ity fizarana ity, dia matetika ianao no mandre valiny tsara, miaraka amin'ny tantara roa avy amin'ny dian'ilay olona nanontaniana azy. Ny ankamaroantsika dia hanaiky fa ny fandehanana dia fomba tsara hanitrika ny tenanao amin'ny tontolo ara-kolontsaina vaovao sy hanitarana ny faravodilanitrao. Na izany aza, raha manontany olona ianao raha tiany ny mitady tapakila fiaramanidina, azoko antoka fa tsy ho tsara loatra ny valiny. Raha ny marina dia tonga manampy antsika eto i Python.

Ny asa voalohany tokony hovahantsika amin'ny fomba hamoronana rafitra hikaroka vaovao amin'ny tapakila fiaramanidina dia ny fisafidianana sehatra mety haka vaovao. Tsy mora tamiko ny famahana ity olana ity, saingy tamin'ny farany dia nisafidy ny serivisy Kayak aho. Nanandrana ny tolotr'i Momondo, Skyscanner, Expedia, ary vitsivitsy hafa aho, saingy tsy azo tsinontsinoavina ny rafitra fiarovana robot amin'ireo loharano ireo. Taorian'ny andrana maromaro, nandritra izay tsy maintsy niatrehana ny jiron'ny fifamoivoizana, ny fiampitan'ny mpandeha an-tongotra sy ny bisikileta, niezaka ny handresy lahatra ny rafitra fa olombelona aho, dia nanapa-kevitra aho fa ny Kayak no mety indrindra amiko, na dia eo aza ny zava-misy fa na dia be loatra aza ny pejy feno entana ao anatin'ny fotoana fohy, ary manomboka ihany koa ny fisavana. Nahavita nandefa fangatahana tany amin'ny tranokala nandritra ny 4 ka hatramin'ny 6 ora aho, ary nandeha tsara ny zava-drehetra. Indraindray dia misy fahasarotana rehefa miasa miaraka amin'ny Kayak, fa raha manomboka manakorontana anao amin'ny fanamarinana izy ireo, dia mila miatrika azy ireo amin'ny tanana ianao ary manomboka ny bot, na miandry ora vitsivitsy ary tokony hijanona ny fisavana. Raha ilaina dia azonao atao ny mampifanaraka mora foana ny code amin'ny sehatra hafa, ary raha manao izany ianao dia azonao atao ny mitatitra izany amin'ny fanehoan-kevitra.

Raha vao manomboka amin'ny fikikisana tranonkala ianao ary tsy mahafantatra ny antony mahatonga ny tranonkala sasany miady amin'izany, dia alohan'ny hanombohanao ny tetikasanao voalohany amin'ity faritra ity dia manaova sitrakao ary manaova fikarohana Google amin'ny teny hoe "web scraping etiquette" . Mety hifarana haingana kokoa noho ny eritreretinao ny andranao raha toa ka manao tsinontsinona ny fikikisana tranonkala ianao.

fanombohana

Ity misy topimaso ankapobeny momba ny zavatra hitranga amin'ny kaody scraper web:

  • Ampidiro ireo tranomboky ilaina.
  • Manokatra tabilao Google Chrome.
  • Antsoy ny fiasa izay manomboka ny bot, mandalo azy ireo tanàna sy daty izay hampiasaina rehefa mikaroka tapakila.
  • Ity asa ity dia maka ny valin'ny fikarohana voalohany, alahatra araka ny tsara indrindra, ary manindry bokotra iray mba hampidirana valiny bebe kokoa.
  • Ny asa iray hafa dia manangona angona avy amin'ny pejy iray manontolo ary mamerina frame data.
  • Ny dingana roa teo aloha dia atao amin'ny fampiasana karazana fanasokajiana amin'ny vidin'ny tapakila (mora) sy amin'ny hafainganam-pandehan'ny sidina (haingana indrindra).
  • Ny mpampiasa ny script dia alefa mailaka misy famintinana ny vidin'ny tapakila (tapakila mora indrindra sy ny vidiny antonony), ary ny rafitra angon-drakitra misy fampahalalana voafantina amin'ireo tondro telo voalaza etsy ambony dia voatahiry ho rakitra Excel.
  • Ireo hetsika rehetra voalaza etsy ambony ireo dia atao amin'ny tsingerina aorian'ny fe-potoana voafaritra.

Marihina fa ny tetikasa Selenium rehetra dia manomboka amin'ny mpamily tranonkala. ampiasaiko Chromedriver, miasa amin'ny Google Chrome aho, saingy misy safidy hafa. PhantomJS sy Firefox koa dia malaza. Aorian'ny fandefasana ny mpamily dia mila mametraka azy ao amin'ny lahatahiry mety ianao, ary izany dia mamita ny fanomanana ny fampiasana azy. Manokatra tabilao Chrome vaovao ny andalana voalohany amin'ny scripty.

Ataovy ao an-tsaina fa amin'ny tantarako dia tsy miezaka manokatra faravodilanitra vaovao aho amin'ny fitadiavana tolotra tsara amin'ny tapakila fiaramanidina. Misy fomba mandroso kokoa amin'ny fitadiavana tolotra toy izany. Te-hanolotra ny mpamaky an'ity fitaovana ity aho fomba tsotra nefa azo ampiharina hamahana ity olana ity.

Ity ny code noresahintsika etsy ambony.

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)

Eo am-piandohan'ny kaody dia hitanao ny baiko fanafarana fonosana izay ampiasaina mandritra ny tetikasantsika. Noho izany, randint nampiasaina mba hahatonga ny bot "matory" mandritra ny segondra maromaro alohan'ny hanombohana asa fikarohana vaovao. Matetika, tsy misy bot iray afaka manao izany raha tsy misy izany. Raha toa ka mihazakazaka ny kaody etsy ambony ianao dia hisokatra ny varavarankely Chrome, izay hampiasain'ny bot mba hiasa amin'ny tranokala.

Andao hanao andrana kely ary sokafy amin'ny varavarankely mitokana ny tranokala kayak.com. Hifidy ny tanàna halehantsika isika, ary ny tanàna tiantsika haleha, ary koa ny datin'ny sidina. Rehefa mifidy daty dia ataovy azo antoka fa ny fe-potoana +-3 andro no ampiasaina. Nanoratra ny kaody aho tamin'ny fijerena izay vokarin'ny tranokala ho valin'ny fangatahana toy izany. Raha ohatra, mila mitady tapakila ho an'ny daty voatondro ihany ianao, dia misy ny mety hisian'ny fanovana ny code bot. Rehefa miresaka momba ny kaody aho dia manome fanazavana mifanaraka amin'izany, fa raha very hevitra ianao dia ampahafantaro ahy.

Tsindrio izao ny bokotra fikarohana ary jereo ny rohy ao amin'ny bara adiresy. Tokony hitovy amin'ny rohy ampiasaiko amin'ny ohatra etsy ambany izay nanambarana ny fari-piadidiana kayak, izay mitahiry ny URL, ary ny fomba ampiasaina get mpamily tranonkala. Aorian'ny fipihana ny bokotra fikarohana dia tokony hiseho eo amin'ny pejy ny valiny.

Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha
Rehefa nampiasa ny baiko aho get in-droa na in-telo mahery tao anatin'ny minitra vitsy dia nasaina namita ny fanamarinana tamin'ny fampiasana reCaptcha aho. Azonao atao ny mandefa an'io fanamarinana io amin'ny tananao ary manohy manandrana mandra-pahatonga ny rafitra hanapa-kevitra ny hanao fisavana vaovao. Rehefa nanandrana ny script aho dia toa nandeha tsara foana ny fotoam-pikarohana voalohany, ka raha te hanandrana ny kaody ianao dia tsy maintsy mijery tsindraindray fotsiny ary mamela ny kaody mandeha, amin'ny fampiasana elanelam-potoana eo anelanelan'ny fotoam-pikarohana. Ary, raha mieritreritra an'izany ianao dia tsy mila fampahalalana momba ny vidin'ny tapakila voaray amin'ny elanelana 10 minitra eo anelanelan'ny asa fikarohana.

Miasa amin'ny pejy mampiasa XPath

Noho izany, nanokatra varavarankely izahay ary nampiditra ilay tranokala. Mba hahazoana vidiny sy fampahalalana hafa dia mila mampiasa teknolojia XPath na CSS selectors isika. Nanapa-kevitra ny hifikitra amin'ny XPath aho ary tsy tsapako fa ilaina ny mampiasa CSS selectors, saingy azo atao tsara ny miasa toy izany. Mety ho sarotra ny fandehanana manodidina pejy iray mampiasa XPath, ary na dia mampiasa ireo teknika nolazaiko aza ianao izany lahatsoratra, izay tafiditra amin'ny fanaovana kopia ireo famantarana mifanandrify amin'ny kaody pejy, tsapako fa tsy izany no fomba tsara indrindra hidirana amin'ireo singa ilaina. Raha ny marina, in izany Ny boky dia manome famaritana tsara momba ny fototry ny miasa amin'ny pejy mampiasa XPath sy CSS selectors. Toy izao ny fomba fiasan'ny mpamily web mifanaraka amin'izany.

Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha
Noho izany, andao hanohy hiasa amin'ny bot. Andao hampiasa ny fahaiza-manaon'ny programa hisafidianana ny tapakila mora indrindra. Amin'ity sary manaraka ity, ny kaody mpifidy XPath dia nasongadina mena. Mba hijerena ny kaody dia mila manindry havanana amin'ny singa pejy mahaliana anao ianao ary safidio ny baiko Inspect avy amin'ny menio miseho. Ity baiko ity dia azo antsoina ho an'ny singa pejy samihafa, ny kaody izay haseho sy hasongadina ao amin'ny mpijery kaody.

Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha
Jereo ny kaody pejy

Mba hahitana fanamafisana ny fanjohian-kevitra momba ny fatiantoka amin'ny fanaovana kopia mpifidy amin'ny kaody dia tandremo ireto endri-javatra manaraka ireto.

Izao no azonao rehefa mandika ny kaody:

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

Raha te handika zavatra toy izany ianao dia mila manindry havanana amin'ny fizarana kaody mahaliana anao ary safidio ny baiko Copy> Copy XPath avy amin'ny menio miseho.

Ity no nampiasaiko hamaritana ny bokotra mora indrindra:

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

Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha
Copy Command > Copy XPath

Tena miharihary fa ny safidy faharoa dia toa tsotra kokoa. Rehefa ampiasaina dia mitady singa a manana ny toetra data-code, mitovy price. Rehefa mampiasa ny safidy voalohany dia karohina ny singa id izay mitovy amin'ny wtKI-price_aTab, ary toa ny lalana XPath mankany amin'ilay singa /div[1]/div/div/div[1]/div/span/span. Ny fangatahana XPath tahaka izao amin'ny pejy iray dia hanao ny fika, fa indray mandeha ihany. Afaka miteny aho izao id dia hiova amin'ny manaraka rehefa fenoina ny pejy. Filaharan'ny toetra wtKI miova dynamique isaky ny asiana pejy, ka tsy hisy ilana azy intsony ny code mampiasa azy aorian'ny famerenan'ny pejy manaraka. Koa makà fotoana kely hahafantarana ny XPath. Hanampy anao tsara izany fahalalana izany.

Na izany aza, tokony ho marihina fa ny fanaovana kopia ny mpifidy XPath dia mety mahasoa rehefa miasa amin'ny tranokala tsotra, ary raha mahazo aina amin'izany ianao dia tsy misy maharatsy izany.

Andeha hojerentsika izao ny tokony hatao raha mila maka ny valin'ny fikarohana rehetra amin'ny andalana maromaro ianao, ao anaty lisitra. Tena tsotra. Ny vokatra tsirairay dia ao anatin'ny zavatra iray misy kilasy resultWrapper. Ny fametahana ny valiny rehetra dia azo atao amin'ny tadio mitovy amin'ilay aseho etsy ambany.

Marihina fa raha azonao ny voalaza etsy ambony, dia tokony ho takatrao mora foana ny ankamaroan'ny code izay hodinihinay. Rehefa mandeha io kaody io, dia miditra amin'izay ilaintsika isika (raha ny marina, ny singa misy ny vokatra nofonosina) amin'ny fampiasana karazana mekanika mamaritra ny lalana (XPath). Izany dia atao mba hahazoana ny lahatsoratry ny singa ary mametraka izany amin'ny zavatra iray azo vakina ny angona (fampiasana voalohany flight_containers, avy eo- flights_list).

Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha
Ny andalana telo voalohany dia aseho ary hitantsika mazava tsara izay rehetra ilaintsika. Na izany aza, manana fomba mahaliana kokoa hahazoana vaovao izahay. Mila maka angona avy amin'ny singa tsirairay isika.

Mandehana miasa!

Ny fomba tsotra indrindra hanoratana asa dia ny mametaka valiny fanampiny, ka eo no hanombohantsika. Te-hampitombo ny isan'ny sidina andraisan'ny fandaharana vaovao aho, tsy mampiahiahy amin'ny serivisy mitondra any amin'ny fisafoana, noho izany dia tsindrio ny bokotra Load more results indray mandeha isaky ny miseho ny pejy. Amin'ity fehezan-dalàna ity dia tokony handinika ny sakana ianao try, izay nampiako satria indraindray tsy mandeha tsara ny bokotra. Raha sendra an'izany koa ianao dia asio fanamarihana ny antso amin'ity asa ity ao amin'ny code code start_kayak, izay hojerentsika eto ambany.

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

Ankehitriny, aorian'ny famakafakana lava momba an'io asa io (indraindray aho dia mety ho lasa lavitra), dia vonona ny hanambara asa iray izay hanakisana ny pejy.

Efa nanangona ny ankamaroan'ny zavatra ilaina amin'ny asa manaraka antsoina hoe page_scrape. Indraindray dia mitambatra ny angon-drakitra lalana naverina, ka mampiasa fomba tsotra aho hanasarahana azy. Ohatra, rehefa mampiasa variables voalohany aho section_a_list и section_b_list. Mamerina frame data ny fiasantsika flights_df, izany dia ahafahantsika manasaraka ny vokatra azo avy amin'ny fomba fanasokajiana angon-drakitra samihafa ary manambatra azy ireo avy eo.

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

Niezaka nanome anarana ireo variables aho mba ho azo ny kaody. Tsarovy fa ny variables manomboka amin'ny a an'ny dingana voalohany amin'ny lalana, ary b - mankany amin'ny faharoa. Andao hiroso amin'ny asa manaraka.

Mekanisma fanohanana

Manana fiasa isika izao izay mamela antsika hampiditra valim-pikarohana fanampiny sy fiasa iray hikarakarana ireo valiny ireo. Mety ho nifarana teto ity lahatsoratra ity, satria ireo fiasa roa ireo dia manome izay rehetra ilainao hamakiana pejy azonao sokafana. Saingy mbola tsy nandinika ny sasany amin'ireo mekanisma mpanampy noresahina etsy ambony isika. Ohatra, ity no kaody handefasana mailaka sy zavatra hafa. Izany rehetra izany dia hita ao amin'ny asa start_kayak, izay hodinihintsika izao.

Mba hampandehanana ity asa ity dia mila fampahalalana momba ny tanàna sy ny daty ianao. Amin'ny fampiasana an'io fampahalalana io, dia mamorona rohy ao anaty faribolana izy kayak, izay ampiasaina hitondrana anao any amin'ny pejy iray izay ahitana valim-pikarohana nalahatra araka ny mifanaraka tsara indrindra amin'ny fangatahana. Aorian'ny fotoam-pivoriana voalohany dia hiara-hiasa amin'ny vidiny eo amin'ny latabatra eo an-tampon'ny pejy izahay. Izany hoe, ho hitantsika ny vidin'ny tapakila ambany indrindra sy ny vidiny antonony. Izany rehetra izany, miaraka amin'ny faminaniana navoakan'ny tranokala, dia halefa amin'ny mailaka. Eo amin'ny pejy, ny latabatra mifanandrify dia tokony ho eo amin'ny zoro ambony havia. Ny miasa miaraka amin'ity latabatra ity, raha ny marina, dia mety hiteraka hadisoana rehefa mikaroka amin'ny fampiasana daty marina, satria amin'ity tranga ity dia tsy aseho amin'ny pejy ny latabatra.

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

Nanandrana ity script ity aho tamin'ny fampiasana kaonty Outlook (hotmail.com). Tsy nanandrana azy io aho mba hiasa tsara amin'ny kaonty Gmail, ity rafitra mailaka ity dia malaza be, saingy misy safidy maro azo atao. Raha mampiasa kaonty Hotmail ianao, dia mila mampiditra ny angon-drakitrao ao amin'ny code ianao mba hahafahan'ny zava-drehetra miasa.

Raha te-hahatakatra hoe inona marina no atao amin'ny fizarana manokana amin'ny kaody ho an'ity fiasa ity, azonao atao ny mandika azy ireo ary manandrana azy ireo. Ny fanandramana amin'ny kaody no hany fomba hahazoana izany.

Rafitra vonona

Amin'izao fotoana izao, rehefa vita ny zavatra rehetra noresahintsika, dia afaka mamorona loop tsotra izay miantso ny fiasantsika. Ny script dia mangataka angona avy amin'ny mpampiasa momba ny tanàna sy ny daty. Rehefa manao fitiliana miaraka amin'ny fanombohana tsy tapaka ny script ianao dia mety tsy te hampiditra an'io angon-drakitra io isaky ny mandeha, ka ny andalana mifanaraka amin'izany, amin'ny fotoam-pitsapana, dia azo omena hevitra amin'ny alàlan'ny tsy fanehoan-kevitra eo ambanin'izy ireo, izay ahitana ny angon-drakitra ilain'ny ny script dia 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.....')

Toy izao ny fisehon'ny andrana amin'ny script.
Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha
Fitsapana ny script

vokatra

Raha nahavita izany ianao dia arahabaina! Manana mpikirakira tranonkala miasa ianao izao, na dia efa hitako aza ny fomba maro hanatsarana azy. Ohatra, azo ampidirina amin'ny Twilio izy io mba handefasana hafatra an-tsoratra fa tsy mailaka. Afaka mampiasa VPN na zavatra hafa ianao mba handraisana valiny avy amin'ny mpizara maromaro. Misy ihany koa ny olana mipoitra tsindraindray amin'ny fanamarinana ny mpampiasa tranonkala mba hahitana raha olona izy, saingy azo vahana ihany koa io olana io. Na izany na tsy izany, manana fototra azonao itarina ianao izao raha tianao. Ohatra, ataovy azo antoka fa alefa any amin'ny mpampiasa ny rakitra Excel ho toy ny fametahana mailaka.

Python - mpanampy amin'ny fitadiavana tapakila fiaramanidina tsy lafo ho an'ireo izay tia mandeha

Ireo mpampiasa voasoratra anarana ihany no afaka mandray anjara amin'ny fanadihadiana. HiditraPlease.

Mampiasa teknôlôjian'ny fikikisana tranonkala ve ianao?

  • fa

  • No

Mpampiasa 8 no nifidy. Mpampiasa 1 no nifady.

Source: www.habr.com

Add a comment