cara web crawling dengan scrapy dan python

Cara Web Crawling dengan Scrapy dan Python

Pada tutorial kali ini, kita akan belajar bagaimana membuat web crawling dengan menggunakan Scrapy dan juga Python. Selain itu, kita akan belajar tentang dasar-dasar proses crawling saat menjelajahi kumpulan data. Tetapi sebelum itu, kita harus memahami apa itu Web Crawling?

Web crawling atau bisa disebut juga sebagai web scraping atau web spidering merupakan sebuah cara untuk menelusuri kumpulan halaman web dan mengekstrak data secara terprogram, dan ini merupakan cara yang ampuh untuk bekerja dengan data di web.

Dengan adanya web crawling, kita dapat menambang data tentang sekumpulan produk, mendapatkan sekumpulan besar teks atau data kuantitatif, mengambil data dari situs tanpa API resmi, atau sekedar ingin memuaskan keingintahuan pribadi kalian.

Note

Untuk mengikuti tutorial kali ini kalian harus menginstall terlebih dahulu Python 3 di sistem operasi kalian.

Langkah 1 – Membuat Basic Crawling

Crawling memiliki proses dua langkah yaitu:

  1. Secara sistematis menemukan dan mengunduh halaman web.
  2. Ekstrak informasi dari halaman yang diunduh

Kedua langkah tersebut dapat diimplementasikan dalam beberapa cara. Kita dapat melakukan web crawling dengan menggunakan bantuan dari modul atau pustaka yang disediakan oleh Python. Untuk tutorial web crawling kali ini, kita akan menggunakan library Scrapy untuk membuat scraper kita.

Scrapy merupakan salah satu library scraping Python yang paling populer. Scrapy seperti kebanyakan library python lainnya, terdapat di PyPI atau juga dikenal sebagai pip. PyPI, Indeks Paket Python, adalah repositori milik komunitas dari semua perangkan lunak Python yang dipublikasikan.

Jika kalian sudah memiliki Python yang terinstall di sistem operasi kalian. Setelah itu, kalian dapat menginstall Scrapy dengan menjalankan perintah berikut di terminal kalian

pip install scrapy

Setelah berhasil terinstall, kemudian kita buat folder project yang akan kita gunakan dalam web crawling. Kalian dapat meng-copy perintah berikut di terminal kalian, lalu jalankan.

mkdir web-crawling

Selanjutnya, buka folder yang telah kita buka barusan.

cd web-crawling

Setelah itu, pada folder tersebut buat file python dengan nama scraper.py. Pada file tersebut nantinya yang akan menjalankan web crawling kita. Buka file yang barusan dibuat dengan text editor. Kalian bisa menggunakan text editor apapun.

Kita dapat memulai membuat web crawling dengan menggunakan Scrapy sebagai dasarnya. Untuk melakukannya, kita harus membuat kelas Ptyhon yang memiliki subclasses scrapy.Spider, basic spider class yang disediakan oleh Scrapy. Class ini akan memiliki dua atribut yang diperlukan:

name: hanya nama untuk spider

start_urls: daftar URL tempat kita akan memulai crawl. Kita akan mulai dengan satu URL

Pada file scraper.py isi dengan code berikut.

import scrapy


class QuoteSpider(scrapy.Spider):
    name = 'quote-spdier'
    start_urls = ['https://quotes.toscrape.com']

Mari kita bedah code diatas. Pertama kita perlu import scrapy supaya dapat digunakan class yang disediakan oleh library tersebut.

Selanjutnya, kita mengambil class spider yang disediakan oleh Scrapy dan membuat subkelas darinya yang disebut BrickSetSpider. Class Spider memiliki metode dan perilaku yang menentukan cara mengikuti URL dan mengekstrak data dari halaman yang ditemukannya, tetapi tidak tahu kemana harus mencari atau data apa yang harus dicari. Dengan mensubklasifikasikannya, kita dapat memberikannya informasi itu.

