Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal

Deir údar an ailt, a bhfuil an t-aistriúchán á fhoilsiú againn inniu, gurb é an sprioc atá aige ná labhairt faoi fhorbairt scraper gréasáin i Python ag baint úsáide as Seiléiniam, a dhéanann cuardach ar phraghsanna ticéad aerlíne. Nuair a bhíonn ticéid á gcuardach, úsáidtear dátaí solúbtha (+ - 3 lá i gcoibhneas leis na dátaí sonraithe). Sábhálann an scraper na torthaí cuardaigh i gcomhad Excel agus cuireann sé ríomhphost chuig an duine a rith an cuardach le hachoimre ar an méid a fuair siad. Is é sprioc an tionscadail seo ná cabhrú le taistealaithe teacht ar na margaí is fearr.

Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal

Más rud é, agus an t-ábhar á thuiscint agat, go mbraitheann tú caillte, féach ar seo alt.

Cad atá á lorg againn?

Tá cead agat an córas a thuairiscítear anseo a úsáid mar is mian leat. Mar shampla, d’úsáid mé é chun cuardach a dhéanamh ar thurais deireadh seachtaine agus ticéid chuig mo bhaile dúchais. Má tá tú dáiríre faoi thicéid bhrabúsacha a aimsiú, is féidir leat an script a rith ar an bhfreastalaí (simplí freastalaí, ar feadh 130 rúbal in aghaidh na míosa, oiriúnach go leor le haghaidh seo) agus déan cinnte go ritheann sé uair nó dhó sa lá. Seolfar torthaí cuardaigh chugat trí ríomhphost. Ina theannta sin, molaim gach rud a chur ar bun ionas go sábhálann an script comhad Excel le torthaí cuardaigh i bhfillteán Dropbox, rud a ligfidh duit comhaid den sórt sin a fheiceáil ó áit ar bith agus ag am ar bith.

Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal
Níl taraifí le hearráidí aimsithe agam go fóill, ach is dóigh liom go bhfuil sé indéanta

Nuair a dhéantar cuardach, mar a luadh cheana, úsáidtear “dáta solúbtha”; aimsíonn an script tairiscintí atá laistigh de thrí lá ó na dátaí tugtha. Cé go ndéanann sé cuardach ar thairiscintí i dtreo amháin agus an script á rith, is furasta é a mhodhnú ionas gur féidir leis sonraí a bhailiú ar threoracha éagsúla eitilte. Le cabhair uaidh, is féidir leat taraifí earráideacha a lorg fiú;

Cén fáth a bhfuil scraper gréasáin eile ag teastáil uait?

Nuair a thosaigh mé ag scríobadh gréasáin den chéad uair, ní raibh suim ar leith agam ann. Bhí mé ag iarraidh níos mó tionscadal a dhéanamh i réimse na samhaltú thuarthach, anailís airgeadais, agus, b'fhéidir, i réimse anailíse dathú mothúchánach téacsanna. Ach d'éirigh sé amach go raibh sé an-suimiúil a dhéanamh amach conas a chruthú clár a bhailíonn sonraí ó láithreáin ghréasáin. Agus mé ag plé leis an ábhar seo, thuig mé gurb é scríobadh gréasáin “inneall” an Idirlín.

B’fhéidir go gceapfá gur ráiteas ró-dána é seo. Ach smaoinigh gur thosaigh Google le scraper gréasáin a chruthaigh Larry Page ag baint úsáide as Java agus Python. Tá robots Google ag iniúchadh an Idirlín, ag iarraidh na freagraí is fearr ar a gcuid ceisteanna a sholáthar dá úsáideoirí. Tá úsáidí gan teorainn ag scrapáil gréasáin, agus fiú má tá suim agat i rud éigin eile in Eolaíocht Sonraí, beidh roinnt scileanna scrapála ag teastáil uait chun na sonraí a theastaíonn uait a anailísiú.

