Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal

Tha ùghdar an artaigil, an eadar-theangachadh air a bheil sinn a 'foillseachadh an-diugh, ag ràdh gur e an t-amas aige bruidhinn mu leasachadh sgrìob lìn ann am Python a' cleachdadh Selenium, a bhios a 'lorg prìsean tiocaidean adhair. Nuair a thathar a’ lorg thiogaidean, thathas a’ cleachdadh cinn-latha sùbailte (+ - 3 latha an coimeas ris na cinn-latha ainmichte). Bidh an scraper a’ sàbhaladh na toraidhean rannsachaidh ann am faidhle Excel agus a’ cur post-d chun neach a ruith e le geàrr-chunntas air na lorg iad. Is e amas a’ phròiseict seo luchd-siubhail a chuideachadh gus na cùmhnantan as fheàrr a lorg.

Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal

Ma tha thu, fhad ‘s a tha thu a’ tuigsinn an stuth, a ’faireachdainn caillte, thoir sùil air seo artaigil.

Dè tha sinn a’ dol a lorg?

Faodaidh tu an siostam a tha air a mhìneachadh an seo a chleachdadh mar a thogras tu. Mar eisimpleir, chleachd mi e airson cuairtean deireadh-seachdain agus tiogaidean gu mo bhaile-mòr a lorg. Ma tha thu dha-rìribh a’ lorg thiogaidean prothaideach, faodaidh tu an sgriobt a ruith air an fhrithealaiche (sìmplidh frithealaiche, airson 130 rubles mìos, gu math freagarrach airson seo) agus dèan cinnteach gu bheil e a 'ruith uair no dhà san latha. Thèid toraidhean rannsachaidh a chuir thugad air post-d. A bharrachd air an sin, tha mi a 'moladh a h-uile càil a shuidheachadh gus am bi an sgriobt a' sàbhaladh faidhle Excel le toraidhean rannsachaidh ann am pasgan Dropbox, a leigeas leat na faidhlichean sin fhaicinn bho àite sam bith agus aig àm sam bith.

Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal
Cha do lorg mi taraidhean le mearachdan fhathast, ach tha mi a’ smaoineachadh gu bheil e comasach

Nuair a thathar a’ sgrùdadh, mar a chaidh ainmeachadh cheana, thathas a’ cleachdadh “ceann-latha sùbailte”; lorgaidh an sgriobt tairgsean a tha taobh a-staigh trì latha bho na cinn-latha a chaidh a thoirt seachad. Ged nuair a bhios e a’ ruith an sgriobt, bidh e a’ coimhead airson tairgsean ann an aon taobh a-mhàin, tha e furasta atharrachadh gus an urrainn dha dàta a chruinneachadh air grunn stiùiridhean itealaich. Le cuideachadh, faodaidh tu fiù 's coimhead airson cìsean mearachdach; faodaidh an leithid de lorg a bhith gu math inntinneach.

Carson a tha feum agad air sgrìob lìn eile?

Nuair a thòisich mi air sgrìobadh lìn an toiseach, gu h-onarach cha robh ùidh shònraichte agam ann. Bha mi airson barrachd phròiseactan a dhèanamh ann an raon modaladh ro-innseach, mion-sgrùdadh ionmhasail, agus, is dòcha, ann an raon mion-sgrùdadh dath tòcail theacsaichean. Ach thionndaidh e a-mach gun robh e glè inntinneach fios a bhith agad ciamar a chruthaicheas tu prògram a chruinnicheas dàta bho làraich-lìn. Mar a chaidh mi a-steach don chuspair seo, thuig mi gur e sgrìobadh lìn “einnsean” an eadar-lìn.