Terakhir, kita menamai class quote-spider dan memberikan scraper kita satu URL untuk memulai dari web kumpulan quote.

Sekarang, kita akan uji scraper yang telah dibuat. Untuk menjalankan Scrapy kita bisa meng-copy perintah berikut ke dalam terminal, lalu jalankan.

scrapy runspider scraper.py

Langkah 2 – Ekstrak Data dari Halaman

Kita telah membuat dasar program untuk crawling data pada satu URL, tetapu belum melakukan scraping atau crawling apapun. Mari kita berikan beberapa data untuk diekstraksi.

Jika kita melihat halaman yang ingin kita crawling, kita akan melihatnya memiliki struktur berikut:

  1. Terdapat header disetiap halaman
  2. Terdapat tautan atau link untuk masuk
  3. Lalu, terdapat kutipan itu sendiri. Ditampilkan dalam bentuk tabel atau daftar yang diurutkan. Setiap kutipan memiliki format yang serupa.

Saat menulis scraper, kita perlu melihat sumber file HTML dan membiasakan diri dengan strukturnya.

Scraping halaman ini adalah proses dua langkah:

Pertama, ambil setiap kutipan dengan mencari bagian halaman yang memiliki data yang kita inginkan. Kemudian, untuk setiap kutipan, ambil data uang kita inginkan dengan mengambilnya melalui tag HTML.

Kita akan menggunakan selector CSS untuk saat ini karena CSS sangat cocok untuk menemukan semua set di halaman. Jika kalian melihat HTML, kalian akan melihat bahwa setiap kutipan ditentukan dengan kutipan kelas. Karena kita sedang mencari kelas, kita akan menggunakan .quote untuk selector CSS kita.

Yang harus kita lakukan adalah membuat meotde baru di kelas kita bernama parse dan meneruskan selector itu ke objek respons, seperti berikut.

class QuoteSpider(scrapy.Spider):
    name = 'quote-spdier'
    start_urls = ['https://quotes.toscrape.com']

    def parse(self, response):
        QUOTE_SELECTOR = '.quote'
        TEXT_SELECTOR = '.text::text'
        AUTHOR_SELECTOR = '.author::text'
        
        for quote in response.css(QUOTE_SELECTOR):
            pass

Code diatas mengambil semua set di halaman dan mengulanginya untuk mengekstrak data. Sekarang mari kita ektrak data dari kutipan tersebut sehingga kita dapat menampilkannya.

Berdasarkan struktur html pada web yang kita crawling, memberi tahu bahwa teks dari setiap kutipan disimpan dalam rentang dengan kelas teks dan penulis kutipan dalam tag <small> dengan kelas penulis,

Objek kutipan yang kita ulangi memiliki metode css-nya sendiri, sehingga kita dapat menerukan selector untuk menemukan anak elemen. Ubah code pada file scraper.py sebagai berikut untuk menemukan kumpulan quote beserta author-nya dan menampilkannya.

class QuoteSpider(scrapy.Spider):
    name = 'quote-spdier'
    start_urls = ['https://quotes.toscrape.com']

    def parse(self, response):
        QUOTE_SELECTOR = '.quote'
        TEXT_SELECTOR = '.text::text'
        AUTHOR_SELECTOR = '.author::text'
        
        for quote in response.css(QUOTE_SELECTOR):
            yield {
                'text': quote.css(TEXT_SELECTOR).extract_first(),
                'author': quote.css(AUTHOR_SELECTOR).extract_first(),
            }

Simpan code diatas dan jalankan dengan menggunakan perintah berikut.

scrapy runspider scraper.py

Pada output nantinya akan menampilkan quotes dan author-nya. Selanjutnya, kita akan menambahkan selector baru untuk tautan ke halaman tentang penulis dan tag kutipan.

