Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo

Onkọwe ti nkan naa, itumọ eyiti a ntẹjade loni, sọ pe ibi-afẹde rẹ ni lati sọrọ nipa idagbasoke ti scraper wẹẹbu ni Python nipa lilo Selenium, eyiti o wa awọn idiyele tikẹti ọkọ ofurufu. Nigbati o ba n wa awọn tikẹti, awọn ọjọ to rọ ni a lo (+- awọn ọjọ 3 ti o ni ibatan si awọn ọjọ ti a pato). Awọn scraper ṣafipamọ awọn abajade wiwa sinu faili Excel kan ati firanṣẹ eniyan ti o ran wiwa naa imeeli pẹlu akopọ ohun ti wọn rii. Ibi-afẹde ti iṣẹ akanṣe yii ni lati ṣe iranlọwọ fun awọn aririn ajo lati wa awọn iṣowo to dara julọ.

Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo

Ti, lakoko ti o loye ohun elo naa, o lero pe o sọnu, wo eyi article.

Kini a yoo wa?

O ni ominira lati lo eto ti a ṣalaye nibi bi o ṣe fẹ. Fun apẹẹrẹ, Mo lo lati wa awọn irin-ajo ipari ose ati tikẹti si ilu mi. Ti o ba ṣe pataki nipa wiwa awọn tikẹti ere, o le ṣiṣe iwe afọwọkọ lori olupin naa (rọrun olupin, fun 130 rubles fun osu kan, jẹ ohun ti o dara fun eyi) ati rii daju pe o nṣiṣẹ lẹẹkan tabi lẹmeji ọjọ kan. Awọn abajade wiwa yoo jẹ fifiranṣẹ si ọ nipasẹ imeeli. Ni afikun, Mo ṣeduro ṣeto ohun gbogbo ki iwe afọwọkọ fi faili Excel kan pamọ pẹlu awọn abajade wiwa ninu folda Dropbox, eyiti yoo gba ọ laaye lati wo iru awọn faili lati ibikibi ati nigbakugba.

Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo
Emi ko rii awọn idiyele pẹlu awọn aṣiṣe sibẹsibẹ, ṣugbọn Mo ro pe o ṣee ṣe

Nigbati o ba n wa, bi a ti sọ tẹlẹ, “ọjọ iyipada” ni a lo; iwe afọwọkọ naa wa awọn ipese ti o wa laarin ọjọ mẹta ti awọn ọjọ ti a fun. Botilẹjẹpe nigba ṣiṣe iwe afọwọkọ naa, o wa awọn ipese ni itọsọna kan nikan, o rọrun lati yipada ki o le gba data lori awọn itọsọna ọkọ ofurufu pupọ. Pẹlu iranlọwọ rẹ, o le paapaa wa awọn owo-ori aṣiṣe; iru awọn wiwa le jẹ igbadun pupọ.

Kini idi ti o nilo scraper wẹẹbu miiran?

Nigbati mo kọkọ bẹrẹ lilọ kiri wẹẹbu, nitootọ Emi ko nifẹ pupọ ninu rẹ. Mo fẹ lati ṣe awọn iṣẹ akanṣe diẹ sii ni aaye ti awoṣe asọtẹlẹ, itupalẹ owo, ati, o ṣee ṣe, ni aaye ti n ṣatupalẹ awọn awọ ẹdun ti awọn ọrọ. Ṣugbọn o wa ni jade pe o dun pupọ lati ṣawari bi o ṣe le ṣẹda eto kan ti o gba data lati awọn oju opo wẹẹbu. Bi mo ṣe lọ sinu koko-ọrọ yii, Mo rii pe fifọ wẹẹbu ni "engine" ti Intanẹẹti.

