Mengikis

Mengikis Web dengan Modul Python Scrapy

Mengikis Web dengan Modul Python Scrapy
Kemahiran mengikis web telah menjadi emas hari ini, jadi mari kita pelajari bagaimana kita dapat memperoleh data yang diperlukan dari laman web. Dalam artikel ini, kita akan membincangkan tentang perpustakaan Scrapy Python, apa yang boleh dilakukan dan bagaimana menggunakannya. Mari kita mulakan.

Mengapa Mengikis?

Scrapy adalah perpustakaan mengikis web yang kuat, yang menyediakan kemampuan untuk memuat turun halaman web, gambar dan data apa pun yang dapat anda fikirkan dengan sepantas kilat. Kepantasan sangat penting dalam pengiraan, dan Scrapy mengusahakannya dengan melayari laman web secara tidak serentak dan melakukan banyak kerja latar menjadikan keseluruhan tugas kelihatan mudah.

Harus dikatakan bahawa Python mempunyai perpustakaan lain yang dapat digunakan untuk mengikis data dari laman web, tetapi tidak ada yang sebanding dengan Scrapy dalam hal kecekapan.

Pemasangan

Mari kita lihat bagaimana perpustakaan hebat ini dapat dipasang pada mesin anda.

Seperti kebanyakan perpustakaan Python, anda boleh memasang Scrapy menggunakan modul pip:

pip pasang Scrapy

Anda boleh memeriksa sama ada pemasangan berjaya dengan mengimport scrapy di shell interaktif Python.

$ ular sawa
Python 3.5.2 (lalai, 14 Sep 2017, 22:51:06)
[GCC 5.4.0 20160609] di linux

Ketik "bantuan", "hak cipta", "kredit" atau "lesen" untuk maklumat lebih lanjut.

>>> import scrapy

Sekarang kita sudah selesai dengan pemasangan, mari kita membahas perkara-perkara berat.

Membuat Projek Mengikis Web

Semasa pemasangan, kata kunci scrapy ditambahkan ke jalan sehingga kami dapat menggunakan kata kunci langsung dari baris perintah. Kami akan memanfaatkan ini, sepanjang penggunaan perpustakaan kami.

Dari direktori pilihan anda jalankan arahan berikut:

skraper webprogram projek awal

Ini akan membuat direktori yang dipanggil webscraper dalam direktori dan scrapy semasa.fail cfg. Di dalam webscraper  direktori akan mempunyai __di dalamnya__.py, barang.py, alat tengah.py, saluran paip.py, tetapan.py fail dan direktori yang dipanggil labah-labah.

Fail labah-labah kami i.e. skrip yang melakukan webscraping untuk kita akan disimpan di labah-labah direktori.

Menulis Labah-labah Kita

Sebelum kita menulis labah-labah kita, diharapkan kita sudah mengetahui laman web apa yang ingin kita gores. Untuk tujuan artikel ini, kami mengikis contoh laman web webscraping: http: // contoh.melayari laman web.com.

Laman web ini hanya mempunyai nama negara dan bendera mereka, dengan halaman yang berlainan dan kami akan membuang tiga halaman tersebut. Tiga halaman yang akan kami jalankan adalah:

http: // contoh.melayari laman web.com / tempat / lalai / indeks / 0
http: // contoh.melayari laman web.com / tempat / lalai / indeks / 1
http: // contoh.melayari laman web.com / tempat / lalai / indeks / 2

Kembali ke labah-labah kami, kami akan membuat sample_spider.py di direktori labah-labah. Dari terminal, sederhana sentuh sample_spider.py arahan akan membantu membuat fail baru.

Setelah membuat fail, kami akan mengisi dengan baris kod berikut:

import scrapy
 
kelas SampleSpider (scrapy.Labah-labah):
nama = "sampel"
permulaan_urls = [
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 0 ",
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 1 ",
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 2 "
]
 
def parse (diri, tindak balas):
page_number = tindak balas.url.perpecahan ('/') [- 1]
file_name = "halaman .html ".format (halaman_nombor)
dengan buka (nama_file, 'wb') sebagai fail:
fail.tulis (tindak balas.badan)

