Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje

Otè a nan atik la, tradiksyon an nan ki nou ap pibliye jodi a, di ke objektif li se pale sou devlopman nan yon grate entènèt nan Python lè l sèvi avèk Selenyòm, ki rechèch pou pri tikè avyon. Lè w ap chèche tikè, yo itilize dat fleksib (+- 3 jou parapò ak dat espesifye yo). Ratwa a sove rezilta rechèch yo nan yon fichye Excel epi voye moun ki te kouri rechèch la yon imèl ak yon rezime de sa yo te jwenn. Objektif pwojè sa a se ede vwayajè yo jwenn pi bon kontra yo.

Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje

Si, pandan w ap konprann materyèl la, ou santi w pèdi, gade sa a atik.

Kisa nou pral chèche?

Ou lib pou itilize sistèm ki dekri isit la jan ou vle. Pou egzanp, mwen te itilize li pou chèche vwayaj nan wikenn ak tikè nan vil mwen an. Si ou serye sou jwenn tikè pwofitab, ou ka kouri script la sou sèvè a (senp sèvè, pou 130 rubles yon mwa, se byen apwopriye pou sa a) epi asire w ke li kouri yon fwa oswa de fwa pa jou. Rezilta rechèch yo pral voye ba ou pa imel. Anplis de sa, mwen rekòmande mete tout bagay moute pou ke script la sove yon fichye Excel ak rezilta rechèch nan yon katab Dropbox, ki pral pèmèt ou wè dosye sa yo nenpòt kote ak nenpòt ki lè.

Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje
Mwen poko jwenn tarif ki gen erè, men mwen panse li posib

Lè w ap chèche, jan sa deja mansyone, yo itilize yon "dat fleksib"; script la jwenn òf ki nan twa jou apre dat yo bay yo. Malgre ke lè w ap kouri script la, li chèche òf nan yon sèl direksyon, li fasil pou modifye li pou li ka kolekte done sou plizyè direksyon vòl. Avèk èd li, ou ka menm gade pou tarif inègza, jwenn sa yo ka trè enteresan.

Poukisa ou bezwen yon lòt grate entènèt?

Lè mwen te kòmanse fè grafouyen entènèt, mwen onètman pa t 'partikilyèman enterese nan li. Mwen te vle fè plis pwojè nan domèn modèl prediksyon, analiz finansye, epi, pètèt, nan domèn analize koloran emosyonèl tèks yo. Men, li te tounen soti ke li te trè enteresan yo konnen ki jan yo kreye yon pwogram ki kolekte done ki soti nan sit entènèt. Kòm mwen te fouye nan sijè sa a, mwen reyalize ke entènèt grate se "motè a" nan entènèt la.

Ou ka panse ke sa a se yon deklarasyon twò fonse. Men, konsidere ke Google te kòmanse ak yon grate entènèt ke Larry Page te kreye lè l sèvi avèk Java ak Python. Google robo yo te eksplore entènèt la, ap eseye bay itilizatè li yo pi bon repons pou kesyon yo. Web grate gen itilizasyon kontinuèl, e menm si w enterese nan yon lòt bagay nan Syans Done, w ap bezwen kèk ladrès grate pou jwenn done ou bezwen analize.

Mwen te jwenn kèk nan teknik yo itilize isit la nan yon bèl bagay liv la sou entènèt grate, ke mwen dènyèman akeri. Li genyen anpil egzanp senp ak ide pou aplikasyon pratik sa ou te aprann yo. Anplis de sa, gen yon chapit trè enteresan sou kontoune chèk reCaptcha. Sa a te vini kòm nouvèl pou mwen, paske mwen pa t 'menm konnen ke te gen zouti espesyal e menm sèvis antye pou rezoud pwoblèm sa yo.

Ou renmen vwayaje?!

Pou kesyon ki senp epi olye inofansif ki poze nan tit seksyon sa a, ou ka souvan tande yon repons pozitif, akonpaye pa yon koup nan istwa ki soti nan vwayaj moun yo te mande yo. Pifò nan nou ta dakò ke vwayaje se yon bon fason yo plonje tèt ou nan nouvo anviwònman kiltirèl ak elaji orizon ou. Sepandan, si ou mande yon moun si yo renmen chèche tikè avyon, mwen sèten ke repons lan pa pral tèlman pozitif. Kòm yon kesyon de reyalite, Python vini nan èd nou isit la.