O le ro pe eyi jẹ alaye igboya pupọ. Ṣugbọn ro pe Google bẹrẹ pẹlu scraper wẹẹbu ti Larry Page ṣẹda nipa lilo Java ati Python. Awọn roboti Google ti n ṣawari Intanẹẹti, n gbiyanju lati pese awọn olumulo rẹ pẹlu awọn idahun to dara julọ si awọn ibeere wọn. Ṣiṣayẹwo wẹẹbu ni awọn lilo ailopin, ati paapaa ti o ba nifẹ si nkan miiran ni Imọ-jinlẹ Data, iwọ yoo nilo diẹ ninu awọn ọgbọn fifọ lati gba data ti o nilo lati ṣe itupalẹ.

Mo ti ri diẹ ninu awọn ilana ti a lo nibi ni iyanu kan iwe nipa ayelujara scraping, eyi ti mo ti gba laipe. O ni ọpọlọpọ awọn apẹẹrẹ ti o rọrun ati awọn imọran fun lilo ilo ohun ti o ti kọ. Ni afikun, ipin ti o nifẹ pupọ wa lori lilọ kiri awọn sọwedowo reCaptcha. Eyi wa bi iroyin fun mi, niwon Emi ko mọ pe awọn irinṣẹ pataki wa ati paapaa gbogbo awọn iṣẹ fun didaju iru awọn iṣoro bẹ.

Ṣe o nifẹ lati rin irin-ajo?!

Si ibeere ti o rọrun ati kuku laiseniyan ti o wa ninu akọle ti apakan yii, o le gbọ nigbagbogbo idahun rere, ti o tẹle pẹlu awọn itan meji lati awọn irin-ajo ti ẹni ti a beere lọwọ rẹ. Pupọ wa yoo gba pe irin-ajo jẹ ọna nla lati fi ara rẹ bọmi ni awọn agbegbe aṣa tuntun ati gbooro awọn iwoye rẹ. Bibẹẹkọ, ti o ba beere lọwọ ẹnikan boya wọn fẹran wiwa awọn tikẹti ọkọ ofurufu, Mo ni idaniloju pe idahun kii yoo daadaa. Gẹgẹbi ọrọ otitọ, Python wa si iranlọwọ wa nibi.

Iṣẹ akọkọ ti a nilo lati yanju ni ọna lati ṣẹda eto fun wiwa alaye lori awọn tikẹti afẹfẹ yoo jẹ yiyan pẹpẹ ti o dara lati eyiti a yoo gba alaye. Yiyan iṣoro yii ko rọrun fun mi, ṣugbọn ni ipari Mo yan iṣẹ Kayak. Mo gbiyanju awọn iṣẹ ti Momondo, Skyscanner, Expedia, ati awọn miiran diẹ, ṣugbọn awọn ọna aabo roboti lori awọn orisun wọnyi ko ṣee ṣe. Lẹhin awọn igbiyanju pupọ, lakoko eyiti Mo ni lati ṣe pẹlu awọn imọlẹ opopona, awọn ọna irekọja ati awọn kẹkẹ keke, n gbiyanju lati parowa fun awọn ọna ṣiṣe pe emi jẹ eniyan, Mo pinnu pe Kayak dara julọ fun mi, botilẹjẹpe paapaa ti awọn oju-iwe pupọ ba ti kojọpọ. ni igba diẹ, ati awọn sọwedowo tun bẹrẹ. Mo ṣakoso lati jẹ ki bot firanṣẹ awọn ibeere si aaye ni awọn aaye arin ti awọn wakati 4 si 6, ati pe ohun gbogbo ṣiṣẹ daradara. Lati igba de igba, awọn iṣoro dide nigbati wọn n ṣiṣẹ pẹlu Kayak, ṣugbọn ti wọn ba bẹrẹ si ṣe ipalara rẹ pẹlu awọn sọwedowo, lẹhinna o nilo lati ba wọn ṣe pẹlu ọwọ ati lẹhinna ṣe ifilọlẹ bot, tabi duro fun awọn wakati diẹ ati awọn sọwedowo yẹ ki o da duro. Ti o ba jẹ dandan, o le ni rọọrun mu koodu mu ṣiṣẹ fun pẹpẹ miiran, ati pe ti o ba ṣe bẹ, o le jabo ninu awọn asọye.

