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

Web Scraping Moden  dengan BeautifulSoup dan Selenium

by
Difficulty:IntermediateLength:MediumLanguages:

Malay (Melayu) translation by Kaustina Nurul Ilmi (you can also view the original English article)

Gambaran Keseluruhan

HTML hampir intuitif. CSS adalah kemajuan yang bersih yang memisahkan struktur halaman dari rupa dan rasa. JavaScript menambah beberapa lagi. Itulah teori. Dunia sebenar agak berbeza.

Dalam tutorial ini, anda akan mempelajari bagaimana bahan yang anda lihat dalam penyemak imbas sebenar akan disediakan dan bagaimana cara geseran apabila diperlukan. Khususnya, anda akan belajar cara mengira komen Disqus. Alat kami akan menjadi Python dan pakej hebat seperti Query, BeautifulSoup, dan Selenium.

Bilakah anda menggunakan Web Scraping?

Web Scraping adalah amalan secara automatik mengambil semula kandungan halaman web yang direka untuk interaksi dengan pengguna manusia, menguraikannya, dan mengeluarkan beberapa maklumat (mungkin menavigasi pautan ke halaman lain). Ini kadang-kadang perlu jika tidak ada cara lain untuk mengekstrak maklumat yang diperlukan. Sebaik-baiknya, aplikasi ini menyediakan API yang khusus untuk mengakses data pengaturcaraan. Ada beberapa sebab web scraping harus menjadi pilihan terakhir anda:

  • Ia rapuh (halaman web yang anda keriting mungkin berubah kerap).
  • Ia mungkin diharamkan (sesetengah aplikasi web mempunyai dasar terhadap geseran).
  • Ia mungkin perlahan dan meluas (jika anda perlu mengambil dan menyeberang melalui banyak bunyi).

Memahami Laman Web Dunia Sebenar

Mari kita faham apa yang kita lawan, dengan melihat keluaran beberapa kod aplikasi web biasa. Dalam artikel pengenalan yang tiada tempat tinggal, terdapat beberapa komen Disqus di bahagian bawah halaman:

Understanding Real-World Web Pages

Untuk mengikis komen ini, kita perlu mencari mereka di halaman pertama.

Lihat Sumber Halaman

Setiap penyemak imbas sejak subuh (1990-an) telah menyokong keupayaan untuk melihat HTML halaman aktif. Berikut adalah coretan dari pandangan pengenalan yang tidak bermotivasi yang bermula dengan sebahagian besar JavaScript yang dikurangkan dan mendalam berkaitan dengan artikel itu sendiri. Berikut adalah sebahagian kecil daripadanya:

Page Source

Berikut adalah beberapa HTML sebenar dari halaman:

HTML From the Page

Ia kelihatan agak kemas, tetapi yang menghairankan adalah bahawa anda tidak akan menemui komen Disqus di sumber halaman.

Bingkai Inline yang Kuat

Ternyata halaman mashup, dan komen Disqus disematkan sebagai iframe elemen (bingkai inline). Anda boleh mengetahui ini dengan mengklik kanan pada kawasan komen, dan anda akan melihat bahawa tiada templat maklumat dan sumber:

The Mighty Inline Frame

Itu masuk akal. Menyematkan kandungan pihak ketiga sebagai iframe adalah salah satu sebab utama untuk menggunakan iframes. Mari temukan tag <iframe> kemudian di sumber halaman utama. Dikurangkan lagi! Tiada tag <iframe> pada halaman utama sumbernya.

Markup JavaScript Dijana

Sebab peninggalan ini adalah bahawa lihat sumber halaman memaparkan kandungan yang diambil dari pelayan. Tetapi penghujung DOM (dokumen model objek) yang pelayar akan menyediakan mungkin sangat berbeza. Tendangan JavaScript dan boleh memanipulasi DOM pada kehendak. Iframe tidak dapat dijumpai, kerana tidak ada ketika halaman diambil dari pelayan.

Mengikis Statik vs Mengikis Dinamik

Pengikisan statik mengabaikan JavaScript. Ia mengambil halaman web dari pelayan tanpa bantuan penyemak imbas. Anda mendapat apa yang anda lihat di "Lihat halaman sumber", dan kemudian anda keping dan dadu itu. Jika anda mencari kandungan yang tersedia, anda tidak perlu pergi lagi. Walau bagaimanapun, jika kandungan itu seperti komen jika disqus, anda perlu mengikis dinamik.

Mengikis dinamik menggunakan pelayar sebenar (atau pelayar tanpa kepala) dan membolehkan JavaScript melakukan perkara itu. Kemudian, itu pertanyaan DOM untuk mengekstrak kandungan carian. Kadang-kadang anda perlu mengautomasikan penyemak imbas dengan mensimulasikan pengguna untuk mendapatkan kandungan yang anda perlukan.

Geseran Statik dengan Permintaan dan BeautifulSoup

Mari lihat bagaimana kerja statik kicauan menggunakan dua pakej Python yang hebat: permintaan untuk mengambil halaman web dan BeautifulSoup untuk menghuraikan halaman HTML.

Pasang permintaan dan BeautifulSoup

