Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe

Ang tagsulat sa artikulo, ang paghubad nga among gipatik karon, nag-ingon nga ang katuyoan niini mao ang paghisgot bahin sa pag-uswag sa usa ka web scraper sa Python gamit ang Selenium, nga nangita alang sa mga presyo sa tiket sa eroplano. Kung nangita alang sa mga tiket, gigamit ang mga flexible nga petsa (+- 3 ka adlaw nga may kalabotan sa gipiho nga mga petsa). Gitipigan sa scraper ang mga resulta sa pagpangita sa usa ka file sa Excel ug gipadala ang tawo nga nagpadagan sa pagpangita og email nga adunay katingbanan sa ilang nakit-an. Ang katuyoan niini nga proyekto mao ang pagtabang sa mga magpapanaw nga makit-an ang labing kaayo nga mga deal.

Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe

Kung, samtang nasabtan ang materyal, gibati nimo nga nawala, tan-awa kini artikulo.

Unsa ang atong pangitaon?

Libre ka sa paggamit sa sistema nga gihulagway dinhi kung gusto nimo. Pananglitan, gigamit nako kini sa pagpangita sa mga paglibot sa semana ug mga tiket sa akong lungsod nga natawhan. Kung seryoso ka bahin sa pagpangita og mapuslanon nga mga tiket, mahimo nimong ipadagan ang script sa server (simple server, alang sa 130 nga mga rubles sa usa ka bulan, angay alang niini) ug siguroha nga kini modagan kausa o kaduha sa usa ka adlaw. Ang mga resulta sa pagpangita ipadala kanimo pinaagi sa email. Dugang pa, girekomenda ko ang pag-set up sa tanan aron ang script makatipig sa usa ka file sa Excel nga adunay mga resulta sa pagpangita sa usa ka folder sa Dropbox, nga magtugot kanimo sa pagtan-aw sa ingon nga mga file gikan sa bisan diin ug bisan unsang oras.

Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe
Wala pa ako nakit-an nga mga taripa nga adunay mga sayup, apan sa akong hunahuna posible kini

Kung nangita, ingon sa nahisgotan na, usa ka "flexible date" ang gigamit; ang script nakit-an ang mga tanyag nga sulod sa tulo ka adlaw sa gihatag nga mga petsa. Bisan kung sa pagpadagan sa script, mangita kini og mga tanyag sa usa lang ka direksyon, dali ra kini usbon aron makakolekta kini og datos sa daghang direksyon sa paglupad. Uban sa tabang niini, mahimo ka pa nga mangita alang sa sayup nga mga taripa; ang ingon nga mga pagpangita mahimong makapaikag kaayo.

Nganong kinahanglan nimo ang laing web scraper?

Sa una nakong pagsugod sa web scraping, sa tinuod ako dili kaayo interesado niini. Gusto kong mohimo ug dugang mga proyekto sa natad sa predictive modeling, financial analysis, ug, posible, sa natad sa pag-analisar sa emosyonal nga pagkolor sa mga teksto. Apan kini nahimo nga makapaikag kaayo nga mahibal-an kung giunsa paghimo ang usa ka programa nga nagkolekta sa datos gikan sa mga website. Sa akong pagsusi niini nga hilisgutan, akong naamgohan nga ang web scraping mao ang "engine" sa Internet.

Mahimong maghunahuna ka nga kini usa ka maisugon nga pahayag. Apan hunahunaa nga ang Google nagsugod sa usa ka web scraper nga gibuhat ni Larry Page gamit ang Java ug Python. Ang mga robot sa Google nagsuhid sa Internet, naningkamot nga mahatagan ang mga tiggamit niini sa labing kaayo nga mga tubag sa ilang mga pangutana. Ang pag-scrape sa web adunay walay katapusan nga paggamit, ug bisan kung interesado ka sa laing butang sa Data Science, kinahanglan nimo ang pipila ka mga kahanas sa pag-scrap aron makuha ang datos nga kinahanglan nimo nga analisahon.

