Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter

Auctor articuli, cuius translationis hodie agimus, dicit propositum suum loqui de evolutione telae rasoris in Pythone Selenium utentem, quae tesseras pretiis airline perquirit. Cum tesseras quaerunt, dies flexibiles adhibentur (+- 3 dies ad statis tempora relatis). Rasra investigationum proventus in tabula Excell servat et hominem qui inquisitionem electronicam percurrit cum summa eorum quae invenerunt. Propositum huius consilii est viatoribus auxilium invenire optime tractat.

Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter

Si materiam intelligendo sentis perditam, vide haec articulus.

Quid ergo dicemus quaeramus?

Liberum tibi est ut systema hic de quo vis utatur. Exempli gratia, id usus sum ad quaerendas volutpat tionum ac turpis in patriam meam. Si gravis es de inveniendo tesseras utiles, scriptum in servo currere potes servo, pro 130 rubles in mense, satis idoneus ad hoc) et fac ut semel vel bis in die decurrat. Proventus explorationis mittentur tibi per email. Praeterea commendo omnia disponere ut scriptura praecellentem fasciculum salvet cum proventus investigationis in Dropbox in folder, quod tales tabulas a quocumque tempore et quovis tempore inspicere permittet.

Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter
Erroribus adhuc portoriis non inveni, sed posse puto

Cum investigatione, ut iam dictum est, "datum flexibile" adhibetur, scriptum invenit offerat intra tres dies datarum. Etsi scriptum currit, unam tantum partem offerre quaerit, facile est eam mutare ut notitias in plures volatus partes colligere possit. Cum eius auxilio etiam portoriis erroneis quaerere potes, tales invenit valde interesting.

Cur opus est alio rasorio telae?

Cum primum telam radendo incepi, honeste in ea non fui. Plura facere volui in campo exemplaris predictive, analysi nummaria, et fortasse in campo analysendi motus colorum textuum. Sed evenit ut valde interesting ut instar sicco quam creare programma notitia ex websites colligit. Cum in hunc locum incidimus, intellexi telam rasuram esse "machinam" interreti.

Hoc nimis audax verbum putes. Sed vide Google per telam rasorio incepit, quod Larry Page usus Java et Python creavit. Google robots Interreti exploraverunt, suis utentes optimis quaestionibus responsa dare conantur. Rasura telae infinitas usus habet, et etiam si quid aliud in Data Scientiae curas, aliquas artes radendo opust ut notitias quas resolvere debes.

Inveni quaedam artificia hic mirabiliter adhibita liber de tela rasura, quam nuper adquisivi. Multa simplicia exempla et ideas continet ad usum eorum quae didicisti. In addition, est valde interesting capitulo praeteriens reCaptcha compescit. Hoc mihi nuntiabatur, quando quidem nesciebam instrumenta specialia ac etiam officia integra ad tales quaestiones solvendas esse.

Libenter iter ?!

Ad quaestionem simplicem et potius simplicem, quae in titulo huius sectionis ponitur, saepe audire potes responsionem affirmativam, comitante duobus fabulis ex peregrinationibus eius cui quaesitum est. Plurimi nobis consentiunt iter magnum esse iter in novos ambitus culturales te immergere et fines tuos dilatare. Tamen si quaeras aliquem utrum libet quaerere tesseras porttitor, pro certo habeo responsum non tam positivum esse. Python vero in auxilium nobis venit.

Primum munus quod solvendum est in via creandi systema quaerendi informationes in tesseras aereas eliget idoneum tribunal e quo informationes accipiemus. Hoc problema solvendum non facile mihi fuit, sed in fine servitii Kayak elegi. Operas Momondo, Skyscanner, Expedia et paucis aliis temptavi, sed machinationes robotarum in his facultatibus impenetrabiles erant. Post aliquot conatus, per quos habui de luminibus commercii, transitus pedestres et birotas, persuadere conatus sum systemata me humanam, Kayak mihi maxime aptum esse decrevi, non obstante quod etiam si Nimia multae paginae onerentur. brevi tempore id quoque incipiunt. Rogationes facere potui ut automata mitterent ad locum interpositis 4 ad 6 horas, et omnia denique operata sunt. Interdum difficultates oriuntur cum operando cum Kayak, sed si te impedit incipiunt molestare, tum necesse est ut aut manually tractes et botones inde deducas, aut paucas horas moras et impedimenta cessare debes. Si opus est, facile codicem pro alio suggestu accommodare potes, quod si feceris, illud in commentarios referre potes.