Premye travay ke nou bezwen rezoud sou wout la nan kreye yon sistèm pou chèche enfòmasyon sou tikè avyon yo pral chwazi yon platfòm apwopriye nan ki nou pral pran enfòmasyon. Rezoud pwoblèm sa a pa t fasil pou mwen, men finalman mwen te chwazi sèvis Kayak la. Mwen te eseye sèvis Momondo, Skyscanner, Expedia, ak kèk lòt, men mekanis pwoteksyon robo sou resous sa yo te inpénétrabl. Apre plizyè tantativ, pandan ke mwen te oblije fè fas ak limyè trafik, pasaj pyeton ak bisiklèt, eseye konvenk sistèm yo ke mwen se moun, mwen deside ke Kayak te pi byen adapte pou mwen, malgre lefèt ke menm si Twòp paj chaje. nan yon ti tan, ak chèk kòmanse tou. Mwen jere fè bot la voye demann sou sit la nan entèval 4 a 6 èdtan, ak tout bagay te travay byen. De tan zan tan, difikilte parèt lè w ap travay ak Kayak, men si yo kòmanse trakase w ak chèk, Lè sa a, ou bezwen swa fè fas ak yo manyèlman ak Lè sa a, lanse bot la, oswa rete tann kèk èdtan ak chèk yo ta dwe sispann. Si sa nesesè, ou ka fasilman adapte kòd la pou yon lòt platfòm, epi si ou fè sa, ou ka rapòte li nan kòmantè yo.

Si w ap fèk kòmanse ak entènèt grate epi ou pa konnen poukisa kèk sit entènèt ap lite ak li, Lè sa a, anvan ou kòmanse premye pwojè ou a nan zòn sa a, fè tèt ou yon favè epi fè yon rechèch Google sou mo "web scraping etikèt" . Eksperyans ou yo ka fini pi bonè pase ou panse si ou fè entènèt grate san saj.

Pou kòmanse

Men yon apèsi jeneral sou sa ki pral rive nan kòd grate entènèt nou an:

  • Enpòte bibliyotèk ki nesesè yo.
  • Louvri yon tab Google Chrome.
  • Rele yon fonksyon ki kòmanse bot la, pase li vil yo ak dat ki pral itilize lè w ap chèche tikè.
  • Fonksyon sa a pran premye rezilta rechèch yo, klase pa pi bon, epi klike sou yon bouton pou chaje plis rezilta.
  • Yon lòt fonksyon kolekte done ki sòti nan tout paj la epi retounen yon ankadreman done.
  • De etap anvan yo fèt lè l sèvi avèk kalite klasman pa pri tikè (bon mache) ak pa vitès vòl (pi rapid).
  • Yo voye itilizatè a nan script la yon imèl ki gen yon rezime pri tikè yo (pi bon mache tikè ak pri mwayèn), epi yo sove yon ankadreman done ak enfòmasyon ki klase dapre twa endikatè ki mansyone anwo yo sove kòm yon dosye Excel.
  • Tout aksyon ki anwo yo fèt nan yon sik apre yon peryòd tan espesifye.

Li ta dwe remake ke chak pwojè Selenyòm kòmanse ak yon chofè entènèt. Mwen itilize Chromedriver, Mwen travay ak Google Chrome, men gen lòt opsyon. PhantomJS ak Firefox yo tou popilè. Apre w fin telechaje chofè a, ou bezwen mete l nan katab ki apwopriye a, epi sa a fini preparasyon pou itilize li. Premye liy script nou an louvri yon nouvo tab Chrome.

Kenbe nan tèt ou ke nan istwa mwen mwen pa ap eseye louvri orizon nouvo pou jwenn gwo kontra sou tikè avyon. Gen metòd pi avanse pou chèche òf sa yo. Mwen jis vle ofri lektè materyèl sa a yon fason ki senp men pratik pou rezoud pwoblèm sa a.