Dari tingkat atas direktori projek, jalankan perintah berikut:

sampel merangkak scrapy

Ingatlah bahawa kami memberikan kami ContohSpider kelas a nama atribut contoh.

Setelah menjalankan perintah itu, anda akan melihat bahawa tiga fail bernama halaman0.html, halaman1.html, halaman2.html disimpan ke direktori.

Mari lihat apa yang berlaku dengan kod:

import scrapy

Mula-mula kita mengimport perpustakaan ke ruang nama kita.

kelas SampleSpider (scrapy.Labah-labah):
nama = "sampel"

Kemudian kami membuat kelas labah-labah yang kami namakan ContohSpider. Labah-labah kami mewarisi dari mengikis.Labah-labah. Semua labah-labah kita harus mewarisi dari scrapy.Labah-labah. Selepas membuat kelas, kami memberikan labah-labah kami nama atribut, ini nama atribut digunakan untuk memanggil labah-labah dari terminal. Sekiranya anda ingat, kami menjalankan sampel merangkak scrapy arahan untuk menjalankan kod kami.

permulaan_urls = [
 
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 0 ",
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 1 ",
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 2 "
]

Kami juga mempunyai senarai url untuk labah-labah dikunjungi. Senarai mesti dipanggil start_urls. Sekiranya anda ingin memberikan senarai nama yang berbeza, kita harus menentukan a permintaan_mula fungsi yang memberi kita lebih banyak keupayaan. Untuk mengetahui lebih lanjut, anda boleh melihat dokumentasi scrapy.

Walau apa pun, jangan lupa untuk memasukkan http: // atau https: // untuk pautan anda, anda perlu mengatasi ralat skema yang hilang.

def parse (diri, tindak balas):

Kami kemudian terus menyatakan fungsi parse dan memberikannya parameter tindak balas. Apabila kod dijalankan, fungsi parse dibangkitkan dan objek respons dihantar di mana mengandungi semua maklumat dari laman web yang dikunjungi.

page_number = tindak balas.url.perpecahan ('/') [- 1]
file_name = "halaman .html ".format (halaman_nombor)

Apa yang telah kami lakukan dengan kod ini adalah dengan memisahkan rentetan yang mengandungi alamat dan menyimpan nombor halaman sahaja dalam a mukasurat pemboleh ubah. Kemudian kami membuat a nama fail pemboleh ubah memasukkan mukasurat dalam rentetan yang akan menjadi nama fail fail yang akan kami buat.

dengan terbuka (nama_file, 'wb') sebagai fail:
fail.tulis (tindak balas.badan)

Kami sekarang telah membuat fail, dan kami menuliskan isi halaman web ke dalam file menggunakan badan atribut dari tindak balas objek.

Kita boleh melakukan lebih daripada sekadar menyimpan laman web. Perpustakaan BeautifulSoup dapat digunakan untuk menguraikan badan.tindak balas. Anda boleh melihat tutorial BeautiulSoup ini jika anda tidak biasa dengan perpustakaan.

Dari halaman yang akan dibatalkan, berikut adalah petikan html yang mengandungi data yang kami perlukan:

Anda akan menyedari bahawa semua data yang diperlukan dilampirkan dalam tag div, jadi kami akan menulis semula kod untuk menguraikan html.
Inilah skrip baru kami:

import scrapy
dari bs4 import BeautifulSoup
 
kelas SampleSpider (scrapy.Labah-labah):
nama = "sampel"
 
permulaan_urls = [
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 0 ",
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 1 ",
"http: // contoh.melayari laman web.com / tempat / lalai / indeks / 2 "
]
 
