2016-07-19 10 views
0

でHTTPリクエストを作る私はパイプラインでこのScrapyは、パイプライン

{ 
    name: "Foo", 
    country: "US", 
    url: "http://..." 
} 

は私がURLにGETリクエストを作成し、CONTENT_TYPEとステータスのようないくつかのヘッダーを確認したいように見える掻き取ったアイテムを持っていると仮定します。ヘッダーが特定の条件を満たしていないときは、アイテムをドロップします。同様

class MyPipeline(object): 
    def process_item(self, item, spider): 
     request(item['url'], function(response) { 
      if (...) { 
      raise DropItem() 
      } 
      return item 
     }, function(error){ 
      raise DropItem() 
     }) 

パイプラインを使用してこのような匂いはありません。どう思いますか?どのようにこれを達成するための任意のアイデアですか?

クモ:

import scrapy 
import json 

class StationSpider(scrapy.Spider): 
    name = 'station' 
    start_urls = ['http://...'] 

    def parse(self, response): 
     jsonResponse = json.loads(response.body_as_unicode()) 
     for station in jsonResponse: 
      yield station 

答えて

2

簡単な方法

import requests 

def process_item(self, item, spider): 
    response = requests.get(item['url']) 
    if r.status_code ...: 
     raise DropItem() 
    elif response.text ...: 
     raise DropItem() 
    else: 
     return item 

Scrapyの道

今、私はあなたがパイプライン内でこれを行うべきではないと思う、あなたが扱うべきそれは蜘蛛の中でアイテムを生み出すのではなく、要求をしてから、アイテムを盗む。我々はパイプライン内のクモのコールバックの同じ動作をエミュレートしている

class MyPipeline(object): 

    def __init__(self, crawler): 
     self.crawler = crawler 

    @classmethod 
    def from_crawler(cls, crawler): 
     return cls(crawler) 

    def process_item(self, item, spider): 
     ... 
     self.crawler.engine.crawl(
        Request(
         url='someurl', 
         callback=self.custom_callback, 
        ), 
        spider, 
       ) 

     # you have to drop the item, and send it again after your check 
     raise DropItem() 
    # YES, you can define a method callback inside the same pipeline 
    def custom_callback(self, response): 
     ... 
     yield item 

チェック:

は今、あなたはまだあなたがこのような何かを行うことができますパイプラインの内側scrapy要求を含める場合。余分な要求をしたいときにアイテムをドロップする方法を見つけ出し、余分なコールバックによって存在しているものだけを渡す必要があります。

一つの方法は、アイテムの種類を送信し、パイプラインのprocess_item内にそれらをチェックすることができます

def process_item(self, item, spider): 
    if isinstance(item, TempItem): 
     ... 
    elif isinstance(item, FinalItem): 
     yield item 
+0

あなたはそれを蜘蛛の内部scrapyの方法を行うためのいくつかのコードを表示することができますか?それは正しい解決策であるようです。 –

+0

あなたはあなたのスパイダーのコードを共有する必要があります(または、あなたがあなたが後でチェックしたいそれらのURLを持つ項目を生み出している部分) – eLRuLL