Fuair ​​​​mé cuid de na teicnící a úsáidtear anseo i iontach an leabhar faoi ​​scríobadh gréasáin, a fuair mé le déanaí. Tá go leor samplaí agus smaointe simplí ann chun an méid atá foghlamtha agat a chur i bhfeidhm go praiticiúil. Ina theannta sin, tá caibidil an-suimiúil ann maidir le seiceálacha reCaptcha a sheachaint. Tháinig sé seo mar nuacht dom, toisc nach raibh a fhios agam fiú go raibh uirlisí speisialta agus fiú seirbhísí iomlána ann chun fadhbanna den sórt sin a réiteach.

An maith leat taisteal?!

Ar an gceist shimplí neamhdhíobhálach a chuirtear i dteideal an ailt seo, is minic a chloisfeá freagra dearfach, in éineacht le cúpla scéal ó thaistil an duine dár cuireadh é. Aontaíonn an chuid is mó againn gur bealach iontach é taisteal chun tú féin a thumadh i dtimpeallachtaí cultúrtha nua agus do dhearcadh a leathnú. Mar sin féin, má chuireann tú ceist ar dhuine an maith leo ticéid aerlíne a chuardach, táim cinnte nach mbeidh an freagra chomh dearfach sin. Mar ábhar na fírinne, tagann Python chun ár gcabhair anseo.

Is é an chéad tasc nach mór dúinn a réiteach maidir le córas a chruthú chun faisnéis a chuardach ar thicéid aeir ná ardán oiriúnach a roghnú as a dtógfaimid faisnéis. Ní raibh sé éasca an fhadhb seo a réiteach dom, ach sa deireadh roghnaigh mé an tseirbhís Cadhc. Bhain mé triail as seirbhísí Momondo, Skyscanner, Expedia, agus roinnt eile, ach bhí na meicníochtaí cosanta robot ar na hacmhainní seo do-sheachanta. Tar éis roinnt iarrachtaí, lena linn a bhí orm déileáil le soilse tráchta, trasrianta coisithe agus rothair, ag iarraidh a chur ina luí ar na córais go raibh mé daonna, chinn mé go raibh Cadhc is fearr a oireann dom, in ainneoin go fiú má tá an iomarca leathanach luchtaithe. i mbeagán ama, agus cuirtear tús le seiceálacha freisin. D'éirigh liom an bot a dhéanamh iarratais a sheoladh chuig an suíomh ag eatraimh 4 go 6 uair an chloig, agus d'oibrigh gach rud go breá. Ó am go chéile, tagann deacrachtaí chun cinn agus tú ag obair le Cadhc, ach má thosaíonn siad ag cur isteach ort le seiceálacha, ansin ní mór duit déileáil leo de láimh agus ansin an bot a sheoladh, nó fanacht cúpla uair an chloig agus ba chóir go stopfadh na seiceálacha. Más gá, is féidir leat an cód a oiriúnú go héasca le haghaidh ardán eile, agus má dhéanann tú amhlaidh, is féidir leat é a thuairisciú sna tuairimí.

Más rud é go bhfuil tú díreach ag tosú le scríobadh gréasáin agus nach bhfuil a fhios agat cén fáth a mbíonn roinnt suíomhanna gréasáin ag streachailt leis, ansin sula dtosaíonn tú ar do chéad tionscadal sa réimse seo, déan fabhar duit féin agus déan cuardach Google ar na focail "béasaíocht scrapála gréasáin" . B'fhéidir go dtiocfaidh deireadh le do thurgnaimh níos luaithe ná mar a cheapann tú má dhéanann tú scríobadh gréasáin go mícheart.

Ag Tosú

Seo forbhreathnú ginearálta ar cad a tharlóidh inár gcód scraper gréasáin:

  • Iompórtáil na leabharlanna riachtanacha.
  • Cluaisín Google Chrome a oscailt.
  • Cuir glaoch ar fheidhm a thosaíonn an bot, ag dul thar na cathracha agus na dátaí a úsáidfear agus tú ag cuardach ticéid.
  • Tógann an fheidhm seo na chéad torthaí cuardaigh, curtha in eagar de réir is fearr, agus cliceáil ar chnaipe chun níos mó torthaí a luchtú.
  • Bailíonn feidhm eile sonraí ón leathanach iomlán agus cuireann sé fráma sonraí ar ais.
  • Déantar an dá chéim roimhe seo trí úsáid a bhaint as cineálacha sórtála de réir phraghas an ticéid (saor) agus de réir luas eitilte (is tapúla).
  • Seoltar ríomhphost chuig úsáideoir na scripte ina bhfuil achoimre ar phraghsanna na dticéad (na ticéid is saoire agus an meánphraghas), agus sábhálfar fráma sonraí le faisnéis arna sórtáil de réir na dtrí tháscaire thuasluaite mar chomhad Excel.
  • Déantar na gníomhartha thuas go léir i dtimthriall tar éis tréimhse sonraithe ama.

