Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby
Code

Membina Pengikis Web Pertama Anda, Bahagian 1

by
Length:LongLanguages:

Malay (Melayu) translation by Aisyah Arrafah (you can also view the original English article)

Rubyland mempunyai dua permata yang telah menduduki peluncuran web untuk beberapa tahun kebelakangan: Nokogiri dan Mechanize. Kami membelanjakan satu artikel mengenai setiap perkara ini sebelum kami memasukkannya ke dalam tindakan dengan contoh praktikal.

Topik

  • Mengikis Web?
  • Kebenaran
  • Masalah
  • Nokogiri
  • Pengekstrakan?
  • Halaman-halaman
  • API
  • Navigasi Nod

Mengikis Web?

Terdapat istilah yang lebih menarik di sekitar web atau scraping skrin. Pengambilan web dan pengekstrakan data web cukup banyak memberitahu anda apa yang sedang berlaku. Kami boleh mengotomatisasi pengekstrakan data dari laman web-dan itu juga tidak rumit.

Dengan cara ini, alat ini membolehkan anda meniru dan mengautomasikan pelayaran web manusia. Anda menulis program yang hanya mengeluarkan jenis data yang menarik minat anda. Menyasarkan data tertentu hampir semudah menggunakan pemilih CSS.

Beberapa tahun yang lalu saya melanggan beberapa kursus video dalam talian yang mempunyai satu juta video pendek tetapi tidak ada pilihan untuk memuat turunnya secara massal. Saya terpaksa melalui setiap pautan pada saya sendiri dan melakukan 'simpan' sendiri yang ditakuti. Ia adalah jenis pengikisan web manusia-sesuatu yang sering kita perlu lakukan apabila kita kekurangan pengetahuan untuk mengotomatikkan jenis barang semacam itu. Kursus itu sendiri baik-baik saja, tetapi saya tidak menggunakan perkhidmatan mereka lagi selepas itu. Ia terlalu membosankan.

Hari ini, saya tidak peduli tentang UX minda lebat ini. Pengikis yang akan melakukan muat turun untuk saya akan membawa saya hanya beberapa minit untuk membuang bersama. Tiada masalah!

Biarkan saya memecahkannya dengan cepat sebelum kita memulakannya. Seluruh benda boleh dipeluwap menjadi beberapa langkah. Mula-mula kita mengambil halaman web yang mempunyai data yang dikehendaki yang kita perlukan. Kemudian kita mencari melalui halaman itu dan mengenal pasti maklumat yang ingin kita eksekusi.

Langkah terakhir ialah untuk menyasarkan bit ini, potong jika perlu, dan tentukan bagaimana dan di mana anda ingin menyimpannya. HTML yang ditulis dengan baik sering menjadi kunci untuk membuat proses ini mudah dan menyeronokkan. Untuk pengekstrakan yang lebih banyak, ia boleh menjadi kesakitan jika anda perlu menangani markup yang kurang berstruktur.

Bagaimana dengan API? Soalan yang sangat baik. Sekiranya anda mempunyai akses ke perkhidmatan dengan API, seringkali sedikit keperluan untuk menulis pengikis anda sendiri. Pendekatan ini kebanyakannya untuk laman web yang tidak menawarkan kemudahan semacam itu. Tanpa API, ini sering menjadi satu-satunya cara untuk mengotomatisasi pengekstrakan maklumat dari laman web.

Anda mungkin bertanya, bagaimana ini mengikis perkara sebenarnya? Tanpa melompat ke arah yang mendalam, jawapan pendek adalah, dengan melintasi struktur data pokok. Nokogiri membina struktur data ini dari dokumen yang anda rasakan dan membolehkan anda menargetkan bit kepentingan untuk pengekstrakan. Sebagai contoh, CSS adalah bahasa yang ditulis untuk traversal pokok, untuk mencari struktur data pokok, dan kami boleh menggunakannya untuk pengekstrakan data.

Terdapat banyak pendekatan dan penyelesaian di luar sana untuk dimainkan. Rubyland mempunyai dua permata yang telah menduduki tempat tumpuan untuk beberapa tahun sekarang. Ramai orang masih bergantung kepada Nokogiri dan Mekanisir untuk keperluan mengikis HTML. Kedua-duanya telah diuji dan membuktikan diri mereka mudah digunakan semasa menjadi sangat berkebolehan. Kami akan melihat kedua-dua mereka. Tetapi sebelum itu, saya ingin mengambil sedikit masa untuk menangani masalah yang akan kita selesaikan pada akhir siri pengenalan ringkas ini.

