
Saya sangat suka opera dan balet, tetapi tidak benar-benar - memberikan banyak uang untuk tiket. Tampilan harian situs web teater dengan tusukan di setiap tombol sangat melelahkan, dan tiket 170 rubel untuk kereta super yang tiba-tiba muncul sangat memilukan.
Untuk mengotomatiskan bisnis ini, muncul skrip yang berjalan di poster dan mengumpulkan informasi tentang tiket termurah untuk bulan yang dipilih. Permintaan dari seri "mengeluarkan daftar semua opera pada bulan Maret di panggung lama dan baru hingga 1000 rubel." Seorang teman terjatuh “apakah kamu tidak melakukan bot Telegram?” Ini tidak ada dalam rencana, tetapi mengapa tidak. Bot lahir, meskipun berputar di laptop rumah.
Kemudian Telegram diblokir. Gagasan untuk mendorong bot ke server yang bekerja telah hilang, dan minat untuk membawa fungsionalitas ke pikiran telah memudar. Di bawah potongan, saya berbicara tentang nasib seorang detektif tiket murah dari awal dan apa yang terjadi padanya setelah satu tahun digunakan.
1. Asal usul ide dan pernyataan masalah
Dalam produksi awal, keseluruhan cerita memiliki satu tugas - untuk membuat daftar pertunjukan, disaring berdasarkan harga, untuk menghemat waktu dalam melihat secara manual setiap kinerja poster secara individual. Satu-satunya teater yang posternya menarik adalah dan tetap Mariinsky. Pengalaman pribadi dengan cepat menunjukkan bahwa "galeri" anggaran dibuka pada hari-hari acak untuk pertunjukan acak, dan dibeli dengan cukup cepat (jika staf berdiri). Agar tidak ketinggalan apa pun, seorang pengumpul otomatis diperlukan.
Jenis poster dengan tombol yang harus Anda navigasikan secara manual Saya ingin mendapatkan serangkaian pertunjukan menarik untuk menjalankan naskah. Kriteria utama, seperti telah disebutkan, adalah harga tiket.
API situs dan sistem tiket tidak tersedia untuk umum, sehingga keputusan dibuat (tanpa basa-basi lagi) untuk mem-parsing halaman HTML, mengeluarkan tag yang diperlukan. Buka yang utama, tekan F12 dan pelajari strukturnya. Itu terlihat memadai, sehingga semuanya dengan cepat mencapai implementasi pertama.
Jelas bahwa pendekatan ini tidak skala ke situs lain dengan poster dan akan hancur jika mereka memutuskan untuk mengubah struktur saat ini. Jika pembaca memiliki ide tentang cara membuatnya lebih stabil tanpa API, tulis di komentar.
2. Implementasi pertama. Fungsionalitas minimum
Saya datang dengan implementasi dengan pengalaman dengan Python hanya untuk menyelesaikan tugas yang berkaitan dengan pembelajaran mesin. Dan tidak ada pemahaman mendalam tentang html dan arsitektur web (dan itu tidak muncul). Karena itu, semuanya dilakukan sesuai dengan prinsip "ke mana aku pergi, aku tahu, tetapi sekarang kita akan menemukan cara untuk pergi"
Untuk draft pertama, butuh 4 jam malam dan pengantar untuk permintaan dan modul Beautiful Soup 4 (bukan tanpa bantuan
artikel yang bagus, terima kasih kepada penulis). Untuk menyelesaikan sketsa - hari libur lain. Saya tidak sepenuhnya yakin bahwa modul adalah yang paling optimal di segmen mereka, tetapi mereka telah menutup kebutuhan mereka saat ini. Inilah yang terjadi pada tahap pertama.
Informasi apa dan di mana menariknya dapat dipahami oleh struktur situs. Pertama-tama, kami mengumpulkan alamat pengiriman yang ada di poster untuk bulan yang dipilih.
Struktur halaman poster di browser, semuanya disorot dengan mudah Dari halaman html, kita perlu membaca URL murni, lalu menjelajahinya dan melihat label harganya. Beginilah daftar tautan disusun.
import requests import numpy as np from bs4 import BeautifulSoup def get_text(url):
Setelah mempelajari struktur halaman dengan pembelian tiket, selain ambang harga, saya memutuskan untuk memberikan kesempatan kepada pengguna untuk juga memilih:
- jenis pertunjukan (1-opera, 2-balet, 3-konser, 4-kuliah)
- venue (panggung 1-tua, panggung 2-baru, aula 3-konser, aula 4-kamar)
Informasi dimasukkan melalui konsol dalam format numerik, beberapa angka dapat dipilih. Variabilitas seperti itu ditentukan oleh perbedaan harga opera dan balet (opera lebih murah) dan keinginan untuk melihat daftar mereka secara terpisah.
Hasilnya adalah
4 pertanyaan dan 4 filter data - bulan, ambang harga, jenis, lokasi.
Selanjutnya, kita pergi melalui semua tautan yang diterima. Kami membuat get_text dan mencari harga yang lebih murah, dan juga mengeluarkan informasi terkait. Karena Anda harus melihat ke setiap URL dan mengonversinya menjadi teks, runtime program tidak instan. Akan menyenangkan untuk mengoptimalkan, tetapi saya tidak memikirkan caranya.
Saya tidak akan mengutip kode itu sendiri, itu akan agak lama, tetapi semuanya benar di sana secara memadai dan “secara intuitif” dengan Beautiful Soup 4.
Jika harga kurang dari yang dinyatakan oleh pengguna dan jenis tempat sesuai dengan set, maka pesan tentang kinerja ditampilkan di konsol. Ada opsi lain untuk menyimpan semua ini dalam .xls, tetapi tidak berakar. Lebih nyaman untuk melihat di konsol dan langsung mengikuti tautan daripada menusuk ke dalam file.

