2017-02-22 1 views
1

あるスパイダーのスクラップしたURLを別のスパイダーのstart_urlsに送るにはどうすればいいですか?あるスパイダーから別のスパイダーに擦ったURLを渡す

具体的には、XMLページからURLのリストを取得するスパイダーを1つ実行します。 URLを取得した後、別のスパイダーが掻き集めるために使用します。

from scrapy.spiders import SitemapSpider 

class Daily(SitemapSpider): 
    name = 'daily' 
    sitemap_urls = ['http://example.com/sitemap.xml'] 

    def parse(self, response): 
     print response.url 

     # How do I send these URL's to another spider instead? 

     yield { 
      'url': response.url 
     } 
+0

これをすべて1つのスパイダーで行うことは、もっと理にかなっています。 2つのスパイダーを使用する理由は何ですか? –

答えて

0

ファイルにURLを文字列として書き込みます。他のスパイダーの同じファイルからそれらを読んでください。

0

なぜあなたはそのようなrequirmentのために異なるスパイダーを使いたいのですか?

スパイダーが1つしかない場合は、別のスパイダーにURLを渡すのではなく、parseメソッドでyieldもう1つRequestとします。あなたには、いくつかのDBにURLを保存したり、パイプラインを経由して、たとえば、いくつかのキュー(Zerro、ラビットMQ、Redisの)に送ることができる最初のクモから

from scrapy.spiders import SitemapSpider 

class Daily(SitemapSpider): 
    name = 'daily' 
    sitemap_urls = ['http://example.com/sitemap.xml'] 

    def parse(self, response): 

     yield Request(url="URL here", callback=callback_function) 
+0

たとえば、スパイダーAは特定のウェブサイト構造を扱うように特化され、スパイダーBは異なるウェブサイト構造を扱うために汎用/特殊であるかもしれない。この答えは質問に全く答えません。 – maestromusica

+0

@maestromusicaは単純なif-else条件を持ってドメインを決定し、各ウェブサイトに異なるロジックを使用します – Umair

1

第二クモはメソッドでURLを取得することができます - start_requests

class MySpider(scrapy.Spider): 
    name = 'myspider' 

    def start_requests(self): 
     urls = my_db.orm.get('urls'); 
     for url in urls: 
      yield scrapy.Request(url) 

やURLはcliまたはAPIを経由してキューブローカーからクモに渡すことができます。またはスパイダーはブローカーから起動され、スパイダーはstart_requestsによって自分のURLを取得することができます。

あなたは本当にそれを行うことができます多くの方法が存在します。方法は、あなたが1つのスパイダーから他のスパイダーにURLを渡す必要がある理由の基準に依存します。

このプロジェクトを確認することができます:Scrapy-Cluster、Scrapy-Redisあなたが探しているものかもしれません。

関連する問題