Keizinan

Sebelum anda mula mengikis, pastikan anda mempunyai kebenaran tapak yang anda cuba akses untuk pengekstrakan data. Jika laman web mempunyai umpan API atau RSS, misalnya, mungkin bukan hanya mudah untuk mendapatkan kandungan yang diinginkan, tetapi juga pilihan pilihan hukum.

Tidak semua orang akan menghargainya jika anda mengikis secara besar-besaran di laman web mereka-difahami demikian. Dapatkan diri anda dididik di laman web tertentu yang anda minati, dan jangan mendapatkan masalah dalam diri anda. Kemungkinan rendah bahawa anda akan menimbulkan kerosakan yang serius, tetapi risiko masalah tidak diketahui adalah cara untuk pergi.

Masalah

Saya perlu membina podcast baru. Reka bentuk itu bukan di mana saya mahu menjadi, dan saya membenci cara menerbitkan jawatan baru. WYSIWYGs sialan! Sedikit konteks. Sekitar dua tahun yang lalu, saya membina versi pertama podcast saya. Ideanya ialah bermain dengan Sinatra dan membina sesuatu yang ringan. Saya berlari ke dalam beberapa isu yang tidak dijangka sejak saya menyusun segala-galanya.

Datang dari Rails, ia pasti merupakan perjalanan pendidikan yang saya hargai, tapi saya dengan cepat menyesali kerana tidak menggunakan tapak statik yang saya dapat menggunakan melalui GitHub melalui laman GitHub. Menyebarkan episod baru dan mengekalkan mereka tidak mempunyai kesederhanaan yang saya cari. Buat sementara waktu, saya memutuskan bahawa saya mempunyai ikan yang lebih besar untuk goreng dan memberi tumpuan kepada menghasilkan bahan podcast baru.

Musim panas lalu saya mula menjadi serius dan bekerja di laman web Middleman yang dihoskan melalui laman GitHub. Untuk dua pertunjukan musim, saya mahu sesuatu yang segar. Reka bentuk yang baru, mudah, Penurunan untuk menerbitkan episod baru, dan tiada pergaduhan tinju dengan Heroku-heaven! Masalahnya adalah bahawa saya mempunyai 139 episod yang terletak di sekitar yang perlu diimport dan ditukar terlebih dahulu untuk bekerja dengan Middleman.

Untuk siaran, Middleman menggunakan  .markdown fail penanda aras yang telah dipanggil frontmatter untuk data-yang menggantikan pangkalan data saya pada dasarnya. Melakukan pemindahan dengan tangan bukan pilihan untuk 139 episod. Inilah pengiraan untuk. Saya perlu mencari cara untuk menghuraikan HTML laman web lama saya, mengikis kandungan yang berkaitan, dan memindahkannya ke jawatan blog yang saya gunakan untuk menerbitkan episod podcast baru di Middleman.

Oleh itu, dalam tiga artikel yang akan datang, saya akan memperkenalkan anda kepada alat-alat yang biasa digunakan dalam Rubyland untuk tugas-tugas tersebut. Pada akhirnya, kami akan menyelesaikan penyelesaian saya untuk menunjukkan kepada anda sesuatu yang praktikal juga.

Nokogiri

Walaupun anda benar-benar baru kepada Ruby/Rails, kemungkinan besar anda sudah mendengar tentang permata kecil ini. Nama itu sering digugurkan dan mudah dilekatkan dengan anda. Saya tidak pasti ramai yang tahu bahawa nokogiri adalah bahasa Jepun untuk "saw".

Ia adalah nama yang sesuai apabila anda memahami apa yang dilakukan oleh alat itu. Pencipta permata ini adalah Tenderlove yang indah, Aaron Patterson. Nokogiri menukarkan dokumen XML dan HTML ke dalam struktur data-struktur data pokok, untuk menjadi lebih tepat. Alat ini pantas dan menawarkan antara muka yang bagus juga. Secara keseluruhannya, ia adalah sebuah perpustakaan yang sangat kuat yang menjaga banyak keperluan HTML anda.

