Scrapy - Laba-laba

Deskripsi

Spider adalah kelas yang bertanggung jawab untuk menentukan cara mengikuti tautan melalui situs web dan mengekstrak informasi dari halaman.

Laba-laba default Scrapy adalah sebagai berikut -

scrapy.Spider

Itu adalah laba-laba yang harus diwarisi oleh setiap laba-laba lainnya. Ini memiliki kelas berikut -

class scrapy.spiders.Spider

Tabel berikut menunjukkan bidang kelas scrapy.Spider -

Sr Tidak Bidang & Deskripsi
1

name

Itu adalah nama laba-laba Anda.

2

allowed_domains

Ini adalah daftar domain tempat laba-laba merayap.

3

start_urls

Ini adalah daftar URL, yang akan menjadi root untuk penjelajahan nanti, di mana laba-laba akan mulai merayapi.

4

custom_settings

Ini adalah pengaturan, saat menjalankan spider, akan diganti dari konfigurasi lebar proyek.

5

crawler

Ini adalah atribut yang tertaut ke objek Crawler yang diikat oleh instance spider.

6

settings

Ini adalah pengaturan untuk menjalankan laba-laba.

7

logger

Ini adalah logger Python yang digunakan untuk mengirim pesan log.

8

from_crawler(crawler,*args,**kwargs)

Ini adalah metode kelas, yang menciptakan laba-laba Anda. Parameternya adalah -

  • crawler - Crawler tempat instance spider akan diikat.

  • args(list)- Argumen ini diteruskan ke metode _init_ () .

  • kwargs(dict)- Argumen kata kunci ini diteruskan ke metode _init_ () .

9

start_requests()

Ketika tidak ada URL tertentu yang ditentukan dan spider dibuka untuk dihapus, Scrapy memanggil metode start_requests () .

10

make_requests_from_url(url)

Ini adalah metode yang digunakan untuk mengubah url menjadi permintaan.

11

parse(response)

Metode ini memproses respons dan mengembalikan data yang dihapus mengikuti lebih banyak URL.

12

log(message[,level,component])

Ini adalah metode yang mengirimkan pesan log melalui spiders logger.

13

closed(reason)

Metode ini dipanggil saat laba-laba menutup.

Argumen Laba-laba

Argumen spider digunakan untuk menentukan URL awal dan diteruskan menggunakan perintah crawl dengan -a opsi, ditampilkan sebagai berikut -

scrapy crawl first_scrapy -a group = accessories

Kode berikut menunjukkan bagaimana laba-laba menerima argumen -

import scrapy 

class FirstSpider(scrapy.Spider): 
   name = "first" 
   
   def __init__(self, group = None, *args, **kwargs): 
      super(FirstSpider, self).__init__(*args, **kwargs) 
      self.start_urls = ["http://www.example.com/group/%s" % group]

Laba-laba Generik

Anda dapat menggunakan laba-laba umum untuk membuat subkelas dari laba-laba Anda. Tujuan mereka adalah mengikuti semua tautan di situs web berdasarkan aturan tertentu untuk mengekstrak data dari semua halaman.

Untuk contoh yang digunakan dalam spider berikut, anggaplah kita memiliki proyek dengan bidang berikut -

import scrapy 
from scrapy.item import Item, Field 
  
class First_scrapyItem(scrapy.Item): 
   product_title = Field() 
   product_link = Field() 
   product_description = Field()

CrawlSpider

CrawlSpider mendefinisikan sekumpulan aturan untuk mengikuti link dan menghapus lebih dari satu halaman. Ini memiliki kelas berikut -

class scrapy.spiders.CrawlSpider

Berikut adalah atribut dari kelas CrawlSpider -

aturan

Ini adalah daftar objek aturan yang menentukan bagaimana crawler mengikuti link.

Tabel berikut menunjukkan aturan kelas CrawlSpider -

Sr Tidak Aturan & Deskripsi
1

LinkExtractor

Ini menentukan bagaimana spider mengikuti tautan dan mengekstrak data.

2

callback

Ini akan dipanggil setelah setiap halaman dikikis.

3

follow

Ini menentukan apakah akan melanjutkan tautan berikut atau tidak.

parse_start_url (tanggapan)

Ini mengembalikan item atau objek permintaan dengan mengizinkan untuk mengurai respons awal.

Note - Pastikan Anda mengganti nama fungsi parse selain parse saat menulis aturan karena fungsi parse digunakan oleh CrawlSpider untuk mengimplementasikan logikanya.

Mari kita lihat contoh berikut, di mana spider mulai merayapi beranda demoexample.com, mengumpulkan semua halaman, tautan, dan parsing dengan metode parse_items -

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class DemoSpider(CrawlSpider):
   name = "demo"
   allowed_domains = ["www.demoexample.com"]
   start_urls = ["http://www.demoexample.com"]
      
   rules = ( 
      Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)),
         callback = "parse_item", follow = True),
   )
   
   def parse_item(self, response):
      item = DemoItem()
      item["product_title"] = response.xpath("a/text()").extract()
      item["product_link"] = response.xpath("a/@href").extract()
      item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract()
      return items

