Scrapy - Öğe Ardışık Düzeni

Açıklama

Item Pipelinehurdaya ayrılan öğelerin işlendiği bir yöntemdir. Bir öğe, Öğe Hattına gönderildiğinde, bir örümcek tarafından kazınır ve sırayla yürütülen birkaç bileşen kullanılarak işlenir.

Bir öğe alındığında, aşağıdaki eylemlerden birine karar verir -

  • Öğeyi işlemeye devam edin.
  • Boru hattından bırakın.
  • Öğeyi işlemeyi durdurun.

Öğe ardışık düzenleri genellikle aşağıdaki amaçlar için kullanılır -

  • Kazınan öğeleri veri tabanında saklama.
  • Alınan öğe tekrarlanırsa, tekrarlanan öğe düşer.
  • Öğenin hedeflenen alanlarla olup olmadığını kontrol edecektir.
  • HTML verilerini temizleme.

Sözdizimi

Aşağıdaki yöntemi kullanarak Item Pipeline yazabilirsiniz -

process_item(self, item, spider)

Yukarıdaki yöntem aşağıdaki parametreleri içerir -

  • Öğe (öğe nesnesi veya sözlük) - Kazınan öğeyi belirtir.
  • örümcek (örümcek nesnesi) - Öğeyi sıyıran örümcek.

Aşağıdaki tabloda verilen ek yöntemleri kullanabilirsiniz -

Sr.No Yöntem ve Açıklama Parametreler
1

open_spider(self, spider)

Örümcek açıldığında seçilir.

örümcek (örümcek nesnesi) - Açılan örümceği ifade eder.

2

close_spider(self, spider)

Örümcek kapatıldığında seçilir.

örümcek (örümcek nesnesi) - Kapalı olan örümceği ifade eder.

3

from_crawler(cls, crawler)

Tarayıcı yardımıyla, ardışık düzen, Scrapy sinyalleri ve ayarları gibi temel bileşenlere erişebilir.

tarayıcı (Tarayıcı nesnesi) - Bu ardışık düzeni kullanan tarayıcıyı ifade eder.

Misal

Aşağıda, farklı kavramlarda kullanılan öğe ardışık düzeni örnekleri verilmiştir.

Etiketsiz Öğeleri Bırakma

Aşağıdaki kodda, ardışık düzen, KDV içermeyen öğeler için (fiyat) özelliğini dengeler (hariç_vat özelliği) ve fiyat etiketi olmayan öğeleri yok sayar

from Scrapy.exceptions import DropItem  
class PricePipeline(object): 
   vat = 2.25 

   def process_item(self, item, spider): 
      if item['price']: 
         if item['excludes_vat']: 
            item['price'] = item['price'] * self.vat 
            return item 
         else: 
            raise DropItem("Missing price in %s" % item)

Bir JSON Dosyasına Öğe Yazma

Aşağıdaki kod, tüm örümceklerden kazınan tüm öğeleri tek bir items.jlJSON biçiminde serileştirilmiş bir formda satır başına bir öğe içeren dosya. JsonWriterPipeline sınıf, kodda öğe ardışık düzeninin nasıl yazılacağını göstermek için kullanılır

import json  

class JsonWriterPipeline(object): 
   def __init__(self): 
      self.file = open('items.jl', 'wb') 

   def process_item(self, item, spider): 
      line = json.dumps(dict(item)) + "\n" 
      self.file.write(line) 
      return item

MongoDB'ye Öğe Yazma

MongoDB adresini ve veritabanı adını Scrapy ayarlarında belirtebilirsiniz ve MongoDB koleksiyonu öğe sınıfından sonra isimlendirilebilir. Aşağıdaki kod nasıl kullanılacağını açıklarfrom_crawler() kaynakları düzgün bir şekilde toplama yöntemi -

import pymongo  

class MongoPipeline(object):  
   collection_name = 'Scrapy_list' 

   def __init__(self, mongo_uri, mongo_db): 
      self.mongo_uri = mongo_uri 
      self.mongo_db = mongo_db 

   @classmethod 
   def from_crawler(cls, crawler): 
      return cls( 
         mongo_uri = crawler.settings.get('MONGO_URI'), 
         mongo_db = crawler.settings.get('MONGO_DB', 'lists') 
      ) 
  
   def open_spider(self, spider): 
      self.client = pymongo.MongoClient(self.mongo_uri) 
      self.db = self.client[self.mongo_db] 

   def close_spider(self, spider): 
      self.client.close() 

   def process_item(self, item, spider): 
      self.db[self.collection_name].insert(dict(item)) 
      return item

Filtreleri Çoğaltma

Bir filtre, tekrarlanan öğeleri kontrol edecek ve önceden işlenmiş öğeleri bırakacaktır. Aşağıdaki kodda, öğelerimiz için benzersiz bir kimlik kullandık, ancak örümcek aynı kimliğe sahip birçok öğe döndürür -

from scrapy.exceptions import DropItem  

class DuplicatesPipeline(object):  
   def __init__(self): 
      self.ids_seen = set() 

   def process_item(self, item, spider): 
      if item['id'] in self.ids_seen: 
         raise DropItem("Repeated items found: %s" % item) 
      else: 
         self.ids_seen.add(item['id']) 
         return item

Bir Öğe Ardışık Düzeni Etkinleştirme

Aşağıdaki kodda gösterildiği gibi , sınıfını ITEM_PIPELINES ayarına ekleyerek bir Öğe Ardışık Düzeni bileşenini etkinleştirebilirsiniz . Sınıflara çalıştıkları sırayla tamsayı değerleri atayabilirsiniz (sıra daha yüksek değerli sınıflara göre daha düşük olabilir) ve değerler 0-1000 aralığında olacaktır.

ITEM_PIPELINES = {
   'myproject.pipelines.PricePipeline': 100,
   'myproject.pipelines.JsonWriterPipeline': 600,
}