Men kòd nou te pale anlè a.

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)

Nan kòmansman an nan kòd la ou ka wè kòmandman yo enpòte pake ke yo te itilize nan tout pwojè nou an. Se konsa, randint itilize pou fè bot la "tonbe dòmi" pou yon kantite segonn o aza anvan yo kòmanse yon operasyon rechèch nouvo. Anjeneral, pa yon sèl bot ka fè san sa. Si ou kouri kòd ki anwo a, yon fenèt Chrome ap louvri, ki bot la pral itilize pou travay ak sit yo.

Ann fè yon ti eksperyans epi ouvri sit entènèt kayak.com nan yon fenèt apa. Nou pral chwazi vil kote nou pral vole a, ak vil nou vle ale nan, osi byen ke dat vòl yo. Lè w ap chwazi dat, asire w ke yo itilize seri a nan +-3 jou. Mwen te ekri kòd la pran an kont sa sit la pwodui an repons a demann sa yo. Si, pou egzanp, ou bezwen fè rechèch pou tikè sèlman pou dat espesifye, Lè sa a, gen yon gwo pwobabilite ke ou pral oblije modifye kòd la bot. Lè mwen pale sou kòd la, mwen bay eksplikasyon apwopriye, men si ou santi ou konfonn, fè m 'konnen.

Koulye a, klike sou bouton rechèch la epi gade lyen ki nan ba adrès la. Li ta dwe sanble ak lyen mwen itilize nan egzanp ki anba a kote varyab la deklare kayak, ki estoke URL la, epi yo itilize metòd la get chofè entènèt. Apre klike sou bouton rechèch la, rezilta yo ta dwe parèt sou paj la.

Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje
Lè mwen te itilize kòmandman an get plis pase de oswa twa fwa nan kèk minit, mwen te mande pou konplete verifikasyon lè l sèvi avèk reCaptcha. Ou ka pase chèk sa a manyèlman epi kontinye fè eksperyans jiskaske sistèm lan deside kouri yon nouvo chèk. Lè m 'te teste script la, li te sanble tankou premye sesyon rechèch la te toujou fèt san pwoblèm, kidonk si ou te vle fè eksperyans ak kòd la, ou ta sèlman gen detanzantan tcheke manyèlman epi kite kòd la kouri, lè l sèvi avèk entèval long ant sesyon rechèch la. Epi, si w panse osijè de sa, yon moun pa gen anpil chans bezwen enfòmasyon sou pri tikè yo resevwa nan entèval 10 minit ant operasyon rechèch.

Travay ak yon paj lè l sèvi avèk XPath

Se konsa, nou louvri yon fenèt epi chaje sit la. Pou jwenn pri ak lòt enfòmasyon, nou bezwen sèvi ak teknoloji XPath oswa seleksyon CSS. Mwen te deside rete ak XPath epi mwen pa t 'santi bezwen an sèvi ak seleksyon CSS, men li la byen posib yo travay nan fason sa a. Navige nan yon paj lè l sèvi avèk XPath ka difisil, e menm si ou itilize teknik mwen dekri nan sa a atik, ki enplike kopye idantifyan ki koresponn yo nan kòd paj la, mwen reyalize ke sa a se, an reyalite, pa fason ki pi bon jwenn aksè nan eleman ki nesesè yo. By wout la, nan sa a Liv la bay yon deskripsyon ekselan sou baz yo nan travay ak paj lè l sèvi avèk XPath ak seleksyon CSS. Sa a se sa ki korespondan web chofè metòd sanble.

Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje
Se konsa, ann kontinye travay sou bot la. Ann sèvi ak kapasite pwogram nan pou chwazi tikè ki pi bon mache yo. Nan imaj sa a, kòd seleksyon XPath la make an wouj. Pou w ka wè kòd la, ou bezwen klike sou eleman paj ou enterese a epi chwazi lòd Enspekte nan meni ki parèt la. Kòmand sa a ka rele pou eleman paj diferan, kòd la ki pral parèt ak make nan visualiseur kòd la.

Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje
Gade kòd paj la