Sekitar 150 baris kode keluar. Dalam versi ini, dengan fungsi minimum yang dijelaskan, skrip lebih hidup daripada semua yang hidup dan berjalan secara teratur dengan jangka waktu beberapa hari. Semua modifikasi lain tidak selesai (penusuk telah mati) dan karena itu tidak aktif, atau tidak ada fungsi yang lebih menguntungkan.
3. Perpanjangan fungsi
Pada tahap kedua, saya memutuskan untuk melacak perubahan harga, menyimpan tautan ke pertunjukan yang menarik di file terpisah (lebih tepatnya, URL untuk mereka). Pertama-tama, ini relevan untuk balet - mereka sangat jarang sangat murah dan tidak akan masuk dalam masalah anggaran umum. Tetapi dari 5 ribu menjadi 2x penurunannya signifikan, terutama jika kinerjanya dengan pemain bintang, dan saya ingin melacaknya.
Untuk melakukan ini, pertama-tama Anda harus menambahkan URL untuk pelacakan, dan kemudian secara berkala "kocok" dan bandingkan harga baru dengan yang lama.
def add_new_URL(user_id,perf_url):
Pembaruan harga diluncurkan pada awal skrip utama, tidak dilakukan secara terpisah. Mungkin tidak seanggun yang kita inginkan, tapi itu menyelesaikan masalahnya. Jadi fungsi tambahan kedua adalah memantau penurunan harga untuk kinerja yang menarik.
Kemudian bot Telegram lahir, tidak begitu mudah, cepat, ceria, tetapi masih terlahir. Agar tidak menyatukan semuanya, cerita tentang dia (serta tentang ide-ide yang belum direalisasi dan upaya untuk melakukan ini dengan situs web Teater Bolshoi) akan berada di bagian kedua artikel.
HASIL: ide itu berhasil, pengguna puas. Butuh beberapa akhir pekan untuk mengetahui cara berinteraksi dengan halaman html. Untungnya, Python adalah bahasa yang hampir semuanya dan modul yang siap pakai membantu menggerakkan kuku tanpa memikirkan fisika palu.
Saya berharap case ini akan bermanfaat bagi Habrachians dan, mungkin, itu akan bekerja seperti Pendel ajaib untuk akhirnya membuat Wishlist yang duduk di kepalaku untuk waktu yang lama.
UPD: Melanjutkan Kisah - Bagian 2