Is dòcha gu bheil thu a’ smaoineachadh gur e aithris ro dàna a tha seo. Ach smaoinich gun do thòisich Google le sgrìob lìn a chruthaich Larry Page a 'cleachdadh Java agus Python. Tha innealan-fuadain Google air a bhith a’ sgrùdadh an eadar-lìn, a’ feuchainn ris na freagairtean as fheàrr a thoirt don luchd-cleachdaidh aca do na ceistean aca. Tha cleachdaidhean gun chrìoch aig sgrìobadh lìn, agus eadhon ged a tha ùidh agad ann an rudeigin eile ann an Saidheans Dàta, bidh feum agad air cuid de sgilean sgrìobadh gus an dàta a dh’ fheumas tu a sgrùdadh.

Lorg mi cuid de na dòighean a chaidh a chleachdadh an seo gu math iongantach an leabhar mu sgrìobadh lìn, a fhuair mi o chionn ghoirid. Tha mòran eisimpleirean agus bheachdan sìmplidh ann airson na dh’ ionnsaich thu a chur an gnìomh gu practaigeach. A bharrachd air an sin, tha caibideil gu math inntinneach ann mu bhith a’ seachnadh sgrùdaidhean reCaptcha. Thàinig seo mar naidheachd dhomh, leis nach robh fios agam eadhon gu robh innealan sònraichte agus eadhon seirbheisean slàn ann airson fuasgladh fhaighinn air na duilgheadasan sin.

An toil leat a bhith a’ siubhal?!

Chun a 'cheist shìmplidh agus neo-chinnteach a tha air a chur ann an tiotal na h-earrainn seo, gu tric bidh thu a' cluinntinn freagairt dheimhinneach, an cois sgeulachd no dhà bho shiubhal an neach a chaidh faighneachd dha. Dh’aontaicheadh ​​a’ mhòr-chuid againn gur e deagh dhòigh a th’ ann siubhal thu fhèin a bhogadh ann an àrainneachdan cultarach ùra agus do shealladh a leudachadh. Ach, ma dh’ fhaighnicheas tu do chuideigin an toil leotha a bhith a’ coimhead airson tiogaidean companaidh-adhair, tha mi cinnteach nach bi am freagairt cho dòchasach. Mar fhìrinn, thig Python gu ar taic an seo.

Is e a’ chiad obair a dh’ fheumas sinn fhuasgladh air an t-slighe gu bhith a’ cruthachadh siostam airson fiosrachadh a lorg air tiogaidean adhair a bhith a’ taghadh àrd-ùrlar iomchaidh às an toir sinn fiosrachadh. Cha robh e furasta dhomh an duilgheadas seo fhuasgladh, ach aig a’ cheann thall thagh mi seirbheis Kayak. Dh’ fheuch mi ri seirbheisean Momondo, Skyscanner, Expedia, agus beagan eile, ach bha na dòighean dìon robot air na goireasan sin do-ruigsinneach. Às deidh grunn oidhirpean, nuair a bha agam ri dèiligeadh ri solais trafaic, slighean luchd-coiseachd agus baidhsagalan, a ’feuchainn ri toirt a chreidsinn air na siostaman gu robh mi daonna, cho-dhùin mi gur e Kayak a b’ fheàrr dhomh, a dh ’aindeoin eadhon ged a bhiodh cus dhuilleagan air an luchdachadh. ann an ùine ghoirid, agus tòisichidh sgrùdaidhean cuideachd. Chaidh agam air toirt air a’ bot iarrtasan a chuir chun làrach aig amannan 4 gu 6 uairean, agus dh’ obraich a h-uile dad gu math. Bho àm gu àm, bidh duilgheadasan ag èirigh nuair a bhios tu ag obair le Kayak, ach ma thòisicheas iad a ’cur dragh ort le seicichean, feumaidh tu an dàrna cuid dèiligeadh riutha le làimh agus an bot a chuir air bhog, no feitheamh beagan uairean a thìde agus bu chòir na sgrùdaidhean stad. Ma tha feum air, is urrainn dhut an còd atharrachadh airson àrd-ùrlar eile gu furasta, agus ma nì thu sin, faodaidh tu aithris anns na beachdan.