Pasang pipenv dahulu, dan kemudian: pipenv menginstal permintaan beautifulsoup4

Ini akan mewujudkan persekitaran maya untuk anda juga. Jika anda menggunakan kod dari gitlab, anda boleh pipenv install.

Ambil Halaman

Mengambil halaman dengan permintaan adalah satu kapal: r = requests.get(url)

Objek tindak balas mempunyai banyak atribut. Yang paling penting adalah ok dan content. Sekiranya permintaan gagal maka r.ok akan palsu dan r.content akan mengandungi ralat. Kandungan adalah aliran byte. Ia biasanya lebih baik untuk memecahkan kod ke utf-8 apabila berurusan dengan teks:

Jika semuanya OK, r.content akan mengandungi halaman web yang diminta (sama seperti Lihat halaman sumber).

Cari Elemen dengan BeautifulSoup

Fungsi get_page()di bawah mengambil semula laman web dengan URL, dekod ke UTF-8, dan memaparkannya ke objek BeautifulSoup yang menggunakan parser HTML.

Sekali kita mempunyai objek BeautifulSoup, kita boleh mula mengekstrak maklumat dari halaman. BeautifulSoup menyediakan banyak fungsi mencari unsur-unsur di dalam halaman dan mengetuk unsur-unsur bersarang.

Tuts + halaman Pengarang mengandungi beberapa tutorial. Berikut adalah halaman penulis saya. Pada setiap halaman, terdapat tutorial sehingga 12. Jika anda mempunyai lebih daripada 12 tutorial maka anda boleh menavigasi ke halaman seterusnya. HTML untuk setiap artikel yang diliputi dalam tag <article>. Fungsi berikut mendapati semua unsur artikel di halaman, bersenam ke pautan mereka, dan mengekstrak atribut href untuk mendapatkan URL tutorial:

Kod berikut akan menjadi semua artikel dari halaman dan cetakan mereka (tanpa awalan biasa):

Mengikis Dinamik dengan Selenium

Mengikis statik cukup baik untuk mendapatkan senarai artikel, tetapi seperti yang kita lihat sebelumnya, komen Disqus dimasukkan sebagai elemen iframe oleh JavaScript. Untuk menanam komen, kami perlu mengautomasikan penyemak imbas dan berinteraksi dengan DOM secara interaktif. Salah satu alat terbaik untuk bekerja adalah Selenium.

Selenium terutama ditujukan kepada ujian aplikasi web secara automatik, tetapi baik sebagai alat automasi penyemak imbas tujuan umum.

Pasang Selenium

Taip arahan ini untuk memasang Selenium: pipenv install selenium

Memilih Pemandu Web Anda

Selenium memerlukan pemacu web (pelayar automatik). Untuk geseran web, ia biasanya bukan isu pemandu yang anda pilih. Saya lebih suka pemandu Chrome. Ikut arahan dalam Panduan Selenium.

Chrome vs PhantomJS

Dalam sesetengah kes, anda mungkin lebih suka menggunakan pelayar tanpa kepala, yang bermaksud tidak ada UI dipaparkan. Secara teorinya, PhantomJS adalah hanya seorang pemandu web. Bagaimanapun, dalam praktiknya, orang melaporkan masalah di mana Selenium berfungsi dengan baik dengan Chrome atau Firefox dan kadang-kadang gagal dengan PhantomJS. Saya lebih suka untuk membuang pemboleh ubah ini dari persamaan dan menggunakan pemandu pelayar web sebenar.

Komen Count Disqus

Mari kita melakukan geseran dinamik dan gunakan Selenium untuk mengira komen Disqus pada tutorial Tuts+. Inilah import yang diperlukan.

Fungsi get_comment_count() menerima pemandu dan URL Selenium. Menggunakan kaedah get() pemandu untuk mendapatkan URL. Ini serupa dengan requests.get(), tetapi perbezaannya adalah perwakilan objek pemacu yang berjaya DOM secara langsung.

Kemudian, dia mendapat tajuk tutorial dan meletakkan disqus_thread Disqus menggunakan disqus_thread induk disqus_thread dan kemudian iframe itu sendiri:

Langkah seterusnya adalah untuk mendapatkan kandungan iframe itu sendiri. Perhatikan bahawa kami sedang menunggu elemen comment-count untuk hadir kerana komen dimuat secara dinamik dan tidak selalu tersedia lagi.

Bahagian terakhir adalah untuk memulangkan komen terakhir jika ia tidak dibuat oleh saya. Idea ini adalah untuk mengesan komen yang belum saya balas.

Kesimpulannya

Tuntutan web adalah amalan yang berguna apabila maklumat yang anda perlukan boleh diakses menerusi aplikasi web yang tidak menyediakan API yang sesuai. Ia mengambil beberapa kerja yang tidak penting untuk mengekstrak data dari aplikasi web moden, tetapi alat yang direka dengan baik dan direka dengan baik seperti Permintaan, BeautifulSoup, dan Selenium menjadikannya berbaloi.

Juga, berasa bebas untuk melihat apa yang kami ada untuk dijual dan belajar di Envato Market, dan berasa bebas untuk bertanya dan memberikan maklum balas berharga anda menggunakan suapan di bawah.

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.