Akong nakit-an ang pipila sa mga teknik nga gigamit dinhi sa usa ka talagsaon ang libro mahitungod sa web scraping, nga bag-o lang nako nakuha. Naglangkob kini og daghang yano nga mga pananglitan ug mga ideya alang sa praktikal nga paggamit sa imong nakat-unan. Dugang pa, adunay usa ka makapaikag kaayo nga kapitulo sa pag-bypass sa mga tseke sa reCaptcha. Kini miabut ingon nga balita alang kanako, tungod kay wala ako masayud nga adunay mga espesyal nga himan ug bisan ang tibuok nga mga serbisyo alang sa pagsulbad sa maong mga problema.

Ganahan ka mubyahe?!

Sa yano ug dili makadaot nga pangutana nga gipangutana sa ulohan sa kini nga seksyon, kanunay nimo madungog ang usa ka positibo nga tubag, inubanan sa usa ka magtiayon nga mga istorya gikan sa mga pagbiyahe sa tawo nga gipangutana. Kadaghanan kanamo mouyon nga ang pagbiyahe usa ka maayong paagi aron isubsob ang imong kaugalingon sa bag-ong mga kultural nga palibot ug mapalapad ang imong panan-aw. Bisan pa, kung mangutana ka sa usa ka tawo kung gusto ba nila ang pagpangita sa mga tiket sa eroplano, sigurado ako nga ang tubag dili kaayo positibo. Sa tinuud, ang Python mitabang kanamo dinhi.

Ang una nga buluhaton nga kinahanglan namon nga sulbaron sa dalan sa paghimo og usa ka sistema alang sa pagpangita sa kasayuran sa mga tiket sa hangin mao ang pagpili sa usa ka angay nga plataporma diin kami makakuha og kasayuran. Ang pagsulbad niini nga problema dili sayon ​​alang kanako, apan sa katapusan gipili nako ang serbisyo sa Kayak. Gisulayan nako ang mga serbisyo sa Momondo, Skyscanner, Expedia, ug uban pa, apan ang mga mekanismo sa pagpanalipod sa robot niini nga mga kapanguhaan dili masulud. Pagkahuman sa daghang mga pagsulay, diin kinahanglan nako nga atubangon ang mga suga sa trapiko, pagtabok sa mga pedestrian ug mga bisikleta, naningkamot nga kombinsihon ang mga sistema nga ako tawo, nakahukom ko nga ang Kayak labing angay alang kanako, bisan pa sa kamatuoran nga bisan kung daghan kaayo nga mga panid ang gikarga. sa mubo nga panahon, ug magsugod usab ang mga pagsusi. Nahimo nako ang pagpadala sa mga hangyo sa bot sa site sa mga agwat sa 4 hangtod 6 ka oras, ug maayo ang tanan. Matag karon ug unya, ang mga kalisud motungha kung nagtrabaho kauban ang Kayak, apan kung magsugod sila sa pagsamok kanimo sa mga tseke, nan kinahanglan nimo nga atubangon kini nga mano-mano ug dayon ilunsad ang bot, o maghulat pipila ka oras ug ang mga tseke kinahanglan nga mohunong. Kung gikinahanglan, dali nimong ipahiangay ang code alang sa lain nga plataporma, ug kung buhaton nimo kini, mahimo nimo kini ireport sa mga komento.

Kung nagsugod ka pa sa pag-scrape sa web ug wala ka mahibal-an kung ngano nga ang pipila ka mga website nakigbisog niini, unya sa dili ka pa magsugod sa imong una nga proyekto sa kini nga lugar, buhata ang imong kaugalingon nga pabor ug buhata ang pagpangita sa Google sa mga pulong nga "web scraping etiquette" . Mahimong matapos ang imong mga eksperimento nga mas sayo kaysa sa imong gihunahuna kung dili maayo ang imong pag-scrape sa web.

Pagsugod

