Python untuk Pemula: Cara Memerintah Web

Perjalanan menuju otomatisasi web sederhana



gambar


Masalah: Menyerahkan pekerjaan rumah memerlukan navigasi labirin halaman web yang begitu rumit sehingga saya telah mengirimkan tugas ke tempat yang salah beberapa kali. Selain itu, meskipun proses ini hanya memakan waktu 1-2 menit, kadang-kadang tampaknya seperti hambatan yang tidak dapat diatasi (misalnya, ketika saya menyelesaikan tugas terlalu larut malam dan sulit mengingat kata sandi saya).



Solusi: Gunakan Python untuk mengirimkan tugas yang diselesaikan secara otomatis! Idealnya, saya bisa menyimpan tugas, mengetik beberapa tombol, dan memuat pekerjaan saya dalam hitungan detik. Kedengarannya terlalu bagus untuk menjadi kenyataan pada awalnya, tetapi kemudian saya menemukan Selenium, alat yang dapat digunakan dengan Python untuk menavigasi web.



gambar


Setiap kali kami mengulangi tindakan menjemukan di Internet dengan urutan langkah yang sama, ini adalah peluang besar untuk menulis sebuah program untuk mengotomatiskan prosesnya. Dengan Selenium dan Python, kita hanya perlu menulis skrip sekali, dan kemudian kita dapat menjalankannya sebanyak yang kita inginkan dan menyelamatkan diri dari pengulangan tugas berulang (dan dalam kasus saya, tidak mungkin untuk mengirim pekerjaan ke tempat yang salah)!



Di sini, saya akan membahas solusi yang saya kembangkan untuk secara otomatis (dan dengan benar) mengirimkan tugas saya. Sepanjang jalan, kita akan membahas dasar-dasar penggunaan Python dan selenium untuk kontrol web terprogram. Meskipun program ini berfungsi (saya menggunakannya setiap hari!), Ini cukup individual, sehingga Anda tidak akan dapat menyalin dan menempelkan kode untuk aplikasi Anda. Namun, metode umum di sini dapat diterapkan pada situasi yang tidak terbatas. (Jika Anda ingin melihat kode lengkap, itu tersedia di GitHub ).



Pendekatan



Sebelum kita masuk ke bagian otomatisasi yang menyenangkan, kita perlu mengetahui struktur keseluruhan dari solusi kita. Memulai coding tanpa rencana adalah cara yang bagus untuk membuang waktu dan frustrasi. Saya ingin menulis sebuah program untuk mengirim tugas kelas yang telah selesai ke tempat yang tepat di Canvas ( "sistem manajemen pembelajaran" universitas saya). Pertama, saya perlu cara untuk memberitahu program nama pekerjaan yang harus disampaikan dan kelas. Saya mengambil pendekatan sederhana dan membuat folder untuk menyimpan tugas yang diselesaikan dengan folder anak untuk setiap kelas. Di folder anak, saya meletakkan dokumen yang sudah selesai dinamai untuk pekerjaan tertentu. Program ini dapat mengetahui nama kelas berdasarkan folder dan nama tugas berdasarkan nama dokumen.

Berikut adalah contoh di mana nama kelasnya adalah EECS491 dan tugasnya adalah Tugas 3 - Output dalam model grafik besar. "



gambar



Struktur file (kiri) dan Penugasan Lengkap (kanan).



Bagian pertama dari program ini adalah loop yang loop melalui folder untuk menemukan pekerjaan dan kelas yang kita simpan dalam tuple Python:



# os for file management
import os
# Build tuple of (class, file) to turn in
submission_dir = 'completed_assignments'
dir_list = list(os.listdir(submission_dir))
for directory in dir_list:
    file_list = list(os.listdir(os.path.join(submission_dir, 
directory)))
    if len(file_list) != 0:
        file_tup = (directory, file_list[0])
    
print(file_tup)


('EECS491', 'Penugasan 3 - Inferensi dalam Model Grafis Besar.txt')



Ini menangani manajemen file dan sekarang program mengetahui kelas dan tugas yang akan dimasukkan. Langkah selanjutnya adalah menggunakan Selenium untuk menavigasi ke halaman web yang benar dan memuat pekerjaan.



Kontrol Web dengan Selenium



Untuk memulai dengan Selenium, kami mengimpor perpustakaan dan membuat driver web, yang merupakan browser yang dikendalikan oleh program kami. Dalam hal ini, saya akan menggunakan Chrome sebagai browser saya dan memposting driver ke situs web Canvas tempat saya mengirimkan pekerjaan.



import selenium
# Using Chrome to access web
driver = webdriver.Chrome()
# Open the website
driver.get('https://canvas.case.edu')


