Trị liệu - Đường ống vật phẩm
Sự miêu tả
Item Pipelinelà một phương pháp mà các mục đã loại bỏ được xử lý. Khi một mục được gửi đến Đường ống mục, nó sẽ được quét bởi một con nhện và xử lý bằng cách sử dụng một số thành phần, được thực thi tuần tự.
Bất cứ khi nào một vật phẩm được nhận, nó sẽ quyết định một trong các hành động sau:
- Tiếp tục xử lý mặt hàng.
- Thả nó khỏi đường ống.
- Dừng xử lý mặt hàng.
Đường ống hạng mục thường được sử dụng cho các mục đích sau:
- Lưu trữ các mục cóp nhặt trong cơ sở dữ liệu.
- Nếu mục đã nhận được lặp lại, thì nó sẽ rơi ra mục đã lặp lại.
- Nó sẽ kiểm tra xem mục đó có thuộc các trường được nhắm mục tiêu hay không.
- Xóa dữ liệu HTML.
Cú pháp
Bạn có thể viết Đường ống mục bằng phương pháp sau:
process_item(self, item, spider)
Phương thức trên chứa các tham số sau:
- Mục (đối tượng mục hoặc từ điển) - Nó chỉ định mục đã cạo.
- spider (vật thể con nhện) - Con nhện cạo đồ vật.
Bạn có thể sử dụng các phương pháp bổ sung được cung cấp trong bảng sau:
Sr.No | Phương pháp & Mô tả | Thông số |
---|---|---|
1 | open_spider(self, spider) Nó được chọn khi mở spider. |
spider (vật thể con nhện) - Nó dùng để chỉ con nhện đã được mở ra. |
2 | close_spider(self, spider) Nó được chọn khi đóng spider. |
spider (vật thể con nhện) - Nó đề cập đến con nhện đã được đóng lại. |
3 | from_crawler(cls, crawler) Với sự trợ giúp của trình thu thập thông tin, đường ống có thể truy cập vào các thành phần cốt lõi như tín hiệu và cài đặt của Scrapy. |
trình thu thập thông tin (Đối tượng trình thu thập thông tin) - Nó đề cập đến trình thu thập thông tin sử dụng đường ống này. |
Thí dụ
Sau đây là các ví dụ về đường ống mục được sử dụng trong các khái niệm khác nhau.
Bỏ các mục không có thẻ
Trong đoạn mã sau, quy trình cân bằng thuộc tính (price) cho những mặt hàng không bao gồm VAT (thuộc tínhludes_vat) và bỏ qua những mặt hàng không có thẻ giá -
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)
Ghi các mục vào tệp JSON
Đoạn mã sau sẽ lưu trữ tất cả các mục cóp nhặt từ tất cả các nhện thành một items.jltệp, chứa một mục trên mỗi dòng ở dạng tuần tự hóa ở định dạng JSON. CácJsonWriterPipeline lớp được sử dụng trong mã để hiển thị cách viết đường dẫn mục -
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
Viết các mục lên MongoDB
Bạn có thể chỉ định địa chỉ MongoDB và tên cơ sở dữ liệu trong cài đặt Scrapy và bộ sưu tập MongoDB có thể được đặt tên theo lớp mục. Đoạn mã sau mô tả cách sử dụngfrom_crawler() phương pháp thu thập tài nguyên đúng cách -
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
Bộ lọc trùng lặp
Một bộ lọc sẽ kiểm tra các mục lặp lại và nó sẽ loại bỏ các mục đã được xử lý. Trong đoạn mã sau, chúng tôi đã sử dụng một id duy nhất cho các mặt hàng của mình, nhưng spider trả về nhiều mặt hàng có cùng một id -
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
Kích hoạt một đường ống mặt hàng
Bạn có thể kích hoạt thành phần Đường ống mặt hàng bằng cách thêm lớp của nó vào cài đặt ITEM_PIPELINES như được hiển thị trong đoạn mã sau. Bạn có thể gán giá trị số nguyên cho các lớp theo thứ tự chúng chạy (thứ tự có thể có giá trị thấp hơn cho các lớp có giá trị cao hơn) và các giá trị sẽ nằm trong phạm vi 0-1000.
ITEM_PIPELINES = {
'myproject.pipelines.PricePipeline': 100,
'myproject.pipelines.JsonWriterPipeline': 600,
}