Ania ang usa ka kinatibuk-ang pagtan-aw kung unsa ang mahitabo sa among web scraper code:

  • Import ang gikinahanglan nga mga librarya.
  • Pag-abli sa tab sa Google Chrome.
  • Tawga ang usa ka function nga magsugod sa bot, ipasa kini sa mga lungsod ug mga petsa nga gamiton sa pagpangita sa mga tiket.
  • Kini nga function nagkinahanglan sa unang mga resulta sa pagpangita, paghan-ay sa pinakamaayo, ug pag-klik sa usa ka buton aron makarga ang dugang nga mga resulta.
  • Ang laing function nagkolekta sa datos gikan sa tibuok panid ug nagbalik sa usa ka data frame.
  • Ang duha ka nangaging mga lakang gihimo gamit ang paghan-ay sa mga tipo sa presyo sa tiket (barato) ug sa gikusgon sa paglupad (pinakapaspas).
  • Ang tiggamit sa script gipadala usa ka email nga adunay usa ka summary sa mga presyo sa tiket (labing barato nga mga tiket ug kasagaran nga presyo), ug usa ka frame sa datos nga adunay kasayuran nga gisunud sa tulo nga gihisgutan sa ibabaw nga mga timailhan gitipig ingon usa ka file sa Excel.
  • Ang tanan nga mga aksyon sa ibabaw gihimo sa usa ka siklo pagkahuman sa usa ka piho nga yugto sa panahon.

Kinahanglan nga hinumdoman nga ang matag proyekto sa Selenium nagsugod sa usa ka driver sa web. akong gigamit Chromedriver, Nagtrabaho ko sa Google Chrome, apan adunay ubang mga kapilian. Ang PhantomJS ug Firefox popular usab. Human ma-download ang drayber, kinahanglan nimo nga ibutang kini sa angay nga folder, ug kini makompleto ang pag-andam alang sa paggamit niini. Ang unang mga linya sa among script nagbukas sa bag-ong tab sa Chrome.

Hinumdumi nga sa akong istorya wala ako naningkamot sa pag-abli sa bag-ong mga kapunawpunawan alang sa pagpangita og daghang mga deal sa mga tiket sa hangin. Adunay mas abante nga mga pamaagi sa pagpangita alang sa ingon nga mga tanyag. Gusto lang nako nga itanyag ang mga magbabasa niini nga materyal nga usa ka yano apan praktikal nga paagi aron masulbad kini nga problema.

Ania ang code nga among gihisgutan sa ibabaw.

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)

Sa sinugdanan sa code imong makita ang package import commands nga gigamit sa tibuok namong proyekto. Busa, randint gigamit sa paghimo sa bot nga "makatulog" sa usa ka random nga gidaghanon sa mga segundo sa wala pa magsugod ang usa ka bag-ong operasyon sa pagpangita. Kasagaran, walay usa ka bot nga makahimo kung wala kini. Kung gipadagan nimo ang code sa ibabaw, usa ka bintana sa Chrome ang maablihan, nga gamiton sa bot aron magtrabaho sa mga site.

Magbuhat kita ug gamay nga eksperimento ug ablihan ang kayak.com website sa lahi nga bintana. Atong pilion ang siyudad diin kita molupad, ug ang siyudad nga gusto natong adtoan, ingon man ang mga petsa sa paglupad. Sa pagpili sa mga petsa, siguruha nga ang sakup sa +-3 nga mga adlaw gigamit. Gisulat nako ang code nga gikonsiderar kung unsa ang gihimo sa site agig tubag sa ingon nga mga hangyo. Kung, pananglitan, kinahanglan nimo pangitaon ang mga tiket alang lamang sa mga piho nga petsa, nan adunay usa ka taas nga posibilidad nga kinahanglan nimo nga usbon ang bot code. Kung maghisgot ko bahin sa code, naghatag kog angay nga mga pagpasabut, apan kung gibati nimo nga naglibog, pahibaloa ako.