Ti o ba kan bẹrẹ pẹlu fifa wẹẹbu ati pe ko mọ idi ti awọn oju opo wẹẹbu kan n tiraka pẹlu rẹ, lẹhinna ṣaaju ki o to bẹrẹ iṣẹ akanṣe akọkọ rẹ ni agbegbe yii, ṣe ojurere fun ara rẹ ki o ṣe wiwa Google kan lori awọn ọrọ naa “Iwabajẹ oju opo wẹẹbu” . Awọn adanwo rẹ le pari laipẹ ju bi o ti ro lọ ti o ba ṣe lilọ kiri wẹẹbu lainidi.

Bibẹrẹ

Eyi ni akopọ gbogbogbo ti ohun ti yoo ṣẹlẹ ninu koodu scraper wẹẹbu wa:

  • Ṣe agbewọle awọn ile-ikawe ti o nilo.
  • Ṣii taabu Google Chrome kan.
  • Pe iṣẹ kan ti o bẹrẹ bot, ti o kọja awọn ilu ati awọn ọjọ ti yoo ṣee lo nigba wiwa awọn tikẹti.
  • Iṣẹ yii gba awọn abajade wiwa akọkọ, lẹsẹsẹ nipasẹ ti o dara julọ, ati tẹ bọtini kan lati gbe awọn abajade diẹ sii.
  • Iṣẹ miiran n gba data lati gbogbo oju-iwe ati da fireemu data pada.
  • Awọn igbesẹ meji ti tẹlẹ ni a ṣe ni lilo awọn iru yiyan nipasẹ idiyele tikẹti (olowo poku) ati nipasẹ iyara ọkọ ofurufu (yiyara).
  • Imeeli ti o ni akopọ ti awọn idiyele tikẹti (awọn tikẹti ti o din owo ati idiyele apapọ) ni a fi ranṣẹ si olumulo iwe afọwọkọ, ati fireemu data kan pẹlu alaye ti o lẹsẹsẹ nipasẹ awọn metiriki mẹta ti a mẹnuba ti wa ni fipamọ bi faili Excel kan.
  • Gbogbo awọn iṣe ti o wa loke ni a ṣe ni ọmọ lẹhin akoko kan pato.

O yẹ ki o ṣe akiyesi pe gbogbo iṣẹ akanṣe Selenium bẹrẹ pẹlu awakọ wẹẹbu kan. Mo lo Chromedriver, Mo ṣiṣẹ pẹlu Google Chrome, ṣugbọn awọn aṣayan miiran wa. PhantomJS ati Firefox tun jẹ olokiki. Lẹhin igbasilẹ awakọ naa, o nilo lati gbe si folda ti o yẹ, ati pe eyi pari igbaradi fun lilo rẹ. Awọn laini akọkọ ti iwe afọwọkọ wa ṣii taabu Chrome tuntun kan.

Ranti pe ninu itan mi Emi ko gbiyanju lati ṣii awọn iwoye tuntun fun wiwa awọn iṣowo nla lori awọn tikẹti afẹfẹ. Awọn ọna ilọsiwaju pupọ wa ti wiwa iru awọn ipese bẹẹ. Mo kan fẹ lati fun awọn oluka ohun elo yii ni ọna ti o rọrun ṣugbọn ilowo lati yanju iṣoro yii.

Eyi ni koodu ti a sọrọ nipa loke.

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)

Ni ibẹrẹ koodu o le rii awọn aṣẹ gbe wọle package ti o lo jakejado iṣẹ akanṣe wa. Nitorina, randint ti a lo lati jẹ ki bot “ṣubu sun oorun” fun nọmba aaya ti awọn aaya ṣaaju ki o to bẹrẹ iṣẹ wiwa tuntun kan. Nigbagbogbo, kii ṣe bot kan le ṣe laisi eyi. Ti o ba ṣiṣẹ koodu ti o wa loke, window Chrome yoo ṣii, eyiti bot yoo lo lati ṣiṣẹ pẹlu awọn aaye.