Ketika kita membuka halaman web Canvas, kita dihadapkan dengan rintangan pertama - kotak login! Untuk menyiasatinya, kita harus memasukkan ID dan kata sandi dan menekan tombol login.



gambar



Bayangkan driver web adalah seseorang yang belum pernah melihat halaman web sebelumnya: kita perlu tahu persis di mana untuk mengklik, apa yang akan dicetak, dan tombol mana yang harus diklik. Ada beberapa cara untuk memberi tahu driver web kami elemen mana yang harus ditemukan, dan semuanya menggunakan penyeleksi. Selector adalah pengidentifikasi unik untuk elemen pada halaman web. Untuk menemukan pemilih untuk elemen tertentu, ucapkan bidang “CWRU ID”, kita perlu melihat kode halaman web. Di Chrome, ini dapat dilakukan dengan menekan Ctrl + Shift + I atau dengan mengklik kanan pada elemen apa pun dan memilih Lihat Kode. Ini terbukaAlat Pengembang Chrome , aplikasi yang sangat berguna yang menampilkan HTML yang mendasari halaman web apa pun .



Untuk menemukan pemilih untuk bidang "CWRU ID", saya mengklik kanan di bidang tersebut, mengklik Lihat Kode, dan melihat yang berikut di alat pengembang. Baris yang disorot berhubungan dengan elemen id_box (baris ini disebut tag HTML).



gambar



HTML ini mungkin terlihat luar biasa, tetapi kita dapat mengabaikan sebagian besar informasi dan fokus pada bagian id = "username"dan name = "username". (ini dikenal sebagai atribut tag HTML).

Untuk memilih bidang idmenggunakan driver web kami, kami dapat menggunakan atribut idatau nameyang kami temukan di alat pengembang. Driver web selenium memiliki banyak cara berbeda untuk memilih elemen pada halaman web, dan seringkali ada beberapa cara untuk memilih elemen yang sama:



# Select the id box
id_box = driver.find_element_by_name('username')
# Equivalent Outcome! 
id_box = driver.find_element_by_id('username')


Program kami sekarang memiliki akses ke id_box, dan kami dapat berinteraksi dengannya dengan berbagai cara, seperti memasukkan tombol atau menekan (jika kami telah memilih tombol).



# Send id information
id_box.send_keys('my_username')


Kami melalui proses yang sama untuk bidang input kata sandi dan tombol masuk, memilih masing-masing tergantung pada apa yang kita lihat di alat pengembang Chrome. Kami kemudian mengirim informasi ke barang atau mengkliknya sesuai kebutuhan.



# Find password box
pass_box = driver.find_element_by_name('password')
# Send password
pass_box.send_keys('my_password')
# Find login button
login_button = driver.find_element_by_name('submit')
# Click login
login_button.click()


Segera setelah kami masuk, kami disambut oleh bilah alat yang sedikit mengintimidasi ini:



gambar



Kita kembali perlu menavigasi program melalui halaman web, menentukan item yang tepat untuk diklik dan informasi untuk masuk. Dalam hal ini, saya memberi tahu program untuk memilih program dari menu di sebelah kiri, dan kemudian kelas yang sesuai dengan tugas yang harus saya sampaikan:



# Find and click on list of courses
courses_button = driver.find_element_by_id('global_nav_courses_link')
courses_button.click()
# Get the name of the folder
folder = file_tup[0]
    
# Class to select depends on folder
if folder == 'EECS491':
    class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')
elif folder == 'EECS531':
    class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')
# Click on the specific class
class_select.click()


Program menemukan kelas yang benar menggunakan nama folder yang kami simpan di langkah pertama. Dalam hal ini, saya menggunakan metode pilih find_element_by_link_textuntuk menemukan kelas tertentu. "Teks tautan" untuk suatu elemen hanyalah pemilih lain yang dapat kita temukan dengan melihat halaman:



gambar



Alur kerja ini mungkin tampak sedikit membosankan, tetapi ingat bahwa kita hanya perlu melakukan ini satu kali ketika kita menulis program kita! Setelah itu, kita dapat mengklik "Jalankan" sebanyak yang kita inginkan, dan program akan pergi ke semua halaman ini untuk kita.

Kami menggunakan proses yang sama untuk memvalidasi halaman - memilih elemen - berinteraksi dengan elemen untuk melewati beberapa layar lagi. Akhirnya, kami mencapai halaman pengiriman pekerjaan:



gambar



