Scraping Web dengan Modul Scrapy Python

Scraping Web dengan Modul Scrapy Python

Keterampilan web scraping telah menjadi emas hari ini, jadi mari kita pelajari bagaimana kita bisa mendapatkan data yang dibutuhkan dari halaman web. Pada artikel ini, kita akan berbicara tentang library Scrapy Python, apa yang dapat dilakukannya dan bagaimana menggunakannya. Mari kita mulai.

Mengapa Scrapy?

Scrapy adalah perpustakaan pengikisan web yang kuat, yang menyediakan kemampuan untuk mengdownload halaman web, gambar, dan data apa pun yang dapat Anda pikirkan dengan kecepatan kilat. Kecepatan sangat penting dalam komputasi, dan Scrapy mengerjakan ini dengan mengunjungi situs web secara tidak sinkron dan melakukan banyak pekerjaan latar belakang sehingga seluruh tugas terlihat mudah.

Harus dikatakan bahwa Python memiliki perpustakaan lain yang dapat digunakan untuk mengikis data dari situs web, tetapi tidak ada yang sebanding dengan Scrapy dalam hal efisiensi.

Installation

Mari kita lihat sekilas bagaimana library yang kuat ini dapat diinstal pada engine Anda.

Seperti kebanyakan library Python, Anda dapat menginstal Scrapy menggunakan modul pip:

pip install Scrapy

Anda dapat memeriksa apakah instalasi berhasil dengan mengimpor scrapy di shell interaktif Python.

$ python
Python 3.5.2 (default, Sep 14 2017, 22:51:06)
[GCC 5.4.0 20160609] on linux

Ketik “bantuan”, “hak cipta”, “kredit” atau “lisensi” untuk informasi lebih lanjut.

>>> import scrapy

Sekarang setelah kita selesai dengan instalasi, mari kita masuk ke hal-hal yang tebal.

Creating a Web Scraping Project

Selama instalasi, kata kunci scrapy ditambahkan ke jalur sehingga kami dapat menggunakan kata kunci langsung dari command line. Kami akan mengambil keuntungan dari ini, selama kami menggunakan perpustakaan.

Dari direktori pilihan Anda jalankan perintah berikut:

scrapy startproject webscraper

Ini akan membuat direktori bernama webscraper di direktori saat ini dan file scrapy.cfg. Di direktori webscraper   akan memiliki file __init__.py, items.py, middlewares.py, pipelines.py, settings.py dan direktori bernama spiders.

File spider kami yaitu skrip yang melakukan webscraping untuk kami akan disimpan di direktori spiders.

Writing Our Spider

Sebelum kita melanjutkan menulis spider kita, diharapkan kita sudah mengetahui website apa yang ingin kita coret. Untuk tujuan artikel ini, kami menggores situs web webscraping sampel: http://example.webscraping.com.

Situs web ini hanya memiliki nama negara dan benderanya, dengan halaman yang berbeda dan kami akan menghapus tiga halaman. Tiga halaman yang akan kami kerjakan adalah:

http://example.webscraping.com/places/default/index/0
http://example.webscraping.com/places/default/index/1
http://example.webscraping.com/places/default/index/ 2

Kembali ke spider kita, kita akan membuat sample_spider.py di direktori spider. Dari terminal, sederhanatouch sample_spider.py perintah akan membantu membuat file baru.

Setelah membuat file, kami akan mengisinya dengan baris kode berikut:

import scrapy
 
class SampleSpider(scrapy.Spider):
  name = "sample"
  start_urls = [
      "http://example.webscraping.com/places/default/index/0",
      "http://example.webscraping.com/places/default/index/1",
      "http://example.webscraping.com/places/default/index/2"
  ]
 
  def parse(self, response):
      page_number = response.url.split('/')[-1]
      file_name = "page{}.html".format(page_number)
      with open(file_name, 'wb') as file:
       file.write(response.body)

Dari tingkat atas direktori proyek, jalankan perintah berikut:

scrapy crawl sample

Ingatlah bahwa kami memberi kelas SampleSpider kami sampel atribut nama .

Setelah menjalankan perintah itu, Anda akan melihat bahwa tiga file bernama page0.html, page1.html, page2.html disimpan ke direktori.

Mari kita lihat apa yang terjadi dengan kode:

import scrapy

Pertama kita mengimpor perpustakaan ke namespace kita.

class SampleSpider(scrapy.Spider):
  name = "sample"

Kemudian kita membuat kelas laba-laba yang kita sebut SampleSpider. Laba-laba kami mewarisi dari scrapy.Spider. Semua laba-laba kita harus mewarisi dari scrapy.Spider. Setelah membuat kelas, kami memberikan atribut nama pada laba-laba kami , atribut nama ini digunakan untuk memanggil laba-laba dari terminal. Jika Anda ingat, kami menjalankanscrapy crawl sample perintah untuk menjalankan kode kita.

start_urls = [
 
   "http://example.webscraping.com/places/default/index/0",
   "http://example.webscraping.com/places/default/index/1",
   "http://example.webscraping.com/places/default/index/2"
]

Kami juga memiliki daftar url untuk dikunjungi laba-laba. Daftar tersebut harus disebut start_urls. Jika Anda ingin memberi daftar nama yang berbeda, kami harus mendefinisikan fungsi start_requests yang memberi kami lebih banyak kemampuan. Untuk mempelajari lebih lanjut, Anda dapat melihat dokumentasi scrapy.