Si modo incipias a radendo interretiali et nescis quare cum aliquo paginae certaminis cum eo, tunc antequam primum consilium in hac provincia incipias, tibi gratiam fac et Google inquisitionem fac verbis "textus radendo etiquette". . Experimenta tua citius desinere possunt quam cogitas si telam radendo imprudenter feceris.

questus Coepi

Hic generalis est perceptio eorum quae in textu rasorio codice nostro evenient:

  • Quaesitum bibliothecas importare.
  • Aperiens Google Chrome tab.
  • Munus voca quod automati incipit, praeteriens civitates et dies quae in quaerendo tesseras adhibebuntur.
  • Hoc munus accipit primos eventus investigationis, maxime digestos, et puga pyga ut plures proventus augeat.
  • Aliud munus ex tota pagina notitias colligit et in pectora data reddit.
  • Duo priores gradus fiunt per genera tesserae pretio (vili) et celeritate fugae utendo (celeriter).
  • Usor scripti mittitur inscriptionem continens summam tesserarum pretia (tesserae vilissimae et pretium mediocris), et tabulae datae cum indicibus a tribus indicibus memoratis digestae servatae sunt ut fasciculus Excell.
  • Omnes actiones praedictae post certum temporis spatium in cyclo peraguntur.

Notandum quod omne consilium Selenium ab exactore telae incipit. ego uti Chromedriver, Google Chrome laboro, sed aliae optiones sunt. PhantomJS et Firefox populares sunt. Post demptionem exactoris, necesse est eam in congruo folder ponere, et haec praeparationem ad usum suum perficit. Primae lineae nostrae scripti aperiunt novam Chrome tab.

Meminerint in fabula mea non conari aperire novos prospectus ad inveniendas magnas res in tesseras aereas. Modi quaerendi tales oblationes multo progressiores sunt. Libenter lectoribus offerre hanc materiam simplicem, sed practicam modo volumus ad solvendam hanc quaestionem.

Hic de codice supra egimus.

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)

In initio codicis videre potes imperia sarcina importare quae toto nostro consilio adhibentur. Ita, randint solebant facere automati "obdormire" pro temere numero secundorum antequam novam inquisitionis operationem. Solet hoc unum automati carere non potest. Si supra codicem curris, fenestra Chrome aperiet, qua autocinetus cum locis ad operandum utetur.

Paululum experimentum faciamus et kayak.com locum aperite in fenestra separata. Nos urbem eligemus ex qua fugimus, et urbem volumus accedere, tum fugae tempora. Cum dies eligens, fac spatium +-3 dierum adhibetur. Codicem attentis scripsi quid situs in responsione ad huiusmodi petitiones afferat. Si, exempli gratia, tesseras tantum ad statis temporibus quaerendas debes, magna probabilitas est quod codicem bot modificare debebis. Cum de codice loquor, explicationes congruas praebeo, sed si quid confusum sentis, sciam.

Nunc deprime bullam electronicam et vide nexum in talea inscriptionis. Similis sit nexui quo usus sum in exemplo infra ubi variabilis declaratur kayakqui domicilium reponit et modus adhibetur get web exactoris. Post conjunctionem investigationis clicking, proventus in pagina appareant.

Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter
Cum essem imperium get plus quam duo vel ter intra pauca minuta, quaesitum est ut verificationem compleam utens reCaptcha. Hanc repressionem manually transire potes et experimenta pergere donec systema novum conpescuit currere. Cum ego scripturam probavi, sicut primae sessionis inquisitionis semper blande videbatur, ita si cum codice experiri volueris, solum ad tempus manuale reprehendo et signum currere debeas, utendo longo intervallo inter sessiones quaesita. Et, si de eo cogitas, homo veri simile est informationem egere de pretiis tesserarum acceptis in 10-minutis intervallis inter operationes inquisitionis.