Yo nan lòd yo jwenn konfimasyon nan rezònman mwen sou dezavantaj yo nan kopye seleksyon nan kòd, peye atansyon sou karakteristik sa yo.

Men sa ou jwenn lè w kopye kòd la:

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

Pou w ka kopye yon bagay tankou sa a, ou bezwen klike sou seksyon kòd ou enterese epi chwazi kòmandman Kopi > Kopi XPath nan meni ki parèt la.

Men sa mwen itilize pou defini bouton ki pi bon mache a:

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

Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje
Kopi Kòmandman> Kopi XPath

Li se byen evidan ke dezyèm opsyon an sanble pi senp. Lè yo itilize li, li chèche yon eleman a ki gen atribi a data-codeegal a price. Lè w ap itilize premye opsyon a, yo chèche eleman an id ki egal a wtKI-price_aTab, ak chemen XPath nan eleman an sanble /div[1]/div/div/div[1]/div/span/span. Yon rechèch XPath tankou sa a nan yon paj pral fè jwe fent la, men se sèlman yon fwa. Mwen ka di kounye a sa id pral chanje pwochen fwa paj la chaje. Sekans karaktè wtKI chanje dinamik chak fwa paj la chaje, kidonk kòd ki sèvi ak li a pral initil apre pwochen paj la rechaje. Se konsa, pran kèk tan yo konprann XPath. Konesans sa a ap sèvi ou byen.

Sepandan, li ta dwe remake ke kopye seleksyon XPath ka itil lè w ap travay ak sit jistis senp, epi si ou konfòtab ak sa a, pa gen anyen mal ak li.

Koulye a, ann reflechi sou sa pou w fè si ou bezwen jwenn tout rezilta rechèch yo nan plizyè liy, andedan yon lis. Trè senp. Chak rezilta se andedan yon objè ki gen yon klas resultWrapper. Chaje tout rezilta yo ka fè nan yon bouk ki sanble ak sa ki montre anba a.

Li ta dwe remake ke si ou konprann pi wo a, Lè sa a, ou ta dwe fasil konprann pi fò nan kòd la ke nou pral analize. Kòm kòd sa a kouri, nou jwenn aksè nan sa nou bezwen (an reyalite, eleman nan ki vlope rezilta a) lè l sèvi avèk yon kalite mekanis ki espesifye chemen (XPath). Sa fèt pou jwenn tèks eleman an epi mete l nan yon objè kote done yo ka li (premye itilize. flight_containers, lè sa a - flights_list).

Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje
Twa premye liy yo parèt epi nou ka klèman wè tout sa nou bezwen. Sepandan, nou gen plis enteresan fason pou jwenn enfòmasyon. Nou bezwen pran done ki soti nan chak eleman separeman.

Al travay!

Fason ki pi fasil pou ekri yon fonksyon se chaje rezilta adisyonèl, kidonk se la nou pral kòmanse. Mwen ta renmen maksimize kantite vòl ke pwogram nan resevwa enfòmasyon sou yo, san yo pa leve sispèk nan sèvis la ki mennen nan yon enspeksyon, kidonk mwen klike sou bouton an Chaje plis rezilta yon fwa chak fwa paj la parèt. Nan kòd sa a, ou ta dwe peye atansyon sou blòk la try, ki mwen te ajoute paske pafwa bouton an pa chaje byen. Si ou rankontre sa a tou, kòmante apèl nan fonksyon sa a nan kòd fonksyon an start_kayak, ke nou pral gade anba a.

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

Koulye a, apre yon analiz long nan fonksyon sa a (pafwa mwen ka pran lwen), nou pare yo deklare yon fonksyon ki pral grate paj la.

Mwen te deja kolekte pi fò nan sa ki nesesè nan fonksyon sa a ki rele page_scrape. Pafwa done chemen yo retounen yo konbine, kidonk mwen itilize yon metòd senp pou separe li. Pou egzanp, lè mwen itilize varyab pou premye fwa section_a_list и section_b_list. Fonksyon nou an retounen yon ankadreman done flights_df, sa pèmèt nou separe rezilta yo jwenn nan diferan metòd klasman done epi pita konbine yo.

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

