パイプラインパイプラインscrapyフレームワーク

アイテムのパイプラインの紹介

アイテムのパイプラインは、Webアイテムから引き出されたクモに対処するための主要な責任である、彼の主なタスクは、きれいに検証し、データを格納することです。
ページスパイダに解析されるとき、アイテムがパイプに送信され、処理データのいくつかの特定の順序の後にすることができます。
項目ダクトは、各クラスの成分は、その単純なPythonの方法を有しています。
彼らは、アイテムを取得し、そのメソッドを実行し、彼らはまた、アイテムのパイプライン内の次のステップに進むかどうかを判断する必要があるか、直接処理せずに廃棄されました。

実行パイプラインプロジェクト

HTMLデータをクリーンアップ
分析データ(項目が必要なフィールドが含まれて確認してください)確認するために、
(あなたは、重複を削除した場合)をチェックし、重複データかどうかを
、データベースに格納されたデータを解析します

独自のアイテムのパイプラインを書きます

各プロジェクトのパイプラインコンポーネントは、Pythonのクラスでは、次のメソッドを実装する必要があります。

process_item(自己、アイテム、クモ)

この方法は、各プロジェクトのパイプラインコンポーネントのために呼ばれています。process_item()は、辞書バンドデータを返すアイテム(または任意の子孫クラス)を返すオブジェクト、またはツイスト繰延上げDropItemexceptionを返す必要があります。他の項目を破棄することはもはやパイプラインコンポーネントによって処理されていません。

パラメータ:

  • アイテム(Itemobjectまたは辞書) - カットプロジェクト
  • スパイダー(クモオブジェクト) - スパイダーのクロールアイテム

さらに、彼らはまた、次のメソッドを実装することができます:

クモが開いているときにこのメソッドが呼び出されます。
open_spider(自己、クモ)    #のパラメータースパイダーオープンクモ

このメソッドは、ときクモオフと呼ばれています。
close_spider(セルフ、クモ)    #のパラメータスパイダー閉じスパイダーある

存在する場合、そのような方法は、例えばクローラからパイプラインを作成するために呼び出されます。これは、パイプの新しいインスタンスを返す必要があります。クローラScrapyオブジェクトは、すべてのコア構成要素(例えば、信号と設定)へのアクセスを提供し、それはパイプアクセスそれらの関数であり、方法Scrapyにフックします。
from_crawler(CLS、クローラ)   #のパラメータークローラ(Crawlerobject) -このパイプクローラの使用

ファイル形式のJSONに保存するキャプチャアイテム

JSON形式としてシリアル化クモからアイテムを取得し、行のitems.jl各項目の形式でファイルに書き込まれます。

インポートのJSON 
  
クラスJsonWriterPipeline(オブジェクト):
  
  デフ __init__ (自己):
    self.file =オープン(' items.jl '' WB ' 
  
  DEF process_item(自己、アイテム、クモ):
    ライン = json.dumps(dictの(アイテム) )+ " \ nは" 
    self.file.write(ライン)
    の戻り項目

重複を削除

その後、我々はprocess_item機能をフィルタリングすることができ、アイテムIDの重複蜘蛛に抽出されたと仮定し

scrapy.exceptions インポートDropItem 
  
クラス:DuplicatesPipeline(オブジェクト)
  
  デフ __init__ (自己):
    self.ids_seen = セット()
  
  DEF process_item(自己、アイテム、クモの) 
     場合は [アイテム' ID ' ] self.ids_seen: 
       上げる DropItemを(" 重複項目見つかりました:%S "%のアイテム) 
     
      self.ids_seen.add(項目[ ' ID ' ]) 
       戻り項目

活性成分ItemPipeline

settings.pyファイル、ITEM_PIPELINESクラス名にプロジェクトのパイプラインを追加するには、プロジェクトのパイプラインコンポーネントをアクティブにすることができます

ITEM_PIPELINES = { 
   ' myproject.pipeline.PricePipeline ' 300 ' myproject.pipeline.JsonWriterPipeline ':800 
}

画像パイプライン

アイテム

定義されたフィルタフィールド

輸入scrapyの

クラスImgpilelineproItem(scrapy.Item):
    似ここにあなたの項目のフィールドを定義します 
    (img_src = scrapy.Field)

クモ

ただ、画像を取得し、ITMEダウンロードにそれを提出します

インポートscrapy
 から imgPileLinePro.items インポートImgpilelineproItemの

クラスImgSpider(scrapy.Spider): = ' IMG ' 
    allowed_domains = [ 'www.xxx.com'] 
    start_urls = [ ' http://pic.netbian.com/4kmeinv/ ' ] 
    URL = ' http://pic.netbian.com/4kmeinv/index_%d.html ' 
    ページ = 2 DEF 解析(自己、応答):
        li_list = response.xpath(" // * [ID @ = "メイン" ] / DIV [3] / UL /李"のための

    li_list:
            img_src = ' http://pic.netbian.com ' + li.xpath(' ./a/img/@src ' ).extract_first()
            項目 = ImgpilelineproItem()
            項目[ ' img_src ' ] = img_src 

            収率項目

        場合 self.page <= 2 :#爬取前两页
            NEW_URL =フォーマット(self.urlの%のself.page)
            self.page + = 1つの
             収率 scrapy.Request(URL = NEW_URL、コールバック= self.parse)

パイプライン

scrapy.pipelines.images インポートImagesPipeline
 インポートScrapyの

#は、画像パイプラインをダウンロードするために使用される
クラス:ImgPileLine(ImagesPipeline)を
     #は、要求項目を受信し、アイテムが送信img_src用に格納されている
    DEFのget_media_requests(セルフ、アイテム情報):
         収率 Scrapy。リクエスト(URL =項目[ img_srcは]) 

    パスデータストアを指定します(フォルダ[設定ファイルで指定] +画像名を[処理に戻る])
    DEFの FILE_PATH(セルフ、リクエスト、レスポンス=なし、情報= なし):
        img_name = request.url.split(' / ') - 1 ]
         リターンimg_nameの

    アイテムが実行される次のパイプラインクラスに渡される
    DEF item_completed(セルフ、結果、項目、情報):
         リターン・アイテム

設定の構成

#のダウンロード経路指定されたファイル 
IMAGES_STORE = ' ./imgsLib 'ファイルが自動的に作成#1であり、
#は、パイプライン・イネーブル 
ITEM_PIPELINES = {
    ' imgPileLinePro.pipelines.ImgPileLine ':300 
}

 

おすすめ

転載: www.cnblogs.com/songzhixue/p/11334851.html