Ma tha thu dìreach a’ tòiseachadh le sgrìobadh lìn agus nach eil fios agad carson a tha cuid de làraich-lìn a’ strì leis, an uairsin mus tòisich thu air a’ chiad phròiseact agad san raon seo, dèan fàbhar dhut fhèin agus dèan sgrùdadh Google air na faclan “web scraping etiquette” . Is dòcha gum bi na deuchainnean agad a 'tighinn gu crìch nas luaithe na tha thu a' smaoineachadh ma nì thu sgrìobadh lìn gu mì-chinnteach.

Getting Started

Seo tar-shealladh coitcheann air na thachras anns a’ chòd sgrìobadh lìn againn:

  • Cuir a-steach na leabharlannan a tha a dhìth.
  • A’ fosgladh taba Google Chrome.
  • Cuir fòn gu gnìomh a thòisicheas am bot, a’ dol seachad air na bailtean-mòra agus na cinn-latha a thèid a chleachdadh nuair a bhios tu a’ coimhead airson tiogaidean.
  • Bidh an gnìomh seo a’ toirt a’ chiad toraidhean sgrùdaidh, air an òrdachadh a rèir as fheàrr, agus a’ cliogadh putan gus barrachd thoraidhean a luchdachadh.
  • Bidh gnìomh eile a’ cruinneachadh dàta bhon duilleag gu lèir agus a’ tilleadh frèam dàta.
  • Tha an dà cheum roimhe seo air an coileanadh le bhith a’ cleachdadh seòrsaichean seòrsachaidh a rèir prìs tiogaid (saor) agus a rèir astar itealaich (as luaithe).
  • Thèid post-d a chuir gu neach-cleachdaidh an sgriobt anns a bheil geàrr-chunntas de phrìsean tiogaid (tiogaid as saoire agus prìs chuibheasach), agus tha frèam dàta le fiosrachadh air a sheòrsachadh a rèir nan trì comharran gu h-àrd air a shàbhaladh mar fhaidhle Excel.
  • Tha na gnìomhan gu h-àrd air an coileanadh ann an cearcall às deidh ùine shònraichte.

Bu chòir a thoirt fa-near gu bheil a h-uile pròiseact Selenium a 'tòiseachadh le dràibhear lìn. Bidh mi a 'cleachdadh Driver airson chrome, Bidh mi ag obair le Google Chrome, ach tha roghainnean eile ann. Tha fèill mhòr air PhantomJS agus Firefox cuideachd. Às deidh dhut an draibhear a luchdachadh sìos, feumaidh tu a chuir anns a ’phasgan iomchaidh, agus cuiridh seo crìoch air an ullachadh airson a chleachdadh. Bidh a’ chiad loidhnichean den sgriobt againn a’ fosgladh taba Chrome ùr.

Cumaibh cuimhne nach eil mi na mo sgeulachd a’ feuchainn ri sealladh ùr fhosgladh airson cùmhnantan math a lorg air tiogaidean adhair. Tha dòighean fada nas adhartaiche ann airson a leithid de thairgsean a lorg. Tha mi dìreach airson dòigh shìmplidh ach phractaigeach a thoirt do luchd-leughaidh an stuth seo gus an duilgheadas seo fhuasgladh.

Seo an còd air an do bhruidhinn sinn gu h-àrd.

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)

Aig toiseach a’ chòd chì thu na h-òrdughan in-mhalairt pacaid a thathas a’ cleachdadh tron ​​phròiseact againn. Mar sin, randint air a chleachdadh gus toirt air a’ bot “tuiteam na chadal” airson grunn dhiog air thuaiream mus tòisich thu air obair sgrùdaidh ùr. Mar as trice, chan urrainn dha aon bot a dhèanamh às aonais seo. Ma ruitheas tu an còd gu h-àrd, fosglaidh uinneag Chrome, a chleachdas am bot gus obrachadh le làraich.