def parse (diri, tindak balas):
page_number = tindak balas.url.perpecahan ('/') [- 1]
file_name = "halaman .txt ".format (halaman_nombor)
dengan terbuka (nama_file, 'w') sebagai fail:
html_content = BeautifulSoup (tindak balas.badan, "lxml")
div_tags = html_content.cari ("div", "id": "hasil")
country_tags = div_tags.cari_all ("div")
country_name_position = zip (julat (len (country_tags)), country_tags)
untuk kedudukan, nama_negara di negara_nama_posisi:
fail.tulis ("nombor negara : \ n".format (kedudukan + 1, nama_negara.teks))

Kodnya hampir sama dengan yang awal, namun saya telah menambahkan BeautifulSoup ke ruang nama kami dan saya telah menukar logik dalam fungsi parse.

Mari kita melihat logiknya dengan cepat.

def parse (diri, tindak balas):

Di sini kita telah menentukan fungsi parse, dan memberikannya parameter tindak balas.

page_number = tindak balas.url.perpecahan ('/') [- 1]
file_name = "halaman .txt ".format (halaman_nombor)
dengan terbuka (nama_file, 'w') sebagai fail:

Ini melakukan perkara yang sama seperti yang dibincangkan dalam kod awal, satu-satunya perbezaan ialah kita bekerja dengan fail teks dan bukannya fail html. Kami akan menyimpan data yang dikikis dalam file teks, dan bukan seluruh isi web dalam html seperti yang dilakukan sebelumnya.

html_content = BeautifulSoup (tindak balas.badan, "lxml")

Apa yang telah kami lakukan dalam baris kod ini adalah menghantar tindak balas.badan sebagai hujah ke perpustakaan BeautifulSoup, dan memberikan hasilnya ke html_content pemboleh ubah.

div_tags = html_content.cari ("div", "id": "hasil")

Mengambil kandungan html, kami menguraikannya di sini dengan mencari a div tag yang juga mempunyai dan ID atribut dengan hasil kerana ia bernilai, maka kita dapat menyimpannya dalam a div_tags pemboleh ubah.

country_tags = div_tags.cari_all ("div")

Ingat bahawa negara-negara itu wujud di div tag juga, sekarang kita hanya mendapat semua div tag dan menyimpannya sebagai senarai di country_tags pemboleh ubah.

country_name_position = zip (julat (len (country_tags)), country_tags)
 
untuk kedudukan, nama_negara di negara_nama_posisi:
fail.tulis ("nombor negara : \ n".format (kedudukan + 1, nama_negara.teks))

Di sini, kita melakukan iterasi melalui kedudukan negara-negara di antara semua tag negara maka kita menyimpan kandungan dalam fail teks.

Oleh itu, dalam fail teks anda, anda mempunyai sesuatu seperti:

nombor negara 1: Afghanistan
nombor negara 2: Kepulauan Aland
nombor negara 3: Albania

Kesimpulannya

Scrapy tidak diragukan lagi adalah salah satu perpustakaan paling kuat di luar sana, sangat pantas dan pada dasarnya memuat turun halaman web. Ini kemudian memberi anda kebebasan untuk apa sahaja yang anda inginkan dengan kandungan web.

Kita harus perhatikan bahawa Scrapy dapat melakukan lebih banyak daripada yang kita periksa di sini. Anda boleh menguraikan data dengan pemilih Scrapy CSS atau Xpath jika anda mahu. Anda boleh membaca dokumentasi sekiranya anda perlu melakukan sesuatu yang lebih kompleks.

Permainan Terbaik untuk Dimainkan dengan Penjejakan Tangan
Oculus Quest baru-baru ini memperkenalkan idea hebat penjejakan tangan tanpa pengawal. Dengan jumlah permainan dan aktiviti yang semakin meningkat yan...
Cara Menunjukkan Overlay OSD dalam Aplikasi dan Permainan Linux Skrin Penuh
Bermain permainan skrin penuh atau menggunakan aplikasi dalam mod skrin penuh bebas gangguan dapat memisahkan anda dari maklumat sistem yang relevan y...
5 Kad Tangkap Permainan Teratas
Kita semua telah melihat dan menyukai streaming permainan permainan di YouTube. PewDiePie, Jakesepticye, dan Markiplier hanyalah beberapa pemain terat...