Anda boleh menggunakan Nokogiri bukan sahaja untuk parsing HTML; XML adalah permainan yang adil juga. Ia memberi anda pilihan kedua-dua bahasa laluan XML dan antara muka CSS untuk melintasi dokumen yang anda muatkan. Bahasa laluan XML, atau XPath untuk pendek, adalah bahasa pertanyaan.

Ia membolehkan kita memilih nod dari dokumen XML. Pemilih CSS kemungkinan besar lebih dikenali kepada pemula. Seperti dengan gaya yang anda tulis, pemilih CSS menjadikannya sangat mudah untuk menyasarkan bahagian tertentu halaman yang berminat untuk pengekstrakan. Anda hanya perlu membiarkan Nokogiri mengetahui apa yang anda selepas apabila anda menyasarkan destinasi tertentu.

Halaman-halaman

Apa yang kita perlu bermula dengan mengambil halaman sebenar yang kita minati. Kami menyatakan jenis dokumen Nokogiri yang kita ingin parse-XML atau HTML sebagai contoh:

some_scraper.rb

Nokogiri: XML dan Nokogiri: HTML boleh mengambil objek IO atau objek String. Apa yang berlaku di atas adalah mudah. Ini membuka dan mengambil halaman yang ditetapkan menggunakan open-uri dan kemudian memuatkan strukturnya, XML atau HTML ke dalam dokumen Nokogiri yang baru. XML bukanlah sesuatu yang baru dimulakan oleh pemula.

Oleh itu, saya cadangkan agar kami memberi tumpuan kepada parsing HTML buat masa sekarang. Mengapa buka-uri? Modul ini dari Standard Library Ruby membolehkan kami merebut tapak tanpa banyak kekecohan. Oleh kerana objek IO adalah permainan yang adil, kita boleh menggunakan open-uri dengan mudah..

API

Mari kita amalkan ini dengan contoh kecil:

at_css

some_podcast_scraper.rb

Apa yang kami lakukan di sini mewakili semua langkah-langkah yang biasanya terlibat dengan mengikis web-hanya pada peringkat mikro. Kami menentukan URL yang kami perlukan dan tapak yang kami perlukan untuk diambil, dan kami memuatkannya ke dalam dokumen Nokogiri yang baru. Kemudian kami buka halaman tersebut dan sasarkan seksyen tertentu.

Di sini saya hanya ingin mengetahui tajuk episod terkini. Menggunakan kaedah at_css dan pemilih CSS untuk tajuk h2.post adalah semua yang saya perlukan untuk menyasarkan titik ekstraksi. Dengan kaedah ini, kita hanya akan mengikis elemen tunggal ini. Ini memberikan kita pemilih keseluruhan-yang paling tidak tepat masa yang kita perlukan. Oleh itu, kita hanya mengekstrak bahagian teks dalam nod ini melalui kaedah teks. Sebagai perbandingan, anda boleh menyemak output untuk kedua-dua tajuk dan teks di bawah.

Pengeluaran

Walaupun contoh ini mempunyai aplikasi yang sangat terhad, ia memiliki semua bahan, semua langkah yang anda perlu fahami. Saya fikir ia keren betapa mudahnya ini. Kerana ia mungkin tidak jelas dari contoh ini, saya ingin menunjukkan betapa kuatnya alat ini boleh. Mari lihat apa lagi yang boleh kita lakukan dengan skrip Nokogiri.

Perhatian!

Jika anda seorang pemula dan tidak pasti bagaimana untuk menargetkan HTML yang diperlukan untuk ini, saya cadangkan anda mencari dalam talian untuk mengetahui bagaimana untuk memeriksa kandungan tapak web dalam penyemak imbas anda. Pada dasarnya, semua pelayar utama membuat proses ini sangat mudah hari ini.

Pada Chrome, anda hanya perlu klik kanan pada elemen di laman web dan memilih pilihan pemeriksaan. Ini akan membuka tetingkap kecil di bahagian bawah pelayar anda yang menunjukkan sesuatu seperti x-ray DOM tapak. Ia mempunyai lebih banyak pilihan, dan saya akan mengesyorkan menghabiskan sedikit masa di Google untuk mendidik diri sendiri. Ini adalah masa yang digunakan dengan bijak!

css

Kaedah css akan memberi kita bukan sahaja unsur pilihan tetapi elemen yang sepadan dengan kriteria carian pada halaman. Pretty neat dan mudah!