Feuch an dèan sinn beagan deuchainn agus fosgail làrach-lìn kayak.com ann an uinneag air leth. Taghaidh sinn am baile-mòr às a bheil sinn gu bhith ag itealaich, agus am baile-mòr a tha sinn airson faighinn, a bharrachd air cinn-latha itealaich. Nuair a bhios tu a 'taghadh cinn-latha, dèan cinnteach gu bheil an raon de + -3 latha air a chleachdadh. Sgrìobh mi an còd a 'toirt aire do na tha an làrach a' dèanamh mar fhreagairt air iarrtasan mar sin. Ma tha, mar eisimpleir, feumaidh tu tiogaidean a lorg a-mhàin airson cinn-latha sònraichte, tha coltas ann gum feum thu an còd bot atharrachadh. Nuair a bhios mi a 'bruidhinn mun chòd, bidh mi a' toirt seachad mìneachaidhean iomchaidh, ach ma tha thu a 'faireachdainn mì-chinnteach, leig fios dhomh.

A-nis cliog air a’ phutan sgrùdaidh agus thoir sùil air a’ cheangal sa bhàr seòlaidh. Bu chòir dha a bhith coltach ris a’ cheangal a chleachdas mi san eisimpleir gu h-ìosal far a bheil an caochladair air ainmeachadh kayak, a tha a 'stòradh an URL, agus tha an dòigh air a chleachdadh get Driver lìn. Às deidh dhut briogadh air a’ phutan sgrùdaidh, bu chòir na toraidhean nochdadh air an duilleag.

Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal
Nuair a chleachd mi an àithne get barrachd air dhà no trì thursan taobh a-staigh beagan mhionaidean, chaidh iarraidh orm dearbhadh a chrìochnachadh a’ cleachdadh reCaptcha. Faodaidh tu an t-seic seo a thoirt seachad le làimh agus leantainn air adhart a’ feuchainn gus an co-dhùin an siostam seic ùr a ruith. Nuair a rinn mi deuchainn air an sgriobt, bha e coltach gu robh a’ chiad seisean sgrùdaidh an-còmhnaidh a’ dol gu rèidh, mar sin ma bha thu airson a’ chòd fheuchainn, cha bhiodh agad ach sgrùdadh a dhèanamh le làimh bho àm gu àm agus leigeil leis a’ chòd ruith, a’ cleachdadh amannan fada eadar seiseanan sgrùdaidh. Agus, ma smaoinicheas tu mu dheidhinn, chan eil e coltach gum feum neach fiosrachadh mu phrìsean thiogaidean a gheibhear aig amannan 10-mionaid eadar obair sgrùdaidh.

Ag obair le duilleag a’ cleachdadh XPath

Mar sin, dh'fhosgail sinn uinneag agus luchdaich sinn an làrach. Gus prìsean is fiosrachadh eile fhaighinn, feumaidh sinn teicneòlas XPath no taghadairean CSS a chleachdadh. Cho-dhùin mi cumail ri XPath agus cha robh mi a’ faireachdainn gu robh feum air luchd-taghaidh CSS a chleachdadh, ach tha e gu math comasach obrachadh mar sin. Faodaidh e a bhith duilich seòladh timcheall duilleag le XPath, agus eadhon ged a chleachdas tu na dòighean anns an do mhìnich mi seo artaigil, a bha a’ toirt a-steach leth-bhreac de na h-aithnichearan co-fhreagarrach bho chòd na duilleige, thuig mi gur e seo, gu dearbh, nach e seo an dòigh as fheàrr air faighinn gu na h-eileamaidean riatanach. Co-dhiù, a-steach seo Tha an leabhar a’ toirt seachad deagh chunntas air bunaitean obrachadh le duilleagan a’ cleachdadh luchd-taghaidh XPath agus CSS. Seo mar a tha an dòigh draibhear lìn co-fhreagarrach coltach.

Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal
Mar sin, leanaidh sinn ag obair air a’ bot. Cleachdaidh sinn comasan a’ phrògraim gus na tiogaidean as saoire a thaghadh. Anns an ìomhaigh a leanas, tha còd roghnaiche XPath air a chomharrachadh ann an dearg. Gus an còd fhaicinn, feumaidh tu briogadh deas air an eileamaid duilleag anns a bheil ùidh agad agus tagh an àithne Inspect bhon chlàr a tha a’ nochdadh. Faodar an àithne seo a ghairm airson diofar eileamaidean duilleag, agus thèid an còd aca a thaisbeanadh agus a chomharrachadh ann an sealladair a’ chòd.

Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal
Seall còd na duilleige