Terlepas dari itu, jangan lupa untuk menyertakan http:// atau https:// untuk tautan Anda, jika tidak, Anda harus berurusan dengan error skema yang hilang.

def parse(self, response):

Kami kemudian melanjutkan untuk mendeklarasikan fungsi parse dan memberikannya parameter respons. Ketika kode dijalankan, fungsi parse dibangkitkan dan objek respons dikirim yang berisi semua informasi dari halaman web yang dikunjungi.

page_number = response.url.split('/')[-1]
file_name = "page{}.html".format(page_number)

Apa yang telah kita lakukan dengan kode ini adalah untuk membagi string yang berisi alamat dan menyimpan nomor halaman saja dalam variabel page_number. Kemudian kita membuat variabel file_name dengan memasukkan page_number dalam string yang akan menjadi nama file dari file yang akan kita buat.

with open(file_name, 'wb') as file:
  file.write(response.body)

Kami sekarang telah membuat file, dan kami menulis konten halaman web ke dalam file menggunakan atribut body dari objek respon.

Kita dapat melakukan lebih dari sekedar menyimpan halaman web. Pustaka BeautifulSoup dapat digunakan untuk mengurai body.response. Anda dapat melihat tutorial BeautiulSoup ini jika Anda tidak terbiasa dengan perpustakaan.

Dari halaman yang akan dihapus, berikut adalah kutipan html yang berisi data yang kita butuhkan:

<div id="results">
<table>
<tr><td><div><a href="/places/default/view/Afghanistan-1">
<img src="/places/static/images/flags/af.png" /> Afghanistan</a></div></td>
<td><div><a href="/places/default/view/Aland-Islands-2">
<img src="/places/static/images/flags/ax.png" /> Aland Islands</< a href="">a></div></td>
</tr>
...

</table>
</div>

Anda akan melihat bahwa semua data yang diperlukan disertakan dalam tag div, jadi kami akan menulis ulang kode untuk mengurai html.
 
Berikut skrip baru kami:

import scrapy
from bs4 import BeautifulSoup
 
class SampleSpider(scrapy.Spider):
    name = "sample"
 
    start_urls = [
     "http://example.webscraping.com/places/default/index/0",
     "http://example.webscraping.com/places/default/index/1",
     "http://example.webscraping.com/places/default/index/2"
     ]
 
    def parse(self, response):
      page_number = response.url.split('/')[-1]
      file_name = "page{}.txt".format(page_number)
      with open(file_name, 'w') as file:
        html_content = BeautifulSoup(response.body, "lxml")
        div_tags = html_content.find("div", {"id": "results"})
        country_tags = div_tags.find_all("div")
        country_name_position = zip(range(len(country_tags)), country_tags)
        for position, country_name in country_name_position:
          file.write("country number {} : {}n".format(position + 1, country_name.text))

Kodenya hampir sama dengan yang awal, namun saya telah menambahkan BeautifulSoup ke namespace kami dan saya telah mengubah logika dalam fungsi parse.

Mari kita lihat logikanya dengan cepat.

def parse(self, response):

Di sini kita telah mendefinisikan fungsi parse, dan memberinya parameter respon.

page_number = response.url.split('/')[-1]
file_name = "page{}.txt".format(page_number)
with open(file_name, 'w') as file:

Ini melakukan hal yang sama seperti yang dibahas dalam kode awal, satu-satunya perbedaan adalah kita bekerja dengan file teks, bukan file html. Kami akan menyimpan data yang tergores dalam file teks, dan bukan seluruh konten web dalam html seperti yang dilakukan sebelumnya.

html_content = BeautifulSoup(response.body, "lxml")

Apa yang telah kita lakukan di baris kode ini adalah mengirimkan response.body sebagai argumen ke pustaka BeautifulSoup, dan menetapkan hasilnya ke variabel html_content.

div_tags = html_content.find("div", {"id": "results"})

Mengambil konten html, kami menguraikannya di sini dengan mencari tag div yang juga memiliki atribut id dan hasil sebagai nilainya, lalu kami menyimpannya dalam variabel div_tags.

country_tags = div_tags.find_all("div")

Ingat bahwa negara juga ada di tag div, sekarang kita hanya mendapatkan semua tag div dan menyimpannya sebagai daftar di variabel country_tags.

country_name_position = zip(range(len(country_tags)), country_tags)
 
for position, country_name in country_name_position:
  file.write("country number {} : {}n".format(position + 1, country_name.text))

Di sini, kami mengulangi posisi negara di antara semua tag negara, lalu kami menyimpan konten dalam file teks.

Jadi di file teks Anda, Anda akan memiliki sesuatu seperti:

country number 1 :  Afghanistan
country number 2 :  Aland Islands
country number 3 :  Albania
……..

Kesimpulan

Scrapy tidak diragukan lagi salah satu perpustakaan paling kuat di luar sana, sangat cepat dan pada dasarnya mengdownload halaman web. Ini kemudian memberi Anda kebebasan untuk apa pun yang Anda inginkan dengan konten web.

Kami harus mencatat bahwa Scrapy dapat melakukan lebih dari yang telah kami periksa di sini. Anda dapat mengurai data dengan pemilih Scrapy CSS atau Xpath jika diinginkan. Anda dapat membaca dokumentasi jika Anda perlu melakukan sesuatu yang lebih kompleks.

Related Posts