Jẹ ki a ṣe idanwo diẹ ki o ṣii oju opo wẹẹbu kayak.com ni window lọtọ. A yoo yan ilu lati eyiti a yoo fo, ati ilu ti a fẹ lati de, ati awọn ọjọ ọkọ ofurufu. Nigbati o ba yan awọn ọjọ, rii daju pe iwọn +-3 ọjọ ti lo. Mo kọ koodu naa ni akiyesi ohun ti aaye naa gbejade ni idahun si iru awọn ibeere. Ti, fun apẹẹrẹ, o nilo lati wa awọn tikẹti nikan fun awọn ọjọ pàtó kan, lẹhinna iṣeeṣe giga kan wa ti iwọ yoo ni lati yi koodu bot pada. Nigbati mo ba sọrọ nipa koodu naa, Mo pese awọn alaye ti o yẹ, ṣugbọn ti o ba ni idamu, jẹ ki n mọ.

Bayi tẹ bọtini wiwa ati wo ọna asopọ ni ọpa adirẹsi. O yẹ ki o jẹ iru si ọna asopọ ti Mo lo ninu apẹẹrẹ ni isalẹ nibiti a ti sọ oniyipada naa kayak, eyi ti o tọju URL naa, ati ọna ti a lo get awakọ wẹẹbu. Lẹhin titẹ bọtini wiwa, awọn abajade yẹ ki o han loju oju-iwe naa.

Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo
Nigbati mo lo pipaṣẹ get diẹ ẹ sii ju igba meji tabi mẹta laarin iṣẹju diẹ, a beere lọwọ mi lati pari ijẹrisi nipa lilo reCaptcha. O le ṣe ayẹwo yii pẹlu ọwọ ati tẹsiwaju idanwo titi ti eto yoo fi pinnu lati ṣiṣe ayẹwo tuntun kan. Nigbati Mo ṣe idanwo iwe afọwọkọ naa, o dabi ẹni pe igba wiwa akọkọ nigbagbogbo lọ laisiyonu, nitorinaa ti o ba fẹ lati ṣe idanwo pẹlu koodu naa, iwọ yoo ni lati ṣayẹwo nigbagbogbo pẹlu ọwọ ati jẹ ki koodu naa ṣiṣẹ, ni lilo awọn aaye arin gigun laarin awọn akoko wiwa. Ati pe, ti o ba ronu nipa rẹ, eniyan ko ṣeeṣe lati nilo alaye nipa awọn idiyele tikẹti ti o gba ni awọn aaye arin iṣẹju 10 laarin awọn iṣẹ ṣiṣe wiwa.

Nṣiṣẹ pẹlu oju-iwe kan nipa lilo XPath

Nitorina, a ṣii window kan ati ki o kojọpọ aaye naa. Lati gba idiyele ati alaye miiran, a nilo lati lo imọ-ẹrọ XPath tabi awọn yiyan CSS. Mo pinnu lati duro pẹlu XPath ati pe ko lero iwulo lati lo awọn yiyan CSS, ṣugbọn o ṣee ṣe pupọ lati ṣiṣẹ ni ọna yẹn. Lilọ kiri ni ayika oju-iwe kan nipa lilo XPath le jẹ ẹtan, ati paapaa ti o ba lo awọn ilana ti Mo ṣalaye ninu eyi nkan naa, eyiti o kan didakọ awọn idamọ ti o baamu lati koodu oju-iwe, Mo rii pe eyi ni, ni otitọ, kii ṣe ọna ti o dara julọ lati wọle si awọn eroja pataki. Nipa ọna, ni eyi Iwe naa pese apejuwe ti o dara julọ ti awọn ipilẹ ti ṣiṣẹ pẹlu awọn oju-iwe nipa lilo XPath ati awọn ayanfẹ CSS. Eyi ni ọna awakọ wẹẹbu ti o baamu dabi.

Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo
Nitorinaa, jẹ ki a tẹsiwaju ṣiṣẹ lori bot. Jẹ ki a lo awọn agbara eto lati yan awọn tikẹti ti o kere julọ. Ni aworan atẹle, koodu yiyan XPath jẹ afihan ni pupa. Lati le wo koodu naa, o nilo lati tẹ-ọtun lori nkan oju-iwe ti o nifẹ si ki o yan aṣẹ Ṣayẹwo lati inu akojọ aṣayan ti o han. Aṣẹ yii le pe fun awọn eroja oju-iwe oriṣiriṣi, koodu eyiti yoo han ati afihan ni oluwo koodu.

Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo
Wo koodu oju-iwe