Ba chóir a thabhairt faoi deara go dtosaíonn gach tionscadal Seiléiniam le tiománaí gréasáin. Úsáidim Chrome tiománaí, Oibrím le Google Chrome, ach tá roghanna eile ann. Tá tóir ar PhantomJS agus Firefox freisin. Tar éis duit an tiománaí a íoslódáil, ní mór duit é a chur san fhillteán cuí, agus críochnaíonn sé seo an t-ullmhúchán lena úsáid. Osclaíonn na chéad línte dár script cluaisín Chrome nua.

Coinnigh i gcuimhne nach bhfuil mé ag iarraidh i mo scéal spéiseanna nua a oscailt chun margaí iontacha a fháil ar thicéid aeir. Tá modhanna i bhfad níos forbartha ann chun tairiscintí den sórt sin a chuardach. Níl uaim ach bealach simplí ach praiticiúil a thairiscint do léitheoirí an ábhair seo chun an fhadhb seo a réiteach.

Seo é an cód ar labhair muid thuas.

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)

Ag tús an chóid is féidir leat na horduithe allmhairithe pacáiste a úsáidtear ar fud ár dtionscadal a fheiceáil. Mar sin, randint a úsáidtear chun an bot a “titim ina chodladh” ar feadh roinnt soicindí randamacha sula dtosaíonn tú ar oibríocht chuardaigh nua. De ghnáth, ní féidir le bot amháin a dhéanamh gan é seo. Má ritheann tú an cód thuas, osclófar fuinneog Chrome, a úsáidfidh an bot chun oibriú le suíomhanna.

Déanaimis turgnamh beag agus osclaíonn muid láithreán gréasáin kayak.com i bhfuinneog ar leith. Roghnóimid an chathair as a mbeidh muid ag eitilt, agus an chathair ar mhaith linn a fháil, chomh maith leis na dátaí eitilte. Agus dátaí á roghnú agat, déan cinnte go n-úsáidtear an raon + -3 lá. Scríobh mé an cód ag cur san áireamh a tháirgeann an láithreán mar fhreagra ar iarratais den sórt sin. Más rud é, mar shampla, nach mór duit ticéid a chuardach ach amháin le haghaidh dátaí sonraithe, ansin tá dóchúlacht ard ann go mbeidh ort an cód bot a mhodhnú. Nuair a labhair mé faoin gcód, cuirim mínithe cuí ar fáil, ach má bhraitheann tú mearbhall, cuir in iúl dom.

Anois cliceáil ar an gcnaipe cuardaigh agus féach ar an nasc sa bharra seoltaí. Ba cheart go mbeadh sé cosúil leis an nasc a úsáidim sa sampla thíos ina ndearbhaítear an athróg kayak, a stórálann an URL, agus úsáidtear an modh get Tiománaí gréasáin. Tar éis duit an cnaipe cuardaigh a chliceáil, ba cheart go mbeadh torthaí le feiceáil ar an leathanach.

Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal
Nuair a d'úsáid mé an t-ordú get níos mó ná dhá nó trí huaire laistigh de chúpla nóiméad, iarradh orm fíorú a chur i gcrích ag baint úsáide as reCaptcha. Is féidir leat an tseiceáil seo a chur ar aghaidh de láimh agus leanúint den triail go dtí go gcinnfidh an córas seiceáil nua a rith. Nuair a thástáil mé an script, ba chosúil go ndeachaigh an chéad seisiún cuardaigh go réidh i gcónaí, mar sin dá mba mhian leat triail a bhaint as an gcód, ní bheadh ​​ort ach seiceáil go tréimhsiúil de láimh agus ligean don chód a reáchtáil, ag baint úsáide as eatraimh fhada idir seisiúin chuardaigh. Agus, má smaoiníonn tú air, ní dócha go mbeidh faisnéis ag teastáil ó dhuine faoi phraghsanna ticéad a fhaightear ag eatraimh 10 nóiméad idir oibríochtaí cuardaigh.

Ag obair le leathanach ag baint úsáide as XPath

Mar sin, d'oscail muid fuinneog agus luchtú an suíomh. Chun praghsáil agus faisnéis eile a fháil, ní mór dúinn teicneolaíocht XPath nó roghnóirí CSS a úsáid. Chinn mé cloí le XPath agus níor mhothaigh mé go raibh gá le roghnóirí CSS a úsáid, ach is féidir oibriú mar sin. Is féidir a bheith deacair dul timpeall ar leathanach ag baint úsáide as XPath, agus fiú má úsáideann tú na teicnící ar chuir mé síos orthu seo alt, a raibh i gceist leis na haitheantóirí comhfhreagracha a chóipeáil ón gcód leathanach, thuig mé gurb é seo, i ndáiríre, an bealach is fearr chun rochtain a fháil ar na heilimintí riachtanacha. Dála an scéil, i seo Tugann an leabhar cur síos iontach ar na bunghnéithe a bhaineann le bheith ag obair le leathanaigh a úsáideann roghnóirí XPath agus CSS. Is é seo an chuma atá ar an modh tiománaí gréasáin comhfhreagrach.

Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal
Mar sin, leanfaimid orainn ag obair ar an bot. Bainimis úsáid as cumais an chláir chun na ticéid is saoire a roghnú. San íomhá seo a leanas, tá an cód roghnóir XPath aibhsithe i dearg. Chun an cód a fheiceáil, ní mór duit cliceáil ar dheis ar an eilimint leathanach a bhfuil suim agat ann agus roghnaigh an t-ordú Inspect ón roghchlár atá le feiceáil. Is féidir an t-ordú seo a ghlaoch le haghaidh eilimintí leathanaigh éagsúla, a dtaispeánfar an cód agus a aibhseofar san amharcóir cód.

Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal
Féach ar an gcód leathanach

D'fhonn deimhniú a fháil ar mo réasúnaíocht faoi na míbhuntáistí a bhaineann le roghnóirí a chóipeáil ó chód, tabhair aird ar na gnéithe seo a leanas.

Seo a gheobhaidh tú nuair a chóipeáil tú an cód:

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

Chun rud éigin mar seo a chóipeáil, ní mór duit cliceáil ar dheis ar an gcuid den chód a bhfuil suim agat ann agus roghnaigh an Cóip> Cóipeáil XPath ordú ón roghchlár atá le feiceáil.

Seo an rud a d’úsáid mé chun an cnaipe is saoire a shainiú:

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

Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal
Cóipeáil Ordú > Cóipeáil XPath

Tá sé soiléir go leor go bhfuil cuma i bhfad níos simplí ar an dara rogha. Nuair a úsáidtear é, déanann sé cuardach ar eilimint a a bhfuil an tréith aige data-code, comhionann price. Nuair a bhíonn an chéad rogha á úsáid, déantar an eilimint a chuardach id atá comhionann le wtKI-price_aTab, agus is cosúil le cosán XPath go dtí an eilimint /div[1]/div/div/div[1]/div/span/span. Déanfaidh ceist XPath mar seo ar leathanach an cleas, ach uair amháin. Is féidir liom a rá go díreach anois id athrófar an chéad uair eile a luchtófar an leathanach. Seicheamh carachtair wtKI athraíonn sé go dinimiciúil gach uair a luchtaítear an leathanach, agus mar sin beidh an cód a úsáideann é gan úsáid tar éis an chéad leathanach eile a athlódáil. Mar sin tóg roinnt ama chun XPath a thuiscint. Freastalóidh an t-eolas seo go maith ort.