Dengan melihat HTML untuk setiap kutipan, kita menemukan tautan ke halaman tentang penulis disimpan dalam tautan tepat setelah nama mereka. Tag disimpan sebagai kumpulan dari tag, masing-masing tag digolongkan, disimpan dalam elemen div dengan kelas tag. Sekarang, mari kita ubah scraper.py kita untuk mendapatkan informasi baru ini.

class QuoteSpider(scrapy.Spider):
    name = 'quote-spdier'
    start_urls = ['https://quotes.toscrape.com']

    def parse(self, response):
        QUOTE_SELECTOR = '.quote'
        TEXT_SELECTOR = '.text::text'
        AUTHOR_SELECTOR = '.author::text'
        ABOUT_SELECTOR = '.author + a::attr("href")'
        TAGS_SELECTOR = '.tags > .tag::text'

        for quote in response.css(QUOTE_SELECTOR):
            yield {
                'text': quote.css(TEXT_SELECTOR).extract_first(),
                'author': quote.css(AUTHOR_SELECTOR).extract_first(),
                'about': 'https://quotes.toscrape.com' + 
                        quote.css(ABOUT_SELECTOR).extract_first(),
                'tags': quote.css(TAGS_SELECTOR).extract(),
            }

Simpan code diatas dan jalankan perintah berikut pada terminal.

scrapy runspider scraper.py

Langkah 3 – Crawling Multiple Pages

Kita telah berhasil mengekstrak data dari halaman awal tersebut, tetapi kita tidak mengekstrak data dari halaman selanjuttnya. Inti dari spider adalah untuk mendeteksi dan melintasi tautan ke halaman lain dan mengambil data dari halaman itu juga.

Kita akan melihat bahwa bagian atas dan bawah setiap halaman memiliki panah kanan kecil (>) yang terhubung ke halaman berikutnya. Supaya dapat mengekstrak halaman berikutnya tambahkan code berikut.

class QuoteSpider(scrapy.Spider):
    name = 'quote-spdier'
    start_urls = ['https://quotes.toscrape.com']

    def parse(self, response):
        QUOTE_SELECTOR = '.quote'
        TEXT_SELECTOR = '.text::text'
        AUTHOR_SELECTOR = '.author::text'
        ABOUT_SELECTOR = '.author + a::attr("href")'
        TAGS_SELECTOR = '.tags > .tag::text'
        NEXT_SELECTOR = '.next a::attr("href")'

        for quote in response.css(QUOTE_SELECTOR):
            yield {
                'text': quote.css(TEXT_SELECTOR).extract_first(),
                'author': quote.css(AUTHOR_SELECTOR).extract_first(),
                'about': 'https://quotes.toscrape.com' + 
                        quote.css(ABOUT_SELECTOR).extract_first(),
                'tags': quote.css(TAGS_SELECTOR).extract(),
            }

        next_page = response.css(NEXT_SELECTOR).extract_first()
        if next_page:
            yield scrapy.Request(response.urljoin(next_page))

Pertama kita menentukan selector untuk tautan halaman berikutnya, mengekstrak kecocokan pertama, dan memeriksa apakah ada. Scrapy.Request adalah objek permintaan baru yang Scrapy tahu artinya harus diambil dan diuraikan selanjutnya.

Artinya begitu kita masuk ke halaman berikutnya, kita akan mencari link ke halaman berikutnya disana, dan di halaman iu kita akan mencari link ke halaman selanjutnya, begitu seterusnya, sampai kita tidak menemukan link untuk halaman berikutnya.

Sekarang, jika kita menjalankan file scraper.py, kita akan melihat bahwa itu tidak berhenti begitu saja setelah berulang melalui halaman pertama set. Itu terus melewati semua 100 kutipan di semua 10 halaman.

Selamat, sekarang kalian telah berhasil membuat web crawling dengan menggunakan Scrapy dan Python. Kalian bisa baca juga crawling data dengan cara lainnya dibawah ini.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top