Gus dearbhadh a lorg air an reusanachadh agam mu na h-eas-bhuannachdan a tha ann a bhith a’ dèanamh lethbhreac de luchd-taghaidh bho chòd, thoir aire do na feartan a leanas.

Seo na gheibh thu nuair a nì thu leth-bhreac den chòd:

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

Gus rudeigin mar seo a chopaigeadh, feumaidh tu briogadh deas air an roinn de chòd anns a bheil ùidh agad agus tagh an àithne Copy> Copy XPath bhon chlàr a tha a’ nochdadh.

Seo na chleachd mi airson am putan as saoire a mhìneachadh:

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

Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal
Dèan lethbhreac de dh'àithne> Dèan lethbhreac de XPath

Tha e follaiseach gu bheil an dàrna roghainn a 'coimhead tòrr nas sìmplidh. Nuair a thèid a chleachdadh, bidh e a’ lorg eileamaid a aig a bheil am feart data-code, co-ionnan price. Nuair a bhios tu a’ cleachdadh a’ chiad roghainn, thèid an eileamaid a sgrùdadh id a tha co-ionann ri wtKI-price_aTab, agus tha an t-slighe XPath chun an eileamaid coltach /div[1]/div/div/div[1]/div/span/span. Nì ceist XPath mar seo gu duilleag an cleas, ach dìreach aon turas. Is urrainn dhomh sin a ràdh an-dràsta id atharraichidh e an ath thuras a bhios an duilleag air a luchdachadh. Sreath caractar wtKI ag atharrachadh gu fiùghantach a h-uile uair a thèid an duilleag a luchdachadh, agus mar sin bidh an còd a chleachdas e gun fheum às deidh an ath dhuilleag ath-luchdachadh. Mar sin gabh beagan ùine airson XPath a thuigsinn. Bheir an t-eòlas seo deagh sheirbheis dhut.

Ach, bu chòir a thoirt fa-near gum faod lethbhreac a dhèanamh de luchd-taghaidh XPath a bhith feumail nuair a bhios tu ag obair le làraich gu math sìmplidh, agus ma tha thu comhfhurtail le seo, chan eil dad ceàrr air.

A-nis smaoinich sinn air dè a nì thu ma dh'fheumas tu na toraidhean rannsachaidh gu lèir fhaighinn ann an grunn loidhnichean, taobh a-staigh liosta. Gu math sìmplidh. Tha gach toradh taobh a-staigh nì le clas resultWrapper. Faodar na toraidhean gu lèir a luchdachadh suas ann an lùb coltach ris an fhear a chithear gu h-ìosal.

Bu chòir a thoirt fa-near ma tha thu a 'tuigsinn na tha gu h-àrd, bu chòir dhut a' mhòr-chuid den chòd a bhios sinn a 'sgrùdadh a thuigsinn gu furasta. Mar a bhios an còd seo a’ ruith, gheibh sinn cothrom air na tha a dhìth oirnn (gu dearbh, an eileamaid anns a bheil an toradh air a phasgadh) a’ cleachdadh seòrsa de dh’ inneal sònrachadh slighe (XPath). Tha seo air a dhèanamh gus teacsa an eileamaid fhaighinn agus a chuir ann an nì às an urrainnear dàta a leughadh (air a chleachdadh an toiseach flight_containers, an uair sin - flights_list).

Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal
Tha a’ chiad trì loidhnichean air an taisbeanadh agus chì sinn gu soilleir a h-uile dad a dh’ fheumas sinn. Ach, tha dòighean nas inntinniche againn air fiosrachadh fhaighinn. Feumaidh sinn dàta a thoirt bho gach eileamaid fa leth.