Mar sin féin, ba chóir a thabhairt faoi deara go bhféadfadh cóipeáil roghnóirí XPath a bheith úsáideach nuair a bhíonn tú ag obair le suíomhanna simplí go leor, agus má tá tú compordach leis seo, níl aon rud cearr leis.

Anois, déanaimis smaoineamh ar cad atá le déanamh más gá duit na torthaí cuardaigh go léir a fháil i roinnt línte, taobh istigh de liosta. An-simplí. Tá gach toradh taobh istigh de réad le rang resultWrapper. Is féidir na torthaí go léir a luchtú i lúb cosúil leis an gceann a thaispeántar thíos.

Ba chóir a thabhairt faoi deara má thuigeann tú an méid thuas, ansin ba cheart duit an chuid is mó den chód a ndéanfaimid anailís a dhéanamh air a thuiscint go héasca. De réir mar a ritheann an cód seo, déanaimid rochtain ar an méid a theastaíonn uainn (go deimhin, an eilimint ina bhfuil an toradh fillte) ag baint úsáide as meicníocht cosán-sonraithe (XPath). Déantar é seo chun téacs na heiliminte a fháil agus é a chur i réad ónar féidir sonraí a léamh (úsáid ar dtús flight_containers, ansin - flights_list).

Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal
Taispeántar na chéad trí líne agus is féidir linn gach rud a theastaíonn uainn a fheiceáil go soiléir. Mar sin féin, tá bealaí níos suimiúla againn chun faisnéis a fháil. Ní mór dúinn sonraí ó gach eilimint a thógáil ar leithligh.

Faigh a bheith ag obair!

Is é an bealach is éasca chun feidhm a scríobh ná torthaí breise a luchtú, mar sin is é sin an áit a dtosóimid. Ba mhaith liom líon na n-eitiltí a fhaigheann an clár faisnéis faoi a uasmhéadú, gan amhras a ardú sa tseirbhís as a dtagann iniúchadh, mar sin cliceáil mé ar an gcnaipe Luchtaigh níos mó torthaí uair amháin gach uair a thaispeánfar an leathanach. Sa chód seo, ba cheart duit aird a thabhairt ar an mbloc try, rud a chuir mé leis mar uaireanta ní lódálann an cnaipe i gceart. Má thagann tú ar seo freisin, déan trácht ar ghlaonna chuig an bhfeidhm seo i gcód na feidhme start_kayak, a bhreathnóimid thíos.

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

Anois, tar éis anailís fhada ar an bhfeidhm seo (uaireanta is féidir liom a fháil ar shiúl), tá muid réidh chun feidhm a dhearbhú a scriosfaidh an leathanach.

Tá an chuid is mó de na rudaí atá ag teastáil san fheidhm seo a leanas bailithe agam cheana féin ar a dtugtar page_scrape. Uaireanta cuirtear na sonraí cosáin ar ais le chéile, mar sin úsáidim modh simplí chun iad a scaradh. Mar shampla, nuair a úsáidim athróga den chéad uair section_a_list и section_b_list. Tugann ár bhfeidhm fráma sonraí ar ais flights_df, ligeann sé seo dúinn na torthaí a fhaightear ó mhodhanna éagsúla sórtála sonraí a scaradh agus iad a chomhcheangal níos déanaí.

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

Rinne mé iarracht na hathróga a ainmniú ionas go mbeadh an cód intuigthe. Cuimhnigh go bhfuil athróga ag tosú le a bhaineann leis an gcéad chéim den chosán, agus b - go dtí an dara. A ligean ar bogadh ar aghaidh go dtí an fheidhm eile.

Meicníochtaí tacaíochta

Tá feidhm againn anois a ligeann dúinn torthaí cuardaigh breise a luchtú agus feidhm chun na torthaí sin a phróiseáil. D'fhéadfadh an t-alt seo a bheith críochnaithe anseo, ós rud é go soláthraíonn an dá fheidhm seo gach rud a theastaíonn uait chun leathanaigh a scrapeadh is féidir leat féin a oscailt. Ach níl cuid de na meicníochtaí cúnta a pléadh thuas curtha san áireamh againn go fóill. Mar shampla, is é seo an cód chun ríomhphoist a sheoladh agus roinnt rudaí eile. Is féidir seo go léir a fháil sa fheidhm start_kayak, a mheasfaimid anois.