Mwen te eseye bay non varyab yo pou kòd la ta ka konprann. Sonje ke varyab kòmanse ak a fè pati premye etap nan chemen an, ak b - nan dezyèm lan. Ann ale nan pwochen fonksyon an.

Mekanis sipò yo

Kounye a nou gen yon fonksyon ki pèmèt nou chaje rezilta rechèch adisyonèl ak yon fonksyon pou trete rezilta sa yo. Atik sa a te kapab fini isit la, depi de fonksyon sa yo bay tout sa ou bezwen grate paj ke ou ka louvri tèt ou. Men, nou poko konsidere kèk nan mekanis oksilyè yo diskite pi wo a. Pou egzanp, sa a se kòd la pou voye imèl ak kèk lòt bagay. Tout bagay sa yo ka jwenn nan fonksyon an start_kayak, ke nou pral konsidere kounye a.

Pou fonksyon sa a travay, ou bezwen enfòmasyon sou vil ak dat. Sèvi ak enfòmasyon sa a, li fòme yon lyen nan yon varyab kayak, ki itilize pou mennen ou nan yon paj ki pral genyen rezilta rechèch ki klase dapre pi bon matche ak rechèch la. Apre premye sesyon grate a, nou pral travay ak pri yo nan tablo ki anlè paj la. Savwa, nou pral jwenn pri a minimòm tikè ak pri an mwayèn. Tout bagay sa a, ansanm ak prediksyon an pibliye pa sit la, yo pral voye pa imel. Sou paj la, tablo ki koresponn lan ta dwe nan kwen anwo gòch. Travay ak tablo sa a, an reyalite, ka lakòz yon erè lè w ap chèche lè l sèvi avèk dat egzak, paske nan ka sa a tablo a pa parèt sou paj la.

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

Mwen teste script sa a lè l sèvi avèk yon kont Outlook (hotmail.com). Mwen pa te teste li pou travay kòrèkteman ak yon kont Gmail, sistèm imel sa a se byen popilè, men gen anpil opsyon posib. Si ou itilize yon kont Hotmail, Lè sa a, nan lòd pou tout bagay travay, ou jis bezwen antre done ou nan kòd la.

Si ou vle konprann ki sa egzakteman y ap fè nan seksyon espesifik nan kòd la pou fonksyon sa a, ou ka kopye yo epi fè eksperyans avèk yo. Eksperyans ak kòd la se sèl fason pou vrèman konprann li.

Sistèm pare

Kounye a ke nou te fè tout sa nou te pale sou, nou ka kreye yon bouk senp ki rele fonksyon nou yo. Script la mande done itilizatè a sou vil ak dat. Lè tès ak rekòmanse konstan nan script la, ou pa gen anpil chans vle antre done sa yo manyèlman chak fwa, kidonk liy ki koresponn yo, pou tan tès la, yo ka fè kòmantè soti nan uncommenting sa yo ki anba yo, nan ki done yo bezwen an. script kode di.

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

Sa a se sa yon tès kouri nan script la sanble.
Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje
Tès kouri nan script la

Rezilta

Si ou te rive byen lwen, felisitasyon! Ou gen kounye a yon grate entènèt k ap travay, byenke mwen ka deja wè plizyè fason pou amelyore li. Pou egzanp, li ka entegre ak Twilio pou li voye mesaj tèks olye pou yo imèl. Ou ka sèvi ak yon vpn oswa yon lòt bagay an menm tan resevwa rezilta nan plizyè serveurs. Genyen tou yon pwoblèm detanzantan rive ak tcheke itilizatè sit la pou wè si li se yon moun, men pwoblèm sa a kapab tou rezoud. Nan nenpòt ka, kounye a ou gen yon baz ke ou ka elaji si ou vle. Pou egzanp, asire w ke yo voye yon fichye Excel bay itilizatè a kòm yon atachman nan yon imèl.

Python - yon asistan nan jwenn tikè avyon pa chè pou moun ki renmen vwayaje

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Èske w itilize teknoloji grate entènèt?

  • Да

  • Pa gen

8 itilizatè yo te vote. 1 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè