Python adalah asisten dalam mencari penerbangan murah bagi mereka yang suka bepergian

Penulis artikel, terjemahan yang kami terbitkan hari ini, mengatakan bahwa tujuannya adalah untuk berbicara tentang mengembangkan scraper web Python menggunakan Selenium, yang mencari harga tiket pesawat. Saat mencari tiket, tanggal fleksibel digunakan (+ - 3 hari relatif terhadap tanggal yang ditentukan). Scraper menyimpan hasil pencarian dalam file Excel dan mengirim ke orang yang meluncurkannya email dengan informasi umum tentang apa yang berhasil ia temukan. Tujuan dari proyek ini adalah untuk membantu wisatawan menemukan penawaran terbaik.



Jika Anda, ketika berhadapan dengan materi, merasa bahwa Anda tersesat - lihat artikel ini .

Apa yang kita cari


Anda bebas menggunakan sistem yang dijelaskan di sini seperti yang Anda inginkan. Misalnya, saya menggunakannya untuk mencari tur akhir pekan dan tiket ke kota asal saya. Jika Anda serius menemukan tiket yang menguntungkan, Anda dapat menjalankan skrip di server (server sederhana, untuk 130 rubel sebulan, sangat cocok untuk ini) dan membuatnya berjalan sekali atau dua kali sehari. Hasil pencarian akan diemailkan kepada Anda. Selain itu, saya sarankan Anda mengkonfigurasi semuanya sehingga skrip menyimpan file Excel dengan hasil pencarian di folder Dropbox, yang memungkinkan Anda untuk melihat file seperti itu dari mana saja dan kapan saja.


Saya belum menemukan tarif dengan kesalahan, tapi saya percaya ini mungkin

Saat mencari, seperti yang telah dikatakan, "tanggal fleksibel" digunakan, skrip menemukan penawaran yang berada dalam tiga hari dari tanggal yang diberikan. Meskipun ketika memulai skrip, ia mencari penawaran hanya dalam satu arah, mudah untuk memperbaikinya sehingga dapat mengumpulkan data di beberapa arah penerbangan. Dengan bantuannya, Anda bahkan dapat mencari tarif yang salah, penemuan semacam itu bisa sangat menarik.

Mengapa saya perlu pengikis web lain?


Ketika saya pertama kali mulai menggores web, sejujurnya, itu tidak terlalu menarik. Saya ingin melakukan lebih banyak proyek di bidang pemodelan prediktif, analisis keuangan, dan, mungkin, di bidang analisis pewarnaan emosional teks. Tapi ternyata itu sangat menarik - untuk mencari cara membuat program yang mengumpulkan data dari situs web. Ketika saya mempelajari topik ini, saya menyadari bahwa pengikisan web adalah "mesin" Internet.

Anda dapat memutuskan bahwa ini adalah pernyataan yang terlalu berani. Tetapi pikirkan tentang bagaimana Google memulai dengan scraper web yang Larry Page buat menggunakan Java dan Python. Googlebots telah meneliti dan menjelajahi Internet, mencoba memberikan jawaban terbaik kepada pengguna mereka untuk pertanyaan mereka. Scraping web memiliki jumlah aplikasi yang tak terbatas, dan bahkan jika Anda, di bidang Ilmu Data, tertarik pada sesuatu yang lain, maka untuk mendapatkan data untuk dianalisis, Anda akan memerlukan beberapa keterampilan scraping.

Beberapa trik yang digunakan di sini saya temukan dalam buku yang bagus tentang pengikisan web, yang baru-baru ini saya peroleh. Di dalamnya Anda dapat menemukan banyak contoh dan ide sederhana tentang aplikasi praktis yang dipelajari. Selain itu, ada bab yang sangat menarik tentang uji bypass reCaptcha. Bagi saya, ini adalah berita, karena saya tidak tahu bahwa ada alat khusus dan bahkan seluruh layanan untuk menyelesaikan masalah seperti itu.

Apakah Anda suka bepergian ?!


Terhadap pertanyaan sederhana dan agak tidak berbahaya yang diajukan dalam judul bagian ini, orang sering dapat mendengar jawaban positif, diberikan beberapa kisah perjalanan dari orang yang kepadanya ia ditanyai. Sebagian besar dari kita akan setuju bahwa bepergian adalah cara yang bagus untuk menyelam ke lingkungan budaya baru dan memperluas wawasan kita. Namun, jika Anda bertanya kepada seseorang tentang apakah dia suka mencari tiket pesawat, saya yakin jawabannya tidak jauh dari positif. Sebagai soal fakta, di sini Python datang untuk menyelamatkan.

Tugas pertama yang perlu kita selesaikan dalam cara menciptakan sistem pencarian informasi tentang tiket pesawat adalah pemilihan platform yang sesuai dengan mana kita akan mengambil informasi. Solusi untuk masalah ini tidak mudah bagi saya, tetapi pada akhirnya saya memilih layanan Kayak. Saya mencoba layanan Momondo, Skyscanner, Expedia, dan lainnya, tetapi mekanisme perlindungan terhadap robot pada sumber daya ini tidak bisa ditembus. Setelah beberapa upaya, di mana, dalam upaya meyakinkan sistem bahwa saya adalah manusia, saya harus berurusan dengan lampu lalu lintas, penyeberangan pejalan kaki dan sepeda, saya memutuskan bahwa Kayak cocok untuk saya yang terbaik, meskipun di sini juga, jika memuat terlalu banyak halaman dalam waktu singkat, cek juga dimulai. Saya berhasil membuat bot mengirim permintaan ke situs dengan interval 4 hingga 6 jam, dan semuanya bekerja dengan baik. Kesulitan timbul dari waktu ke waktu ketika bekerja dengan Kayak, tetapi jika Anda mulai terganggu oleh cek, maka Anda perlu mengatasinya secara manual, lalu mulai bot, atau tunggu beberapa jam, dan cek harus berhenti. Jika perlu, Anda dapat dengan baik mengadaptasi kode untuk platform lain, dan jika Anda melakukannya, Anda dapat melaporkannya di komentar.

Jika Anda baru memulai dengan pengikisan web, dan tidak tahu mengapa beberapa situs web kesulitan melakukannya, maka sebelum Anda memulai proyek pertama Anda di area ini, bantulah diri Anda sendiri dan cari kata-kata Google "Etiket kikisan web". Eksperimen Anda mungkin berakhir lebih cepat daripada yang Anda pikirkan jika Anda terlibat dalam pengikisan web secara tidak masuk akal.

Memulai


Berikut ini adalah gambaran umum tentang apa yang akan terjadi dalam kode scraper web kami:

  • Impor perpustakaan yang diperlukan.
  • Buka tab Google Chrome.
  • Memanggil fungsi yang meluncurkan bot, melewatinya kota dan tanggal, yang akan digunakan saat mencari tiket.
  • Fungsi ini menerima hasil pencarian pertama, diurutkan berdasarkan kriteria yang paling menarik (terbaik), dan menekan tombol untuk memuat hasil tambahan.
  • Fungsi lain mengumpulkan data dari seluruh halaman dan mengembalikan bingkai data.
  • Dua langkah sebelumnya dilakukan dengan menggunakan tipe sortir berdasarkan harga tiket (murah) dan menurut kecepatan penerbangan (tercepat).
  • Email dikirim ke pengguna skrip yang berisi ringkasan singkat harga tiket (tiket termurah dan harga rata-rata), dan kerangka data dengan informasi yang diurutkan berdasarkan tiga indikator tersebut disimpan sebagai file Excel.
  • Semua tindakan di atas dilakukan dalam satu siklus setelah periode waktu tertentu.

Perlu dicatat bahwa setiap proyek Selenium dimulai dengan driver web. Saya menggunakan Chromedriver , bekerja dengan Google Chrome, tetapi ada opsi lain. Yang juga populer adalah PhantomJS dan Firefox. Setelah memuat driver, Anda harus meletakkannya di folder yang sesuai, ini melengkapi persiapan untuk penggunaannya. Baris pertama skrip kami membuka tab Chrome baru.

Ingatlah bahwa, dalam cerita saya, saya tidak mencoba membuka cakrawala baru untuk menemukan penawaran menguntungkan pada tiket pesawat. Ada banyak teknik yang lebih canggih untuk menemukan penawaran seperti itu. Saya hanya ingin menawarkan kepada pembaca materi ini cara sederhana namun praktis untuk menyelesaikan masalah ini.

Ini kode yang kita bicarakan di atas.

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) 

Di awal kode, Anda dapat melihat perintah impor paket yang digunakan di seluruh proyek kami. Jadi, randint digunakan sehingga bot akan "tertidur" selama beberapa detik secara acak sebelum memulai operasi pencarian baru. Biasanya tidak satu bot bisa melakukannya tanpa itu. Jika Anda menjalankan kode di atas, jendela Chrome akan terbuka, yang akan digunakan bot untuk bekerja dengan situs.

Mari kita lakukan percobaan kecil dan buka situs web kayak.com di jendela terpisah. Pilih kota dari mana kami akan terbang, dan kota yang ingin kami tuju, serta tanggal penerbangan. Saat memilih tanggal, kami akan memverifikasi bahwa rentangnya + -3 hari. Saya menulis kode dengan mempertimbangkan apa yang dihasilkan situs dalam menanggapi permintaan tersebut. Jika, misalnya, Anda perlu mencari tiket hanya untuk tanggal tertentu, maka sangat mungkin Anda harus memodifikasi kode bot. Berbicara tentang kode, saya membuat penjelasan yang tepat, tetapi jika Anda merasa bahwa Anda bingung - beri tahu saya.

Sekarang klik tombol mulai pencarian dan lihat tautan di bilah alamat. Seharusnya terlihat seperti tautan yang saya gunakan dalam contoh di bawah ini, di mana variabel kayak yang menyimpan URL dinyatakan, dan metode get driver web digunakan. Setelah mengklik tombol pencarian, hasilnya akan muncul di halaman.


Ketika saya menggunakan perintah get lebih dari dua hingga tiga kali dalam beberapa menit, saya diminta untuk lulus tes menggunakan reCaptcha. Anda dapat melalui pemeriksaan ini secara manual dan melanjutkan percobaan sampai sistem memutuskan untuk mengatur pemeriksaan baru. Ketika saya menguji skrip, saya merasa bahwa sesi pencarian pertama selalu berjalan tanpa masalah, jadi jika Anda ingin bereksperimen dengan kode, Anda hanya perlu memeriksanya secara manual dan membiarkan kode untuk dieksekusi menggunakan interval panjang antara sesi pencarian. Ya, dan jika Anda memikirkannya, seseorang tidak mungkin memerlukan informasi tentang harga tiket yang diterima pada interval 10 menit antara operasi pencarian.

Bekerja dengan halaman menggunakan XPath


Jadi, kami membuka jendela dan memuat situs. Untuk mendapatkan harga dan informasi lainnya, kita perlu menggunakan teknologi XPath atau penyeleksi CSS. Saya memutuskan untuk memikirkan XPath dan tidak merasa perlu menggunakan penyeleksi CSS, tetapi sangat mungkin untuk bekerja seperti itu. Bergerak di sekitar halaman menggunakan XPath bisa menjadi tugas yang menakutkan, dan bahkan jika Anda menggunakan metode yang saya jelaskan dalam artikel ini , yang menggunakan menyalin pengidentifikasi yang sesuai dari kode halaman, saya menyadari bahwa ini, pada kenyataannya, bukan cara terbaik untuk mengakses elemen yang diperlukan. Ngomong-ngomong, dalam buku ini Anda dapat menemukan deskripsi yang sangat baik tentang dasar-dasar bekerja dengan halaman menggunakan pemilih XPath dan CSS. Inilah yang tampak seperti metode driver web yang sesuai.


Jadi, kami terus bekerja pada bot. Manfaatkan program ini untuk memilih tiket termurah. Pada gambar berikut, kode pemilih XPath disorot dengan warna merah. Untuk melihat kode, Anda perlu mengklik kanan pada elemen halaman yang Anda minati dan pilih perintah Inspect di menu yang muncul. Perintah ini dapat dipanggil untuk elemen halaman yang berbeda, kode yang akan ditampilkan dan disorot di jendela tampilan kode.


Lihat Kode Halaman

Untuk mendapatkan konfirmasi atas alasan saya tentang kelemahan menyalin pemilih dari kode, perhatikan fitur-fitur berikut.

Inilah yang Anda dapatkan saat menyalin kode:

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

Untuk menyalin sesuatu yang serupa, Anda perlu mengklik kanan pada bagian kode yang Anda minati dan pilih Salin> Salin XPath dari menu yang muncul.

Inilah yang saya gunakan untuk mendefinisikan tombol termurah:

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


Salin> Salin Perintah XPath

Cukup jelas bahwa opsi kedua terlihat jauh lebih sederhana. Saat menggunakannya, ia mencari elemen a, yang memiliki atribut data-code sama dengan price . Menggunakan opsi pertama, elemen id dicari yaitu wtKI-price_aTab , dan path XPath ke elemen tersebut terlihat seperti /div[1]/div/div/div[1]/div/span/span . Permintaan XPath yang mirip dengan halaman akan melakukan trik, tetapi hanya sekali. Saya dapat mengatakan sekarang bahwa id akan berubah pada saat halaman dibuka. wtKI karakter wtKI berubah secara dinamis setiap kali halaman dibuka, sebagai hasilnya, kode yang digunakan akan tidak berguna setelah halaman berikutnya dimuat ulang. Jadi luangkan waktu untuk mencari tahu XPath. Pengetahuan ini akan membantu Anda dengan baik.

Namun, perlu dicatat bahwa menyalin pemilih XPath dapat berguna ketika bekerja dengan situs yang cukup sederhana, dan jika ini cocok untuk Anda, tidak ada yang salah dengan itu.

Sekarang mari kita pikirkan apa yang harus dilakukan jika Anda perlu mendapatkan semua hasil pencarian dalam beberapa baris, di dalam daftar. Sangat sederhana. Setiap hasil berada di dalam objek dengan kelas resultWrapper . Mengunduh semua hasil dapat dilakukan dalam satu lingkaran yang menyerupai yang ditunjukkan di bawah ini.

Perlu dicatat bahwa jika Anda memahami hal di atas, maka Anda harus dengan mudah memahami sebagian besar kode yang akan kami uraikan. Dalam perjalanan pekerjaan kode ini, kita beralih ke apa yang kita butuhkan (pada kenyataannya, ini adalah elemen di mana hasilnya dibungkus) menggunakan beberapa mekanisme untuk menunjukkan path (XPath). Ini dilakukan untuk mendapatkan teks elemen dan menempatkannya di objek dari mana data dapat dibaca (pertama gunakan flight_containers , kemudian flights_list ).


Tiga baris pertama ditampilkan dan kita dapat dengan jelas melihat semua yang kita butuhkan. Namun, kami memiliki cara yang lebih menarik untuk mendapatkan informasi. Kita perlu mengambil data dari setiap elemen secara terpisah.

Untuk bekerja!


Paling mudah menulis fungsi untuk memuat hasil tambahan, jadi mari kita mulai dengan itu. Saya ingin memaksimalkan jumlah penerbangan yang menerima informasi tentang program, dan pada saat yang sama tidak menimbulkan kecurigaan dalam layanan yang mengarah ke verifikasi, jadi saya klik tombol Muat lebih banyak hasil sekali setiap kali halaman ditampilkan. Dalam kode ini, Anda harus memperhatikan blok try , yang saya tambahkan karena kadang-kadang tombol tidak memuat secara normal. Jika Anda juga menjumpai ini, beri komentar panggilan ke fungsi ini dalam kode fungsi start_kayak , yang akan kita bahas di bawah ini.

 #      ,      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 

Sekarang, setelah analisis panjang fungsi ini (kadang-kadang saya bisa terbawa), kami siap untuk mendeklarasikan fungsi yang akan menangani pengikisan halaman.

Saya telah mengumpulkan sebagian besar dari apa yang dibutuhkan dalam fungsi selanjutnya yang disebut page_scrape . Kadang-kadang data yang dikembalikan tentang tahapan jalan ternyata digabungkan, untuk pemisahan mereka saya menggunakan metode sederhana. Sebagai contoh, pertama kali saya menggunakan variabel section_a_list dan section_b_list . Fungsi kami mengembalikan frame data flights_df , ini memungkinkan kami untuk memisahkan hasil yang diperoleh dengan menggunakan metode penyortiran data yang berbeda, dan kemudian menggabungkannya.

 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 

Saya mencoba memberi nama variabel sehingga kode akan menjadi jelas. Ingat bahwa variabel yang dimulai dengan merujuk pada langkah pertama dari path, dan b ke yang kedua. Pergi ke fungsi berikutnya.

Mekanisme bantu


Sekarang kami memiliki fungsi yang memungkinkan Anda memuat hasil pencarian tambahan dan fungsi untuk memproses hasil ini. Artikel ini dapat diselesaikan pada ini, karena dua fungsi ini menyediakan semua yang diperlukan untuk memo halaman yang dapat dibuka secara mandiri. Tetapi kami belum mempertimbangkan beberapa mekanisme tambahan yang dibahas di atas. Sebagai contoh, ini adalah kode untuk mengirim email dan beberapa hal lainnya. Semua ini dapat ditemukan di fungsi start_kayak , yang sekarang kita pertimbangkan.

Untuk menggunakan fungsi ini, Anda memerlukan informasi tentang kota dan tanggal. Dengan menggunakan informasi ini, ia membentuk tautan dalam variabel kayak , yang digunakan untuk membuka halaman yang akan berisi hasil pencarian yang diurutkan berdasarkan kecocokan terbaik mereka. Setelah sesi pengikisan pertama, kami akan bekerja dengan harga pada tabel di bagian atas halaman. Yaitu, kami menemukan harga tiket minimum dan harga rata-rata. Semua ini, bersama dengan prediksi yang dikeluarkan oleh situs, akan dikirim melalui email. Di halaman, tabel yang sesuai harus di sudut kiri atas. Mengatasi tabel ini, dapat menyebabkan kesalahan saat mencari menggunakan tanggal yang tepat, karena dalam kasus ini tabel tidak ditampilkan pada halaman.

 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 = 'YOUREMAIL@hotmail.com'   password = 'YOUR PASSWORD'   server = smtplib.SMTP('smtp.outlook.com', 587)   server.ehlo()   server.starttls()   server.login(username, password)   msg = ('Subject: Flight Scraper\n\n\ Cheapest Flight: {}\nAverage Price: {}\n\nRecommendation: {}\n\nEnd of message'.format(matrix_min, matrix_avg, (loading+'\n'+prediction)))   message = MIMEMultipart()   message['From'] = 'YOUREMAIL@hotmail.com'   message['to'] = 'YOUROTHEREMAIL@domain.com'   server.sendmail('YOUREMAIL@hotmail.com', 'YOUROTHEREMAIL@domain.com', msg)   print('sent email.....') 

Saya menguji skrip ini menggunakan akun Outlook (hotmail.com). Saya tidak memeriksanya untuk operasi yang benar dari akun Gmail, sistem surat ini sangat populer, tetapi ada banyak opsi yang memungkinkan. Jika Anda menggunakan akun Hotmail, maka agar semuanya berfungsi, Anda hanya perlu memasukkan data Anda dalam kode.

Jika Anda ingin memahami apa yang sebenarnya dilakukan di bagian terpisah dari kode fungsi ini, Anda dapat menyalinnya dan bereksperimen dengannya. Eksperimen kode adalah satu-satunya cara untuk memahaminya.

Sistem siap


Sekarang semua yang kita bicarakan sudah selesai, kita dapat membuat loop sederhana di mana fungsi kita dipanggil. Skrip meminta pengguna untuk data tentang kota dan tanggal. Saat menguji dengan restart skrip yang konstan, Anda tidak mungkin ingin memasukkan data ini secara manual setiap kali, sehingga baris yang sesuai, selama durasi pengujian, dapat dikomentari dengan menghapus komentar orang-orang di bawahnya di mana data yang diperlukan untuk skrip dikode dengan keras.

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

Ini adalah uji coba skrip.

Script uji coba

Ringkasan


Jika Anda sampai pada titik ini - selamat! Sekarang Anda memiliki scraper web yang berfungsi, meskipun saya sudah melihat banyak cara untuk memperbaikinya. Misalnya, dapat diintegrasikan dengan Twilio sehingga, alih-alih email, ia mengirim pesan teks. Anda dapat menggunakan VPN atau yang lainnya untuk secara bersamaan menerima hasil dari beberapa server. Ada juga masalah berulang dengan memeriksa pengguna situs apakah dia orang, tetapi masalah ini juga bisa diselesaikan. Bagaimanapun, sekarang Anda memiliki basis yang dapat Anda kembangkan jika diinginkan. Misalnya, untuk memastikan bahwa file Excel dikirim kepada pengguna sebagai lampiran email.

Source: https://habr.com/ru/post/id451872/


All Articles