Faigh a dh'obair!

Is e an dòigh as fhasa gnìomh a sgrìobhadh toraidhean a bharrachd a luchdachadh, agus mar sin is ann an sin a thòisicheas sinn. Bu mhath leam an àireamh de thursan a gheibh am prògram fiosrachadh mu dheidhinn a mheudachadh, gun a bhith a’ togail amharas san t-seirbheis a tha a’ leantainn gu sgrùdadh, agus mar sin cliogaidh mi air a’ phutan Luchdaich barrachd thoraidhean aon uair gach uair a thèid an duilleag a thaisbeanadh. Anns a 'chòd seo, bu chòir dhut aire a thoirt don bhloc try, a chuir mi ris oir uaireannan chan eil am putan a’ luchdachadh ceart. Ma thachras tu air seo cuideachd, thoir beachd air fiosan chun ghnìomh seo sa chòd gnìomh start_kayak, air am bi sinn a’ coimhead gu h-ìosal.

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

A-nis, às deidh mion-sgrùdadh fada air a’ ghnìomh seo (uaireannan gheibh mi air falbh), tha sinn deiseil airson gnìomh ainmeachadh a sgrìobas an duilleag.

Tha mi mu thràth air a 'mhòr-chuid de na tha a dhìth a chruinneachadh anns a' ghnìomh a leanas ris an canar page_scrape. Aig amannan thèid an dàta slighe air ais a thoirt còmhla, agus mar sin bidh mi a’ cleachdadh dòigh shìmplidh airson a sgaradh. Mar eisimpleir, nuair a bhios mi a’ cleachdadh caochladairean airson a’ chiad uair section_a_list и section_b_list. Bidh an gnìomh againn a’ tilleadh frèam dàta flights_df, leigidh seo leinn na toraidhean a gheibhear bho dhiofar dhòighean seòrsachaidh dàta a sgaradh agus an cur còmhla nas fhaide air adhart.

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

Dh'fheuch mi ris na caochladairean ainmeachadh gus am biodh an còd furasta a thuigsinn. Cuimhnich gu bheil caochladairean a 'tòiseachadh le a buinidh do cheud cheum na slighe, agus b - gus an dàrna. Gluaisidh sinn air adhart chun ath ghnìomh.

Innealan taic

Tha gnìomh againn a-nis a leigeas leinn toraidhean rannsachaidh a bharrachd a luchdachadh agus gnìomh gus na toraidhean sin a phròiseasadh. Dh’ fhaodadh an artaigil seo a bhith air tighinn gu crìch an seo, leis gu bheil an dà ghnìomh seo a’ toirt seachad a h-uile dad a dh’ fheumas tu airson duilleagan a sgrìobadh as urrainn dhut thu fhèin fhosgladh. Ach chan eil sinn fhathast air beachdachadh air cuid de na dòighean taice air an deach beachdachadh gu h-àrd. Mar eisimpleir, is e seo an còd airson post-d a chuir agus cuid de rudan eile. Faodar seo uile a lorg anns a 'ghnìomh start_kayak, air am bi sinn a nis a' beachdachadh.

Gus an obraich an gnìomh seo, feumaidh tu fiosrachadh mu bhailtean-mòra agus cinn-latha. A’ cleachdadh an fhiosrachaidh seo, bidh e na cheangal ann an caochladair kayak, a tha air a chleachdadh gus do thoirt gu duilleag anns am bi toraidhean rannsachaidh air an òrdachadh a rèir an maidseadh as fheàrr ris a’ cheist. Às deidh a 'chiad seisean sgrìobadh, obraichidh sinn leis na prìsean anns a' chlàr aig mullach na duilleige. Is e sin, lorgaidh sinn a’ phrìs as ìsle de thiogaid agus a’ phrìs chuibheasach. Thèid seo uile, còmhla ris an ro-innse a chuir an làrach a-mach, a chuir air post-d. Air an duilleig, bu chòir gum biodh an clàr co-fhreagarrach anns an oisean gu h-àrd air an taobh chlì. Le bhith ag obair leis a 'chlàr seo, co-dhiù, dh' fhaodadh mearachd adhbhrachadh nuair a thathar a 'rannsachadh a' cleachdadh cinn-latha mionaideach, oir anns a 'chùis seo chan eil an clàr air a thaisbeanadh air an duilleag.

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