Lati le rii idaniloju ero mi nipa awọn aila-nfani ti didakọ awọn yiyan lati koodu, ṣe akiyesi awọn ẹya wọnyi.

Eyi ni ohun ti o gba nigbati o ba da koodu naa:

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

Lati le daakọ nkan bii eyi, o nilo lati tẹ-ọtun lori apakan ti koodu ti o nifẹ si ki o yan Daakọ> Daakọ XPath aṣẹ lati inu akojọ aṣayan ti o han.

Eyi ni ohun ti Mo lo lati ṣalaye bọtini Ti o din owo julọ:

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

Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo
Daakọ pipaṣẹ > Daakọ XPath

O han gbangba pe aṣayan keji dabi irọrun pupọ. Nigbati o ba lo, o wa ohun elo kan ti o ni ẹda data-code, dọgba price. Nigbati o ba nlo aṣayan akọkọ, a wa nkan naa id eyi ti o jẹ dogba wtKI-price_aTab, ati ọna XPath si eroja dabi /div[1]/div/div/div[1]/div/span/span. Ibeere XPath bi eleyi si oju-iwe kan yoo ṣe ẹtan naa, ṣugbọn ni ẹẹkan. Mo le sọ ni bayi pe id yoo yi nigbamii ti iwe ti wa ni ti kojọpọ. kikọ ọkọọkan wtKI awọn ayipada ni agbara ni gbogbo igba ti oju-iwe naa ba ti kojọpọ, nitorinaa koodu ti o nlo yoo jẹ asan lẹhin atungbejade oju-iwe atẹle. Nitorinaa gba akoko diẹ lati ni oye XPath. Imọye yii yoo ṣe iranṣẹ fun ọ daradara.

Sibẹsibẹ, o yẹ ki o ṣe akiyesi pe didakọ awọn yiyan XPath le wulo nigbati o ba ṣiṣẹ pẹlu awọn aaye ti o rọrun, ati pe ti o ba ni itunu pẹlu eyi, ko si ohun ti ko tọ si.

Bayi jẹ ki a ronu nipa kini lati ṣe ti o ba nilo lati gba gbogbo awọn abajade wiwa ni awọn laini pupọ, inu atokọ kan. Rọrun pupọ. Abajade kọọkan wa ninu ohun kan pẹlu kilasi kan resultWrapper. Ikojọpọ gbogbo awọn abajade le ṣee ṣe ni lupu kan ti o jọra si eyiti o han ni isalẹ.

O yẹ ki o ṣe akiyesi pe ti o ba loye loke, lẹhinna o yẹ ki o ni irọrun loye pupọ julọ koodu ti a yoo ṣe itupalẹ. Bi koodu yii ṣe n ṣiṣẹ, a wọle si ohun ti a nilo (ni otitọ, ipin ninu eyiti abajade ti wa ni ipari) ni lilo diẹ ninu iru ẹrọ sisọ-ọna (XPath). Eyi ni a ṣe lati le gba ọrọ ti nkan naa ki o si gbe e sinu ohun kan lati inu eyiti a le ka data (ti a lo ni akọkọ flight_containers, lẹhinna - flights_list).

Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo
Awọn ila mẹta akọkọ ti han ati pe a le rii kedere ohun gbogbo ti a nilo. Sibẹsibẹ, a ni diẹ awon ona ti gba alaye. A nilo lati mu data lati eroja kọọkan lọtọ.