Karon i-klik ang search button ug tan-awa ang link sa address bar. Kini kinahanglan nga susama sa link nga akong gigamit sa panig-ingnan sa ubos diin ang variable gipahayag kayak, nga nagtipig sa URL, ug ang pamaagi gigamit get web driver. Human sa pag-klik sa search button, ang mga resulta kinahanglan nga makita sa panid.

Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe
Sa dihang akong gigamit ang sugo get sobra sa duha o tulo ka beses sulod sa pipila ka minuto, gihangyo ko nga kompletohon ang verification gamit ang reCaptcha. Mahimo nimong ipasa kini nga tseke nga mano-mano ug magpadayon sa pag-eksperimento hangtod nga ang sistema makahukom nga magpadagan og bag-ong tseke. Kung gisulayan nako ang script, ingon og ang una nga sesyon sa pagpangita kanunay nga hapsay, mao nga kung gusto nimo mag-eksperimento sa code, kinahanglan ra nimo nga manu-mano nga susihon matag karon ug unya ang code nga modagan, gamit ang taas nga agwat tali sa mga sesyon sa pagpangita. Ug, kung imong hunahunaon kini, ang usa ka tawo dili tingali magkinahanglan og kasayuran bahin sa mga presyo sa tiket nga nadawat sa 10-minutos nga mga agwat tali sa mga operasyon sa pagpangita.

Pagtrabaho sa usa ka panid gamit ang XPath

Busa, giablihan namo ang usa ka bintana ug gikarga ang site. Aron makakuha og presyo ug uban pang impormasyon, kinahanglan namong gamiton ang XPath nga teknolohiya o CSS selectors. Nakahukom ko nga magpabilin sa XPath ug wala mobati sa panginahanglan sa paggamit sa CSS selectors, apan kini mao ang posible nga sa pagtrabaho sa ingon nga paagi. Ang pag-navigate sa palibot sa usa ka panid gamit ang XPath mahimong malisud, ug bisan kung gigamit nimo ang mga teknik nga akong gihulagway kini artikulo, nga naglakip sa pagkopya sa katugbang nga mga identifier gikan sa page code, akong naamgohan nga kini, sa pagkatinuod, dili ang kamalaumon nga paagi sa pag-access sa gikinahanglan nga mga elemento. Pinaagi sa dalan, sa kini Ang libro naghatag usa ka maayo kaayo nga paghulagway sa mga sukaranan sa pagtrabaho sa mga panid gamit ang XPath ug CSS mga tigpili. Kini ang hitsura sa katugbang nga pamaagi sa pagmaneho sa web.

Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe
Busa, magpadayon kita sa pagtrabaho sa bot. Atong gamiton ang mga kapabilidad sa programa sa pagpili sa labing barato nga mga tiket. Sa mosunod nga hulagway, ang XPath selector code gi-highlight sa pula. Aron makita ang code, kinahanglan nimo nga i-right-click ang elemento sa panid nga interesado ka ug pilia ang Inspect command gikan sa menu nga makita. Kini nga sugo mahimong tawgon alang sa lain-laing mga elemento sa panid, ang code niini ipakita ug i-highlight sa code viewer.

Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe
Tan-awa ang code sa panid

Aron makit-an ang kumpirmasyon sa akong pangatarungan bahin sa mga disbentaha sa pagkopya sa mga tigpili gikan sa code, hatagi'g pagtagad ang mosunod nga mga bahin.

Kini ang imong makuha kung imong kopyahon ang code:

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

Aron makopya ang usa ka butang nga sama niini, kinahanglan nimo nga i-right-click ang seksyon sa code nga imong gusto ug pilia ang Copy> Copy XPath command gikan sa menu nga makita.

Ania ang akong gigamit sa paghubit sa labing barato nga buton:

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

Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe
Kopyaha ang Command > Kopyaha ang XPath

Klaro kaayo nga ang ikaduha nga kapilian tan-awon nga labi ka yano. Kung gigamit, kini nangita alang sa usa ka elemento a nga adunay hiyas data-codekatumbas sa price. Kung gigamit ang una nga kapilian, gipangita ang elemento id nga katumbas sa wtKI-price_aTab, ug ang XPath nga agianan sa elemento morag /div[1]/div/div/div[1]/div/span/span. Ang usa ka pangutana sa XPath nga sama niini sa usa ka panid makahimo sa lansis, apan kausa ra. Makaingon ko karon nga id mausab sa sunod higayon nga makarga ang panid. Pagkasunodsunod sa karakter wtKI dinamikong pagbag-o sa matag higayon nga ma-load ang panid, mao nga ang code nga naggamit niini mahimong walay kapuslanan pagkahuman sa sunod nga pag-reload sa panid. Busa paggahin ug panahon aron masabtan ang XPath. Kini nga kahibalo makaalagad kanimo og maayo.

