您好:
參考書本
架構大致如下
Ch8_4_2\spiders\ pttnba.py class PttnbaSpider
Ch8_4_2\items.py class NBAItem
Ch8_4_2\pipelines.py class PttPipeline
Ch8_4_2\settings.py "Ch8_4_2.pipelines.PttPipeline": 300
請問,我執行scrapy crawl pttnba -o pttnba.json
PttnbaSpider 如何知道要對應 使用 class PttPipeline
(因為目前只有一個 Pipeline,要是有多個?)
就前面名稱沒有對應 ,有settings.py 有設定 pipelines.py
但 PttnbaSpider 沒看到有對應到要用class PttPipeline
謝謝
相關程式碼如下
class NBAItem(scrapy.Item):
#定義Item欄位
title= scrapy.Field();
vote= scrapy.Field();
author =scrapy.Field();
#pass
import scrapy
from Ch8_4_2.items import NBAItem #前一步驟建立的
class PttnbaSpider(scrapy.Spider):
name = "pttnba"
allowed_domains = ["ptt.cc"]
start_urls = ['https://www.ptt.cc/bbs/NBA/index.html']
def parse(self, response):
for sel in response.css(".r-ent"):
item = NBAItem()
item["title"] = sel.css("div.title > a::text").extract_first()
item["vote"] = \
sel.xpath("./div[@class='nrec']/span/text()").extract_first()
item["author"] = \
sel.xpath("./div[@class='meta']/div[1]/text()").extract_first()
yield item
from scrapy.exceptions import DropItem
class PttPipeline(object):
def process_item(self, item, spider):
if item["vote"]:
if item["vote"]=="爆":
item["vote"]=500
else:
item["vote"]= int( item["vote"] ) + 5
return item
else:
raise DropItem("沒有推文數:%s" % item) #丟出例外
ITEM_PIPELINES = {
"Ch8_4_2.pipelines.PttPipeline": 300,
}
您好!在 Scrapy 中,PttnbaSpider
如何知道要使用 PttPipeline
是透過 settings.py
文件中的 ITEM_PIPELINES
設定來實現的。這個設定告訴 Scrapy 在處理 item 時應該使用哪些 pipelines 以及它們的順序。
在您的 settings.py
文件中,您已經定義了:
ITEM_PIPELINES = {
"Ch8_4_2.pipelines.PttPipeline": 300,
}
這表示 Scrapy 會使用 Ch8_4_2.pipelines.PttPipeline
來處理 item,並且它的優先級是 300。這個設定會自動應用到所有的 spiders,包括 PttnbaSpider
。
如果有多個 pipelines,您可以在 ITEM_PIPELINES
中添加更多的條目,每個條目對應一個 pipeline,並且可以設定不同的優先級。例如:
ITEM_PIPELINES = {
"Ch8_4_2.pipelines.PttPipeline": 300,
"Ch8_4_2.pipelines.AnotherPipeline": 400,
}
這樣,Scrapy 會先使用 PttPipeline
處理 item,然後再使用 AnotherPipeline
。