Lọ si iṣẹ!

Ọna to rọọrun lati kọ iṣẹ kan ni lati ṣaja awọn abajade afikun, nitorinaa ni ibiti a yoo bẹrẹ. Emi yoo fẹ lati mu iwọn awọn ọkọ ofurufu pọ si ti eto naa gba alaye nipa, laisi igbega awọn ifura ninu iṣẹ ti o yori si ayewo, nitorinaa Mo tẹ bọtini awọn abajade Fifuye diẹ sii lẹẹkan ni gbogbo igba ti oju-iwe naa ba han. Ni koodu yii, o yẹ ki o san ifojusi si Àkọsílẹ try, eyi ti mo ti fi kun nitori ma awọn bọtini ko ni fifuye daradara. Ti o ba tun pade eyi, sọ asọye awọn ipe si iṣẹ yii ni koodu iṣẹ start_kayak, eyi ti a yoo wo ni isalẹ.

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

Bayi, lẹhin itupalẹ pipẹ ti iṣẹ yii (nigbakugba Mo le gbe lọ), a ti ṣetan lati kede iṣẹ kan ti yoo pa oju-iwe naa kuro.

Mo ti gba pupọ julọ ohun ti o nilo ni iṣẹ atẹle ti a pe page_scrape. Nigba miiran data ipa-ọna ti o pada jẹ idapo, nitorinaa Mo lo ọna ti o rọrun lati ya sọtọ. Fun apẹẹrẹ, nigbati mo lo awọn oniyipada fun igba akọkọ section_a_list и section_b_list. Iṣẹ wa da fireemu data pada flights_df, Eyi n gba wa laaye lati ya awọn abajade ti a gba lati awọn ọna titọtọ data ọtọtọ ati nigbamii darapọ wọn.

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

Mo gbiyanju lati lorukọ awọn oniyipada ki koodu naa le ni oye. Ranti pe awọn oniyipada bẹrẹ pẹlu a jẹ ti ipele akọkọ ti ọna, ati b - si keji. Jẹ ki a lọ si iṣẹ atẹle.

Awọn ilana atilẹyin

A ni iṣẹ kan ti o fun wa laaye lati ṣajọpọ awọn abajade wiwa afikun ati iṣẹ kan lati ṣe ilana awọn abajade yẹn. Nkan yii le ti pari nihin, nitori awọn iṣẹ meji wọnyi pese ohun gbogbo ti o nilo lati pa awọn oju-iwe ti o le ṣii funrararẹ. Ṣugbọn a ko tii ronu diẹ ninu awọn ọna ṣiṣe iranlọwọ ti a sọrọ loke. Fun apẹẹrẹ, eyi ni koodu fun fifiranṣẹ awọn imeeli ati diẹ ninu awọn ohun miiran. Gbogbo eyi ni a le rii ninu iṣẹ naa start_kayak, èyí tí a óò gbé yẹ̀ wò báyìí.

Iṣẹ yii nilo alaye nipa awọn ilu ati awọn ọjọ. Lilo alaye yii, o ṣe ọna asopọ ni oniyipada kan kayak, eyi ti a lo lati mu ọ lọ si oju-iwe kan ti yoo ni awọn abajade wiwa ti a ṣeto nipasẹ ibaamu ti o dara julọ si ibeere naa. Lẹhin igba akọkọ scraping, a yoo ṣiṣẹ pẹlu awọn owo ni tabili ni oke ti awọn iwe. Eyun, a yoo rii idiyele tikẹti ti o kere ju ati idiyele apapọ. Gbogbo eyi, pẹlu asọtẹlẹ ti aaye naa gbejade, yoo firanṣẹ nipasẹ imeeli. Lori oju-iwe, tabili ti o baamu yẹ ki o wa ni igun apa osi oke. Ṣiṣẹ pẹlu tabili yii, nipasẹ ọna, le fa aṣiṣe nigba wiwa ni lilo awọn ọjọ gangan, nitori ninu ọran yii tabili ko han loju oju-iwe naa.

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