Bisan pa, kinahanglan nga hinumdoman nga ang pagkopya sa mga tigpili sa XPath mahimong mapuslanon kung nagtrabaho sa medyo yano nga mga site, ug kung komportable ka niini, wala’y sayup niini.

Karon atong hunahunaon kung unsa ang buhaton kung kinahanglan nimo nga makuha ang tanan nga mga resulta sa pagpangita sa daghang mga linya, sa sulod sa usa ka lista. Simple kaayo. Ang matag resulta naa sa sulod sa usa ka butang nga adunay klase resultWrapper. Ang pagkarga sa tanan nga mga resulta mahimo sa usa ka loop nga susama sa gipakita sa ubos.

Kinahanglan nga hinumdoman nga kung nahibal-an nimo ang naa sa taas, kinahanglan nimo nga dali nga masabtan ang kadaghanan sa code nga among analisahon. Sa pagdagan niini nga code, atong ma-access ang atong gikinahanglan (sa pagkatinuod, ang elemento diin ang resulta giputos) gamit ang usa ka matang sa path-specifying mechanism (XPath). Gihimo kini aron makuha ang teksto sa elemento ug ibutang kini sa usa ka butang diin mabasa ang datos (una nga gigamit flight_containers, unya- flights_list).

Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe
Gipakita ang unang tulo ka linya ug klaro natong makita ang tanan nga atong gikinahanglan. Bisan pa, kami adunay mas makapaikag nga mga paagi sa pagkuha sa kasayuran. Kinahanglan namon nga kuhaon ang datos gikan sa matag elemento nga gilain.

Pagtrabaho!

Ang pinakasayon ​​nga paagi sa pagsulat sa usa ka function mao ang pagkarga og dugang nga mga resulta, mao nga didto kita magsugod. Gusto nakong i-maximize ang gidaghanon sa mga flight nga ang programa makadawat og impormasyon mahitungod sa, nga walay pagpataas sa mga pagduda sa serbisyo nga mosangpot sa usa ka inspeksyon, mao nga akong i-klik ang Load more results button sa makausa sa matag higayon nga ang panid gipakita. Sa kini nga code, kinahanglan nimo nga hatagan pagtagad ang block try, nga akong gidugang tungod kay usahay ang buton dili ma-load sa husto. Kung makasugat ka usab niini, ikomento ang mga tawag niini nga function sa function code start_kayak, nga atong tan-awon sa ubos.

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

Karon, pagkahuman sa taas nga pag-analisar niini nga function (usahay madala ko), andam na kami nga ipahayag ang usa ka function nga mag-scrape sa panid.

Nakolekta na nako ang kadaghanan sa gikinahanglan sa mosunod nga function nga gitawag page_scrape. Usahay ang gibalik nga datos sa agianan gihiusa, mao nga naggamit ako usa ka yano nga pamaagi aron mabulag kini. Pananglitan, kung mogamit ako mga variable sa unang higayon section_a_list и section_b_list. Ang among function nagbalik ug data frame flights_df, kini nagtugot kanato sa pagbulag sa mga resulta nga nakuha gikan sa lain-laing mga pamaagi sa paghan-ay sa datos ug sa ulahi isagol kini.

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

Gisulayan nako nga hinganlan ang mga variable aron masabtan ang code. Hinumdomi nga ang mga variable nagsugod sa a nahisakop sa unang yugto sa dalan, ug b - ngadto sa ikaduha. Mopadayon kita sa sunod nga function.

Mga mekanismo sa pagsuporta

Naa na miy function nga nagtugot kanamo sa pagkarga ug dugang nga mga resulta sa pagpangita ug usa ka function sa pagproseso sa mga resulta. Kini nga artikulo mahimo nga natapos dinhi, tungod kay kining duha ka mga gimbuhaton naghatag sa tanan nga imong gikinahanglan sa pag-scrape sa mga panid nga mahimo nimong ablihan sa imong kaugalingon. Apan wala pa nato makonsiderar ang pipila sa mga mekanismo sa auxiliary nga gihisgutan sa ibabaw. Pananglitan, kini ang code sa pagpadala sa mga email ug uban pang mga butang. Kining tanan makita sa function start_kayak, nga atong hisgotan karon.

