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,
}