Le go n-oibreoidh an fheidhm seo, teastaíonn faisnéis uait faoi chathracha agus faoi dhátaí. Ag baint úsáide as an bhfaisnéis seo, cruthaíonn sé nasc in athróg kayak, a úsáidtear chun tú a thabhairt chuig leathanach ina mbeidh torthaí cuardaigh curtha in eagar de réir an mheaitseála is fearr don cheist. Tar éis an chéad seisiún scrapála, oibreoimid leis na praghsanna sa tábla ag barr an leathanaigh. Eadhon, gheobhaidh muid íosphraghas an ticéid agus an meánphraghas. Seolfar é seo go léir, mar aon leis an tuar a d'eisigh an láithreán, trí ríomhphost. Ar an leathanach, ba chóir go mbeadh an tábla comhfhreagrach sa chúinne uachtarach ar chlé. Ag obair leis an tábla seo, dála an scéil, d'fhéadfadh earráid a chur faoi deara nuair a chuardach ag baint úsáide as dátaí cruinne, mar sa chás seo nach bhfuil an tábla ar taispeáint ar an leathanach.

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

Thástáil mé an script seo ag baint úsáide as cuntas Outlook (hotmail.com). Ní dhearna mé tástáil air chun oibriú i gceart le cuntas Gmail, tá an-tóir ar an gcóras ríomhphoist seo, ach tá go leor roghanna féideartha ann. Má úsáideann tú cuntas Hotmail, ansin ionas go n-oibreoidh gach rud, ní gá duit ach do shonraí a chur isteach sa chód.

Más mian leat a thuiscint cad go díreach atá á dhéanamh i gcodanna sonracha den chód don fheidhm seo, is féidir leat iad a chóipeáil agus triail a bhaint astu. Is é triail a bhaint as an gcód an t-aon bhealach chun é a thuiscint go fírinneach.

Córas réidh

Anois go bhfuil gach rud a labhair muid déanta againn, is féidir linn lúb simplí a chruthú a ghlaonn ár bhfeidhmeanna. Iarrann an script sonraí ón úsáideoir faoi chathracha agus dátaí. Agus an script á atosú go leanúnach, ní dócha go mbeidh tú ag iarraidh na sonraí seo a iontráil de láimh gach uair, agus mar sin is féidir na línte comhfhreagracha, ar feadh ré na tástála, a lua ach iad siúd thíos a lua, ina bhfuil na sonraí a theastaíonn ón tá an script códaithe.

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

Seo an chuma atá ar rith tástála den script.
Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal
Rith tástála na scripte

Torthaí

Má tá sé déanta agat go dtí seo, comhghairdeas! Tá scraper gréasáin oibre agat anois, cé gur féidir liom go leor bealaí a fheiceáil cheana féin chun é a fheabhsú. Mar shampla, is féidir é a chomhtháthú le Twilio ionas go seolann sé teachtaireachtaí téacs in ionad ríomhphoist. Is féidir leat VPN nó rud éigin eile a úsáid chun torthaí a fháil ag an am céanna ó go leor freastalaithe. Tá fadhb ann go tréimhsiúil freisin maidir le húsáideoir an tsuímh a sheiceáil féachaint an bhfuil sé ina dhuine, ach is féidir an fhadhb seo a réiteach freisin. In aon chás, anois tá bonn agat ar féidir leat a leathnú más mian leat. Mar shampla, déan cinnte go seolfar comhad Excel chuig an úsáideoir mar cheangaltán le ríomhphost.

Python - cúntóir chun ticéid aeir saor a aimsiú dóibh siúd a bhfuil grá acu taisteal

Ní féidir ach le húsáideoirí cláraithe páirt a ghlacadh sa suirbhé. Sínigh isteach, le do thoil.

An úsáideann tú teicneolaíochtaí scrapála gréasáin?

  • Нет

Vótáil 8 úsáideoir. Staon úsáideoir amháin.

Foinse: will.com

Add a comment