Aron molihok kini nga function, kinahanglan nimo ang kasayuran bahin sa mga lungsod ug petsa. Gamit ang kini nga kasayuran, kini nagporma usa ka link sa usa ka variable kayak, nga gigamit aron dad-on ka sa usa ka panid nga adunay sulud nga mga resulta sa pagpangita nga gisunud sumala sa ilang labing kaayo nga pagpares sa pangutana. Pagkahuman sa unang sesyon sa pag-scrape, magtrabaho kami sa mga presyo sa lamesa sa ibabaw sa panid. Sa ato pa, makit-an namon ang minimum nga presyo sa tiket ug ang kasagaran nga presyo. Kining tanan, uban sa panagna nga gi-isyu sa site, ipadala pinaagi sa email. Sa panid, ang katugbang nga lamesa kinahanglan naa sa taas nga wala nga suok. Ang pagtrabaho uban niini nga lamesa, sa paagi, mahimong hinungdan sa usa ka sayup sa pagpangita gamit ang eksaktong mga petsa, tungod kay sa kini nga kaso ang lamesa wala gipakita sa panid.

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

Gisulayan nako kini nga script gamit ang Outlook account (hotmail.com). Wala pa nako kini gisulayan aron magtrabaho sa husto sa usa ka Gmail account, kini nga sistema sa email popular kaayo, apan adunay daghang posible nga mga kapilian. Kung mogamit ka usa ka Hotmail account, unya aron molihok ang tanan, kinahanglan nimo nga isulod ang imong data sa code.

Kung gusto nimong masabtan kung unsa gyud ang gibuhat sa piho nga mga seksyon sa code para sa kini nga function, mahimo nimo silang kopyahon ug eksperimento. Ang pag-eksperimento sa code mao ang bugtong paagi aron masabtan kini.

Andam nga sistema

Karon nga nahimo na namo ang tanan nga among gihisgutan, makahimo kami og usa ka yano nga loop nga nagtawag sa among mga gimbuhaton. Ang script nangayo og datos gikan sa tiggamit mahitungod sa mga siyudad ug mga petsa. Kung ang pagsulay nga adunay kanunay nga pagsugod pag-usab sa script, dili nimo gusto nga isulod kini nga datos nga mano-mano sa matag higayon, mao nga ang katugbang nga mga linya, alang sa panahon sa pagsulay, mahimong makomentaryo pinaagi sa pag-uncomment sa mga ubos niini, diin ang datos nga gikinahanglan sa hardcoded ang script.

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

Mao kini ang hitsura sa usa ka pagsulay nga pagdagan sa script.
Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe
Test run sa script

Mga resulta

Kung nakab-ot ka na niini, pahalipay! Ikaw karon adunay usa ka nagtrabaho web scraper, bisan tuod ako makakita na sa daghang mga paagi sa pagpalambo niini. Pananglitan, mahimo kining i-integrate sa Twilio aron magpadala kini og mga text message imbes nga mga email. Mahimo nimong gamiton ang VPN o uban pa aron dungan nga makadawat mga resulta gikan sa daghang mga server. Adunay usab usa ka matag karon nga mitungha nga problema sa pagsusi sa tiggamit sa site aron makita kung siya usa ka tawo, apan kini nga problema mahimo usab nga masulbad. Sa bisan unsa nga kaso, karon ikaw adunay usa ka base nga mahimo nimong mapalapad kung gusto nimo. Pananglitan, siguroha nga ang usa ka Excel file gipadala ngadto sa user isip attachment sa usa ka email.

Python - usa ka katabang sa pagpangita sa mga barato nga tiket sa hangin alang sa mga mahilig magbiyahe

Ang mga rehistradong tiggamit lamang ang makaapil sa survey. Sign in, walay sapayan.

Gigamit ba nimo ang mga teknolohiya sa web scraping?

  • Oo

  • Dili

8 user ang nagboto. 1 user ang ni- abstain.

Source: www.habr.com

Idugang sa usa ka comment