Operantes cum pagina utens XPath

Sic fenestram aperuimus et locum oneravimus. Ut Morbi cursus sapien et alia, eget technologia XPath vel CSS selectoribus uti. Statui XPath inhaerere nec necessitatem uti selectoribus CSS, sed satis est sic operari. Navigantes circa paginam utens XPath captiosae esse possunt et etiam si artificiis quas descripsimus uteris haec articulus, qui identificatores e pagina codicis describendo involvit, intellexi hoc esse, re vera, non meliorem viam ad elementa necessaria accedere. Viam, in haec Liber optimam descriptionem fundamentalum operandi cum paginis praebet selectoribus XPath et CSS. Hoc est quod ratiocinatio instrumenti interretialis respondentis similis est.

Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter
Itaque opus in bot pergamus. Utamur programmatis facultates ad tesseras vilissimas eligere. In sequenti imagine, selector XPath codice rubro illustratur. Ut codicem videas, debes de iure click in paginae elementi interesse et mandatum Inspice ex elencho apparente. Hoc mandatum vocari potest ad varias paginas elementa, quorum codicem in inspectoris codice exhibebitur et illustrabitur.

Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter
Videre paginam codicem

Ad confirmandam rationem meam de incommodis selectorum e codice describendi, sequentia nota attende.

Hoc est quod habes cum codicem effingis:

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

Ut aliquid tale effingas, debes de iure-click in sectione codicis quam interest, et Exemplar deligere > Exemplar XPath mandatum e menu quod apparet.

Ecce id quod definire solebam vilissima puga:

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

Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter
Exemplar Imperii> Exemplar XPath

Apparet, secunda optio multo simpliciorem spectat. Cum usus est, exquirit elementum quod habet attributum data-codeaequalis price. Quando prima optione utens, elementum inquiritur id quae = * wtKI-price_aTabet XPath ad elementum spectat /div[1]/div/div/div[1]/div/span/span. Interrogatio XPath huius modi ad paginam dolum faciet, sed semel tantum. Nunc possum dicere id pagina postero tempore onusta mutabit. Character sequence wtKI mutat dynamice quotiens pagina onusta est, ergo codicem, qui eo utitur, inutile erit post paginam proximam reload. Sume igitur aliquod tempus intellige XPath. Haec scientia tibi bene serviet.

Sed notandum est quod selectores XPath exscribere utiles esse possunt cum locis satis simplicibus laborantes, et si cum hoc commodo es, nihil mali est.

Nunc cogitemus quid faciendum sit si omnia inquisitionum proventus in pluribus lineis accipere debes, intra indicem. Simplex. Uterque enim intra genus est resultWrapper. Omnes eventus onerantes fieri possunt in ansa simili ei quod infra ostendetur.

Notandum est quod si praedicta intelligas, tunc facile debes intelligere potissimum codicem quem resolvere volumus. Cum hoc signum currit, accessimus ad id quod nobis opus est (re vera, elementum in quo effectus involvitur) utendo quodam genere mechanismi -specificationis (XPath). Hoc fit ut textum elementi accipias et illud in obiecto pones ex quo notitia legi potest (primo usus est flight_containers, deinde - flights_list).

Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter
Tres primae lineae ostenduntur et omnia quae opus sunt nobis clare videre possumus. Sed plus interesting nos habere vias adipiscendi informationes. Notitia ex singulis elementis separatim accipere debemus.

I et labora!

Facillima via ad munus scribere est eventus augere additos, ut ibi incipiemus. Numerum volatum augere velim quem progressio informationes accipit sine suspicionibus in servitium quod inspectionem ducit, sic strepo oneris plurium proventus epheborum semel quoties pagina monstratur. In hoc codice operam dare debetis ad scandalum tryquod addidi, quod interdum proprie puga non oneret. Si hoc etiam occurras, ad hoc munus explanare vocat in codice functionis start_kayakquas infra videbimus.

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

Nunc post longam huius functionis analysin (quandoque abripi possum) parati sumus declarare munus quod paginam radet.

Pleraque iam collegimus ea quae in sequenti functione dicta sunt page_scrape. Aliquando notitia semita reddita componitur, ut simplici methodo utar ad eam separandam. Exempli gratia, cum primum variabilibus utor section_a_list и section_b_list. Munus nostrum refert data artus flights_df, hoc nobis permittit ut eventus ex diversis notitiis sortibus modos distinctos dividere ac postea coniungere valeamus.

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

Variabiles nominare conatus sum ut signum comprehensibile esset. Memento quod variabiles incipiens cum a sunt primi gradus semitae b — Ad secundum. Ad munus proximum transeamus.

Support machinationes

Nunc habemus munus quod sinit nos proventus investigationum additorum onerare et munus ad illos eventus processum. Articulus hic hic finiri potuit, cum hae duae functiones omnia praebere debes ad paginas rade quas te aperire potes. Sed quaedam machinationes auxiliares supra tractatas nondum perspeximus. Exempli gratia, hoc est signum ad electronicas mittendas et nonnulla alia. Haec omnia in officio reperiri possunt start_kayakquas nunc videbimus.

Hoc munus informationes de civitatibus ac temporibus requirit. Haec notitia utens, nexum format in variabili kayakquae adhibetur ut te ad paginam capiat quae inquisitionum proventus optimos eorum quaestioni congruentes continebit. Post primam sessionem rasuram, pretia in mensa in summa pagina operabimur. Nempe tesseram minimam ac pretium mediocrem reperiemus. Haec omnia, una cum praenuntiatione a situ edita, electronico mittentur. In pagina, mensa respondens in angulo sinistro superiore debet esse. Hanc tabulam obiter operari, errori causare potest, cum dies exactos quaerens utens, cum mensa hoc casu in pagina non monstratur.

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

Hoc scriptum temptavi utens ratione Outlook (hotmail.com). Non probavi ut cum ratione Gmail bene operaretur, haec ratio electronica admodum popularis est, sed multae optiones possibilia sunt. Si ratione Hotmail uteris, tum ut omnia ad operandum habeas, tantum opus est tibi ut in codicem tuam ineas.

Si vis cognoscere quidnam in certis sectionibus codicis ad hoc munus agatur, eas exscribere et cum illis experiri potes. Expertus cum codice solus modus est ad veritatem intelligendam.

Promptus ratio

Nunc omnia quae diximus de fecimus, ansam simplicem creare possumus quae munera nostra vocat. Scriptum postulata data ab usore de civitatibus et temporibus. Cum probatio assidue scriptionis sileo, abhorret ab omni tempore ad hanc datam ingrediendam, ut lineae debitae, pro tempore probationis, in commentatione inferiores, in quibus notitia necessaria est, explanari potest. scriptum est 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.....')

Hoc est quod spectat sicut probatio scriptoris currere.
Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter
Test run scriptor

results

Si hoc longe fecisti, gratulatio! Nunc opus est tibi rasorio telam, etsi multis modis iam videre possum eam emendare. Exempli gratia, cum Twilio coniungi potest ut epistulas textus emittat loco electronicarum. Potes uti VPN vel aliquo alio ut simul ex pluribus servientibus eventum recipere possit. Est etiam quaestio periodice orta cum reprehendo locum utentis ad videndum si homo est, sed haec quaestio etiam solvi potest. Certe, nunc turpem habes, ut dilatare possis si vis. Exempli causa, fac ut Praecedo fasciculus usori mittatur sicut inscriptionem electronicam ad affectum.

Python - adiutor in inveniendo viles tesseras aeris illis qui amant iter

Tantum usores descripserunt in aliquet participare possunt. InscribeTe gratissimum esse.

Uteris textus technologiae rasurae?

  • Yes

  • No

8 utentes censuerunt. 1 Insere abstinuisse.

Source: www.habr.com

Add a comment