CrawlSpider adalah spider yang paling umum digunakan untuk crawling websites. CrawlSpider terdapat mekanisme untuk following links yang dapat diatur melalui Rule.
Untuk menentukan rule, digunakan Object Link_Extractor untuk menentukan bagaimana sebuah link akan diextract, dan paramater lainnya seperti follow dan callback. Untuk lebih jelasnya mari kita buat project baru dengan perintah dibawah.
scrapy startproject books_crawler
Masuk kedalam directory books_crawlerm, lalu buat spider baru
scrapy genspider books books.toscrape.com
Ubah setting ROBOTSTXT_OBEY menjadi False pada file settings.py, karena books.toscrape.com tidak memiliki robot.txt.
Kemudian buka file books.py, lalu masukan code dibawah.
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class BooksSpider(CrawlSpider):
name = 'books'
allowed_domains = ['books.toscrape.com']
start_urls = ['http://books.toscrape.com/']
rules = (Rule(LinkExtractor(deny_domains=('facebook.com'), allow='travel'), callback='parse', follow=False),)
def parse(self, response):
yield {'URL': response.url}
Pertama yang perlu diperhatikan disini adalah Library yaitu CrawlSpider, Rule dan LinkExtractor.
Kemudian, cara penggunaan Rule, dimana dapat memiliki attribut
LinkExtractor(), dapat berisi parameter
- deny_domains, untuk mencegah crawler ke domain yang didefinisikan (jika domain yang kita crawl terdapat link ke site tersebut).
- allow, adalah regular expression, bisa single atau berupa list. Jika sesuai, link akan diextract. Jika kosong, maka seluruh link akan diextract.
callback, adalah fungsi yang akan dipanggil, pada contoh digunakan fungsi parse.
follow, True, maka scrapy akan follow link jika terjadi perpindahan halaman. Pada kasus books.toscrape.com, button next yang berisi link kehalaman berikutnya akan dicrawl. Jika False, maka crawler akan berhenti dihalamn pertama.
Jadi pada code diatas, scrapy hanya akan scraping url yang match dengan allow=travel. Log akan berisi kurang lebih seperti dibawah.
...
...
2021-02-06 16:53:03 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://books.toscrape.com/> (referer: None)
2021-02-06 16:53:03 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://books.toscrape.com/catalogue/category/books/travel_2/index.html> (referer: http://books.toscrape.com/)
2021-02-06 16:53:04 [scrapy.core.scraper] DEBUG: Scraped from <200 http://books.toscrape.com/catalogue/category/books/travel_2/index.html>
{'URL': 'http://books.toscrape.com/catalogue/category/books/travel_2/index.html'}
2021-02-06 16:53:04 [scrapy.core.engine] INFO: Closing spider (finished)
2021-02-06 16:53:04 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 525,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
...
...
Silakan bereksperimen dengan menghapus parameter allow, atau mengubah isi parameter allow.
Perhatian, jika parameter follow diisi True, proses crawling akan cukup lama.
Untuk dokumentasi lengkap LinkExtractor, lihat di https://docs.scrapy.org/en/latest/topics/link-extractors.html#topics-link-extractors