some_scraper.rb

Pengeluaran

Satu-satunya perbezaan kecil dalam contoh ini ialah saya berulang pada tajuk mentah dahulu. Saya juga mengekstrak teks dalamannya dengan kaedah teks. Nokogiri secara automatik berhenti di hujung halaman dan tidak cuba mengikuti pagination di mana-mana secara automatik.

Katakan kita ingin mempunyai sedikit maklumat lanjut, katakan tarikh dan sarikata untuk setiap episod. Kita hanya boleh meluaskan contoh di atas. Ia adalah idea yang baik untuk mengambil langkah ini secara bertahap. Dapatkan sekeping kecil bekerja dan tambah lebih kerumitan di sepanjang jalan.

some_scraper.rb

Pengeluaran

Pada ketika ini, kami sudah mempunyai beberapa data untuk dimainkan. Kita boleh menstrukturkan atau memakannya dengan cara yang kita suka. Di atas hanya perlu menunjukkan apa yang kita ada dalam cara yang boleh dibaca. Sudah tentu kita boleh menggali lebih mendalam ke dalam setiap ini dengan menggunakan ungkapan biasa dengan kaedah teks.

Kami akan melihat ini dengan lebih terperinci apabila kita dapat menyelesaikan masalah podcast sebenar. Ia tidak akan menjadi kelas di regexp, tetapi anda akan melihat lebih banyak lagi dalam tindakan-tetapi tidak ada kebimbangan, tidak terlalu membuat otak anda berdarah.

Atribut

Apa yang boleh menjadi berguna pada tahap ini adalah mengekstrak href untuk episod individu juga. Ia tidak boleh menjadi lebih mudah.

some_scraper.rb

Bit yang paling penting untuk diperhatikan di sini ialah [:href] dan podcast_url. Jika anda menandai pada [:], anda hanya dapat mengekstrak atribut dari pemilih yang disasarkan. Saya diturunkan sedikit lagi, tetapi anda dapat melihat lebih jelas bagaimana ia berfungsi di bawah.

Untuk mendapatkan URL, yang lengkap dan berguna, saya menyimpan domain akar dalam pembolehubah dan membina URL penuh untuk setiap episod.

Mari kita lihat dengan cepat pada output:

Output

Rapi, bukan? Anda boleh melakukan perkara yang sama untuk mengekstrak [:kelas] pemilih.

Jika nod itu mempunyai lebih daripada satu kelas, anda akan mendapat senarai semua.

Navigasi Nod

  • ibu bapa
  • kanak-kanak
  • sebelumnya_sibling
  • next_sibling

Kami digunakan untuk menangani struktur pokok dalam CSS atau jQuery. Ia akan menjadi sakit jika Nokogiri tidak menawarkan API yang berguna untuk bergerak di dalam pokok tersebut.

some_scraper.rb

Output

Seperti yang anda boleh lihat untuk diri sendiri, ini adalah beberapa perkara yang cukup kuat-terutamanya apabila anda melihat apa .parent dapat mengumpul dalam satu perjalanan. Daripada mendefinisikan sekumpulan nod dengan tangan, anda boleh mengumpulnya secara borong.

Anda juga boleh mengikat mereka untuk perjalanan yang lebih banyak. Anda boleh mengambil ini rumit seperti yang anda suka, sudah tentu, tetapi saya akan memberi amaran kepada anda untuk menjaga perkara yang mudah. Ia dengan cepat dapat sedikit sukar difahami dan sukar difahami. Ingatlah, ''simpan mudah, bodoh!''

some_scraper.rb

Output

Pemikiran Akhir

Nokogiri bukan perpustakaan yang besar, tetapi ia banyak ditawarkan. Saya cadangkan anda bermain dengan apa yang telah anda pelajari setakat ini dan mengembangkan pengetahuan anda melalui dokumentasi apabila anda memukul dinding. Tetapi jangan sampai dirimu kesulitan!

Intro kecil ini akan membantu anda untuk memahami apa yang boleh anda lakukan dan bagaimana ia berfungsi. Saya berharap anda akan meneroka lebih sedikit pada anda sendiri dan bersenang-senang dengannya. Seperti yang anda akan tahu sendiri, ia adalah alat yang kaya yang terus memberi.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.