Pada titik ini, saya bisa melihat garis finis, tetapi pada awalnya layar ini membingungkan saya. Saya bisa mengklik bidang Pilih File dengan cukup mudah, tetapi bagaimana saya memilih file yang ingin saya unggah? Jawabannya ternyata sangat sederhana! Kami menemukan bidang Choose Filemenggunakan pemilih dan menggunakan metode send_keysuntuk meneruskan jalur file yang tepat (disebutkan file_locationdalam kode di bawah) ke blok:



# Choose File button
choose_file = driver.find_element_by_name('attachments[0][uploaded_data]')
# Complete path of the file
file_location = os.path.join(submission_dir, folder, file_name)
# Send the file location to the button
choose_file.send_keys(file_location)


Dengan mengirimkan path file yang tepat, kita dapat melewati seluruh proses navigasi folder untuk menemukan file yang kita inginkan. Setelah mengirimkan jalur, kami mendapatkan layar berikut yang menunjukkan bahwa file kami dimuat dan siap untuk dikirim.



gambar



Sekarang kita pilih tombol "Kirim tugas", klik, dan tugas kami terkirim!



# Locate submit button and click
submit_assignment = driver.find_element_by_id('submit_file_button')
submit_assignent.click()


gambar


Pembersihan



Manajemen file selalu merupakan langkah penting, dan saya ingin memastikan saya tidak mengirim ulang atau kehilangan pekerjaan lama. Saya pikir solusi terbaik adalah menyimpan file untuk ditempatkan di folder completed_assignmentsdan memindahkan file ke folder submitted_assignmentssegera setelah diunduh. Bit kode terakhir menggunakan modul os untuk memindahkan pekerjaan yang sudah selesai ke lokasi yang benar.



# Location of files after submission
submitted_file_location = os.path.join(submitted_dir, submitted_file_name)
# Rename essentially copies and pastes files
os.rename(file_location, submitted_file_location)


Semua kode sumber dikemas ke dalam satu skrip yang dapat saya jalankan dari baris perintah. Untuk membatasi kemungkinan kesalahan, saya hanya mengirimkan satu pekerjaan pada satu waktu, yang bukan masalah besar mengingat hanya dibutuhkan sekitar 5 detik untuk memulai program!



Ini seperti apa ketika saya menjalankan program:



gambar



Program memberi saya kesempatan untuk memastikan bahwa ini adalah pekerjaan yang benar sebelum memuat. Setelah program selesai, saya mendapatkan output berikut:



gambar



Ketika program sedang berjalan, saya dapat mengamati Python berjalan untuk saya:



gambar



kesimpulan



Teknik otomasi dengan Python sangat bagus untuk banyak tugas, baik umum maupun dalam bidang ilmu data saya. Misalnya, kita dapat menggunakan Selenium untuk secara otomatis mengunduh file data baru setiap hari (dengan asumsi situs web tidak memiliki API ). Meskipun skrip mungkin tampak membosankan pada pandangan pertama, keuntungannya adalah kita dapat memaksa komputer untuk mengulangi urutan ini sebanyak yang kita inginkan dengan cara yang persis sama. Program tidak akan pernah kehilangan fokus dan pergi ke Twitter. Ini akan mengikuti langkah-langkah tepat dalam urutan yang sempurna (algoritma akan berfungsi dengan baik sampai situs berubah).



Saya harus menyebutkan bahwa Anda harus berhati-hati sebelum mengotomatiskan tugas-tugas penting. Contoh ini adalah risiko yang relatif rendah karena saya selalu dapat kembali dan mengirim kembali tugas, dan saya biasanya memeriksa ulang program untuk bekerja. Situs web berubah, dan jika Anda tidak mengubah program sebagai imbalannya, Anda mungkin berakhir dengan skrip yang melakukan sesuatu yang sama sekali berbeda dari apa yang semula Anda maksudkan!



Dalam hal ROI, program ini menghemat sekitar 30 detik per tugas dan membutuhkan waktu 2 jam untuk menulis. Jadi jika saya menggunakannya untuk menyelesaikan 240 tugas, saya akan mendapat nilai tambah tepat waktu! Namun, hasil dari program ini terletak pada pengembangan solusi keren untuk masalah dan banyak mengajar dalam proses. Sementara waktu saya bisa lebih efisien dihabiskan untuk menyelesaikan tugas daripada mencari tahu bagaimana mengubahnya secara otomatis, saya benar-benar menikmati tantangannya. Ada beberapa hal yang memuaskan seperti pemecahan masalah, dan Python ternyata menjadi alat yang cukup bagus untuk itu. ...



gambar



Pelajari detail cara mendapatkan profesi yang dicari dari awal atau Tingkatkan keterampilan dan gaji dengan menyelesaikan kursus online berbayar SkillFactory:











All Articles