2017-07-11 13 views
1

ミドルウェアは1つのリクエストを受け取り、2つの異なるリクエストのジェネレータに変換します。私が知る限り、ダウンローダーのミドルウェアprocess_request()メソッドは、それらのジェネレータではなく、単一のリクエストを返すことができます。任意のリクエストを複数のリクエストに分割する良い方法はありますか?シングルリクエストを複数のリクエストに置き換えるためのスキルミドルウェア

クモのミドルウェアprocess_start_requestsが実際にダウンローダを介して送信されているstart_requests要求を発生したようです。例えば、場合、私は、それがConnectionRefusedErrorで失敗しますstart_urls = ['https://localhost/']

def process_start_requests(self, start_requests, spider): 
    yield Request('https://stackoverflow.com') 

を設定してみましたとlocalhost要求に失敗しました。

+1

エラーを再現できません。スパイダーミドルウェアで 'process_start_requests'を定義し、' scrapy.Request( 'http://www.stackoverflow.com')が私のために働きます –

+0

@paultrmbrthそうです。それは私の問題の原因ではありませんでした。 [この質問](https://stackoverflow.com/questions/45026532/async-query-database-for-keys-to-use-in-multiple-requests)私の苦境をより良く説明します。 – Hatshepsut

答えて

2

私は複数の要求に(送信される前に)要求を変換背後にあるロジックがどうなるか分からないが、あなたはまだこれで、ミドルウェアからいくつかの要求(あるいはアイテム)を生成することができます

def process_request(self, request, spider): 
    for a in range(10): 
     spider.crawler.engine.crawl(
      Request(url='myurl', callback=callback_method), 
      spider) 
+0

これは引き続き次のダウンローダミドルウェアを経由しますか? – Hatshepsut

+0

完全にはわかりませんが、そうだと思います。 – eLRuLL

+0

Requestの代わりにDeferredを送信する方法はありますか?スケジューラーのミドルウェアが遅延引数を受け入れないように見えます。 – Hatshepsut

関連する問題