Mo ṣe idanwo iwe afọwọkọ yii nipa lilo akọọlẹ Outlook kan (hotmail.com). Emi ko ṣe idanwo rẹ lati ṣiṣẹ ni deede pẹlu akọọlẹ Gmail kan, eto imeeli yii jẹ olokiki pupọ, ṣugbọn ọpọlọpọ awọn aṣayan ṣee ṣe. Ti o ba lo akọọlẹ Hotmail, lẹhinna ki ohun gbogbo le ṣiṣẹ, o kan nilo lati tẹ data rẹ sii sinu koodu naa.

Ti o ba fẹ lati ni oye ohun ti a ṣe ni pato ni awọn apakan pato ti koodu fun iṣẹ yii, o le daakọ wọn ki o ṣe idanwo pẹlu wọn. Ṣiṣayẹwo pẹlu koodu naa nikan ni ọna lati loye rẹ nitootọ.

Eto setan

Ni bayi ti a ti ṣe ohun gbogbo ti a sọrọ nipa, a le ṣẹda lupu ti o rọrun ti o pe awọn iṣẹ wa. Iwe afọwọkọ naa beere data lati ọdọ olumulo nipa awọn ilu ati awọn ọjọ. Nigbati o ba ṣe idanwo pẹlu atunbere nigbagbogbo ti iwe afọwọkọ, o ko ṣeeṣe lati fẹ lati tẹ data yii sii pẹlu ọwọ ni gbogbo igba, nitorinaa awọn laini ti o baamu, fun akoko idanwo, le ṣe asọye nipa sisọ awọn ti o wa ni isalẹ wọn, ninu eyiti data nilo nipasẹ akosile ti wa ni hardcoded.

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

Eyi ni ohun ti ṣiṣe idanwo ti iwe afọwọkọ naa dabi.
Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo
Igbeyewo ṣiṣe ti awọn akosile

Awọn esi

Ti o ba ti ṣe eyi jina, oriire! Bayi o ni scraper wẹẹbu ti n ṣiṣẹ, botilẹjẹpe Mo ti le rii ọpọlọpọ awọn ọna lati mu dara si. Fun apẹẹrẹ, o le ṣepọ pẹlu Twilio ki o fi awọn ifọrọranṣẹ ranṣẹ dipo awọn imeeli. O le lo VPN tabi nkan miiran lati gba awọn abajade nigbakanna lati ọdọ awọn olupin pupọ. Iṣoro ti o nwaye lojoojumọ tun wa pẹlu ṣiṣe ayẹwo olumulo aaye lati rii boya o jẹ eniyan, ṣugbọn iṣoro yii tun le yanju. Ni eyikeyi idiyele, bayi o ni ipilẹ ti o le faagun ti o ba fẹ. Fun apẹẹrẹ, rii daju pe faili Excel kan ti firanṣẹ si olumulo bi asomọ si imeeli.

Python - oluranlọwọ ni wiwa awọn tikẹti afẹfẹ ti ko gbowolori fun awọn ti o nifẹ lati rin irin-ajo

Awọn olumulo ti o forukọsilẹ nikan le kopa ninu iwadi naa. wọle, Jowo.

Ṣe o lo awọn imọ-ẹrọ fifa wẹẹbu?

  • Bẹẹni

  • No

8 olumulo dibo. 1 olumulo abstained.

orisun: www.habr.com

Fi ọrọìwòye kun