Tutorial Dari Semalt: Mengikis Web Di Python

Saya telah melawat KinoPoisk (IMDB versi Rusia) baru-baru ini dan mendapat tahu bahawa selama bertahun-tahun saya berjaya menilai lebih daripada 1000 filem. Saya fikir akan menarik untuk meneliti data ini dengan lebih terperinci: adakah selera filem saya berubah dari masa ke masa? Sepanjang musim tahun ini, saya menonton lebih banyak filem?

Tetapi sebelum kita menganalisis dan membina grafik yang indah, kita perlu mendapatkan datanya. Malangnya, banyak perkhidmatan tidak mempunyai API awam, jadi anda perlu menggulung lengan baju dan menghurai halaman html.

Artikel ini ditujukan untuk mereka yang selalu ingin belajar bagaimana menggunakan Pengikisan Web tetapi tidak memahami atau tidak tahu harus memulakannya.

Tugas

Tugas kami adalah untuk mengekstrak data mengenai filem yang sudah dilihat: tajuk filem, tarikh dan masa menonton, penilaian pengguna.

Sebenarnya, kerja kita akan diselesaikan dalam 2 peringkat:

Tahap 1: memuat turun dan menyimpan halaman html

Tahap 2: menguraikan html dalam format yang sesuai untuk analisis lebih lanjut (csv, json, pandas dataframe dll.)

Instrumen

Terdapat banyak python-library untuk menghantar permintaan http. Yang paling terkenal dan sangat berguna adalah Permintaan.

Anda juga perlu memilih perpustakaan untuk menghuraikan html.

BeatifulSoup, lxml

Ini adalah dua perpustakaan paling popular untuk menghuraikan html dan memilih salah satu daripadanya hanyalah pilihan peribadi. Selain itu, perpustakaan ini saling berkaitan antara satu sama lain: BeautifulSoup mula menggunakan lxml sebagai penghurai dalaman untuk pecutan, dan dalam lxml, modul supparser ditambahkan. Untuk membandingkan pendekatan, saya akan menguraikan data dengan BeautifulSoup dan menggunakan pemilih XPath dalam modul lxml.html.

Memuat turun Data

Mari mulakan memuat turun data. Pertama sekali, mari kita cuba mendapatkan halaman dengan url dan menyimpannya ke fail tempatan.

Kami membuka fail yang dihasilkan dan melihat bahawa tidak semudah itu: laman web ini menganggap kami robot dan tidak akan menunjukkan data.

Mari Ketahui Bagaimana Laman Ini Berfungsi

Penyemak imbas tidak mempunyai masalah dalam mendapatkan maklumat dari laman web ini. Mari lihat bagaimana sebenarnya ia menghantar permintaan. Untuk melakukan ini, kami menggunakan panel "Rangkaian" di "Alat Pembangun" di penyemak imbas (saya menggunakan Firebug untuk ini), biasanya, permintaan yang kami perlukan adalah yang paling lama.

Seperti yang kita lihat, penyemak imbas juga menghantar ke header UserAgent, cookie dan sejumlah parameter lain. Pertama, kami hanya akan cuba menghantar UserAgent yang betul ke header.

Kali ini kita berjaya, dan sekarang kita diberi data yang diperlukan. Perlu diingat bahawa kadang-kadang laman web ini juga memeriksa kesahihan kuki, di mana sesi di perpustakaan Permintaan akan membantu.

Muat turun Semua Harga

Sekarang kita dapat menyimpan satu halaman dengan harga. Tetapi biasanya pengguna mempunyai kadar yang banyak, dan perlu dilakukan berulang kali melalui semua halaman. Nombor halaman yang menarik bagi kami mudah dipindahkan terus ke url.

Mengumpulkan Data Dari Html

Sekarang mari kita terus mengumpulkan data dari html. Cara termudah untuk memahami bagaimana halaman html disusun adalah dengan menggunakan fungsi "Inspect element" di penyemak imbas. Dalam kes ini, semuanya cukup mudah: keseluruhan jadual dengan harga ada di label. Pilih nod ini:

dari bs4 import BeautifulSoup

dari lxml import html

# Sup Cantik

sup = BeautifulSoup (teks)

film_list = soup.find ('div', ('class': 'profileFilmsList'))

# lxml

tree = html.fromstring (teks)

film_list_lxml = tree.xpath ('// div [@class =' 'profileFilmList' ']')) [0]

Mari belajar bagaimana mengeluarkan tajuk filem Rusia dan pautan ke halaman filem (juga cara mendapatkan teks dan nilai atribut).

Sekiranya anda perlu mengekstrak tajuk dalam bahasa Inggeris, ubah saja "nameRus" menjadi "nameEng".

Keputusan

Kami belajar menguraikan laman web, berkenalan dengan Permintaan perpustakaan, BeautifulSoup, dan lxml, serta menerima data yang sesuai untuk analisis lebih lanjut mengenai filem yang sudah dilihat di KinoPoisk.