XMLFeedSpider

Ini adalah kelas dasar untuk spider yang mengikis dari umpan XML dan melakukan iterasi pada node. Ini memiliki kelas berikut -

class scrapy.spiders.XMLFeedSpider

Tabel berikut menunjukkan atribut kelas yang digunakan untuk menyetel iterator dan nama tag -

Sr Tidak Atribut & Deskripsi
1

iterator

Ini mendefinisikan iterator yang akan digunakan. Ini bisa berupa iternodes, html atau xml . Default-nya adalah iternode .

2

itertag

Ini adalah string dengan nama node untuk diiterasi.

3

namespaces

Ini didefinisikan oleh daftar tupel (awalan, uri) yang secara otomatis mendaftarkan ruang nama menggunakan metode register_namespace () .

4

adapt_response(response)

Ia menerima respon dan memodifikasi tubuh respon segera setelah ia tiba dari middleware laba-laba, sebelum laba-laba mulai menguraikannya.

5

parse_node(response,selector)

Ini menerima respons dan pemilih ketika dipanggil untuk setiap node yang cocok dengan nama tag yang diberikan.

Note - Laba-laba Anda tidak akan berfungsi jika Anda tidak mengganti metode ini.

6

process_results(response,results)

Ini mengembalikan daftar hasil dan respons yang dikembalikan oleh laba-laba.

CSVFeedSpider

Ini melakukan iterasi melalui setiap barisnya, menerima file CSV sebagai respons, dan memanggil metode parse_row () . Ini memiliki kelas berikut -

class scrapy.spiders.CSVFeedSpider

Tabel berikut menunjukkan opsi yang dapat diatur terkait file CSV -

Sr Tidak Opsi & Deskripsi
1

delimiter

Ini adalah string yang berisi pemisah koma (',') untuk setiap bidang.

2

quotechar

Ini adalah string yang berisi tanda kutip ('"') untuk setiap bidang.

3

headers

Ini adalah daftar pernyataan dari mana bidang dapat diekstraksi.

4

parse_row(response,row)

Ini menerima respons dan setiap baris bersama dengan kunci untuk header.

Contoh CSVFeedSpider

from scrapy.spiders import CSVFeedSpider
from demoproject.items import DemoItem  

class DemoSpider(CSVFeedSpider): 
   name = "demo" 
   allowed_domains = ["www.demoexample.com"] 
   start_urls = ["http://www.demoexample.com/feed.csv"] 
   delimiter = ";" 
   quotechar = "'" 
   headers = ["product_title", "product_link", "product_description"]  
   
   def parse_row(self, response, row): 
      self.logger.info("This is row: %r", row)  
      item = DemoItem() 
      item["product_title"] = row["product_title"] 
      item["product_link"] = row["product_link"] 
      item["product_description"] = row["product_description"] 
      return item

SitemapSpider

SitemapSpider dengan bantuan Peta Situs merayapi situs web dengan mencari URL dari robots.txt. Ini memiliki kelas berikut -

class scrapy.spiders.SitemapSpider

Tabel berikut menunjukkan bidang SitemapSpider -

Sr Tidak Bidang & Deskripsi
1

sitemap_urls

Daftar URL yang ingin Anda crawl yang mengarah ke peta situs.

2

sitemap_rules

Ini adalah daftar tupel (regex, callback), di mana regex adalah ekspresi reguler, dan callback digunakan untuk memproses URL yang cocok dengan ekspresi reguler.

3

sitemap_follow

Ini adalah daftar ekspresi reguler peta situs yang harus diikuti.

4

sitemap_alternate_links

Menentukan link alternatif yang akan diikuti untuk satu url.

Contoh SitemapSpider

SitemapSpider berikut memproses semua URL -

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/sitemap.xml"]  
   
   def parse(self, response): 
      # You can scrap items here

SitemapSpider berikut memproses beberapa URL dengan callback -

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/sitemap.xml"] 
   
   rules = [ 
      ("/item/", "parse_item"), 
      ("/group/", "parse_group"), 
   ]  
   
   def parse_item(self, response): 
      # you can scrap item here  
   
   def parse_group(self, response): 
      # you can scrap group here

Kode berikut menunjukkan peta situs di robots.txt yang memiliki url /sitemap_company -

from scrapy.spiders import SitemapSpider

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/robots.txt"] 
   rules = [ 
      ("/company/", "parse_company"), 
   ] 
   sitemap_follow = ["/sitemap_company"]  
   
   def parse_company(self, response): 
      # you can scrap company here

Anda bahkan dapat menggabungkan SitemapSpider dengan URL lain seperti yang ditunjukkan pada perintah berikut.

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/robots.txt"] 
   rules = [ 
      ("/company/", "parse_company"), 
   ]  
   
   other_urls = ["http://www.demoexample.com/contact-us"] 
   def start_requests(self): 
      requests = list(super(DemoSpider, self).start_requests()) 
      requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls] 
      return requests 

   def parse_company(self, response): 
      # you can scrap company here... 

   def parse_other(self, response): 
      # you can scrap other here...