Rinn mi deuchainn air an sgriobt seo a’ cleachdadh cunntas Outlook (hotmail.com). Chan eil mi air deuchainn a dhèanamh air gus obrachadh gu ceart le cunntas Gmail, tha fèill mhòr air an t-siostam post-d seo, ach tha mòran roghainnean ann. Ma chleachdas tu cunntas Hotmail, an uairsin gus an obraich a h-uile càil, cha leig thu leas ach an dàta agad a chuir a-steach don chòd.

Ma tha thu airson tuigsinn dè dìreach a thathas a’ dèanamh ann an earrannan sònraichte den chòd airson a’ ghnìomh seo, faodaidh tu lethbhreac a dhèanamh dhiubh agus feuchainn orra. Is e a bhith a’ feuchainn ris a’ chòd an aon dòigh air a thuigsinn gu fìrinneach.

Siostam deiseil

A-nis gu bheil sinn air a h-uile dad a bhruidhinn sinn a dhèanamh, is urrainn dhuinn lùb sìmplidh a chruthachadh a dh’ ainmicheas ar gnìomhan. Bidh an sgriobt ag iarraidh dàta bhon neach-cleachdaidh mu bhailtean-mòra agus cinn-latha. Nuair a bhios tu a’ dèanamh deuchainn le ath-thòiseachadh cunbhalach den sgriobt, chan eil e coltach gum bi thu airson an dàta seo a chuir a-steach le làimh a h-uile uair, agus mar sin faodar iomradh a thoirt air na loidhnichean co-fhreagarrach, airson àm an deuchainn, le bhith a’ toirt iomradh air an fheadhainn gu h-ìosal, anns a bheil an dàta a dh ’fheumas an tha an sgriobt le còd cruaidh.

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 mar a tha ruith deuchainn den sgriobt coltach.
Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal
Deuchainn ruith an sgriobt

Builean

Ma tha thu air a dhèanamh cho fada seo, meala-naidheachd ort! Tha sgrìob lìn obrach agad a-nis, ged a chì mi iomadh dòigh air a leasachadh mu thràth. Mar eisimpleir, faodar a cheangal ri Twilio gus an cuir e teachdaireachdan teacsa an àite puist-d. Faodaidh tu VPN no rudeigin eile a chleachdadh gus toraidhean fhaighinn aig an aon àm bho ghrunn luchd-frithealaidh. Tha duilgheadas ann cuideachd bho àm gu àm le bhith a’ sgrùdadh neach-cleachdaidh na làraich gus faicinn a bheil e na dhuine, ach faodar an duilgheadas seo fhuasgladh cuideachd. Ann an suidheachadh sam bith, a-nis tha bunait agad as urrainn dhut a leudachadh ma thogras tu. Mar eisimpleir, dèan cinnteach gun tèid faidhle Excel a chuir chun neach-cleachdaidh mar cheangal ri post-d.

Python - neach-cuideachaidh ann a bhith a 'lorg thiocaidean adhair saor dhaibhsan a tha dèidheil air siubhal

Chan fhaod ach luchd-cleachdaidh clàraichte pàirt a ghabhail san sgrùdadh. Soidhnig a-steach, mas e do thoil e.

Am bi thu a’ cleachdadh teicneòlas sgrìobadh lìn?

  • gu bheil

  • Chan eil

Bhòt 8 neach-cleachdaidh. Cha do stad 1 neach-cleachdaidh.

Source: www.habr.com

Cuir beachd ann