2016-07-15 22 views
4

私はScrapyが新しく、誰かがprocess_linksとprocess_requestが最も有用なサンプルコードを教えてくれればと思っていました。私はprocess_linksがURLをフィルタリングするのに使われているのを見ていますが、コード化する方法はわかりません。Scrapy process_linksとprocess_requestのコード例

ありがとうございます。

答えて

4

あなたは、彼らはかなり名前が言うか、リンクを抽出して処理される時間との間のミドルウェアの一種として作用する他の言葉で/ダウンロードを行う最も一般的scrapy.CrawlSpider

で使用されているscrapy.spiders.Ruleを意味します。

process_linksリンクが抽出され、要求に変換されるまでの間にあります。これにはかなり便利なケースがあります。普通のものをいくつか挙げておきます。

  1. あなたが気に入らないリンクをいくつか除外してください。
  2. 不正な要求を避けるため、手動でリダイレクトを行います。

例:

def process_links(self, link): 
    for link in links: 
     #1 
     if 'foo' in link.text: 
      continue # skip all links that have "foo" in their text 
     yield link 
     #2 
     link.url = link.url + '/' # fix url to avoid unnecessary redirection 
     yield link 

process_requestsだけで作られた、それがダウンロードされている前に、要求の間に位置します。それはprocess_linksといくつかのユースケースを共有するが、実際のように、いくつかの他のクールなものを行うことができます。

  1. 変更ヘッダ(例えばクッキー。)。
  2. URLの一部のキーワードに応じて、コールバックのような詳細を変更します。

例:あなたはおそらくつもり頻繁にそれらを使用していないが、これらの二つは、いくつかの場面では本当に便利で簡単にショートカットすることができ

def process_req(self, req): 
    # 1 
    req = req.replace(headers={'Cookie':'foobar'}) 
    return req 
    # 2 
    if 'foo' in req.url: 
     return req.replace(callback=self.parse_foo) 
    elif 'bar' in req.url: 
     return req.replace(callback=self.parse_bar) 
    return req 

+0

Cool!これは素晴らしい。ありがとうございました。これは、私が持っていた問題を解決します。私は2つの質問がありますが、1)あなたのprocess_linksコードでは、最後の2行は冗長ではありません。 2)process_linksでNoneを返すと、 "TypeError: 'NoneType'オブジェクトが反復可能ではありません。"私はこのエラーを無視できることを知っています。なぜなら、Scrapyは次のリンクに移動するためですが、このエラーを修正することはできますか?私は、もしNoneTypeが返されたと見なされるならば、Scrapyが動くことを望んでいました。 – Arrow

+0

#1について - 私はちょうどスペースを節約するために2つの例を見せてくれました。 #2については、私の最後に少しのタイプミスがあります。実際には、 'process_links'関数は実際にリンクのリストを取り、戻り値としていくつかのリストを期待しています。これを反映するように答えを調整しました。 – Granitosaurus

+0

@Granitosaurusこれは本当に役に立ちます - ありがとう。あなたの 'process_links()'関数が、将来の読者と 'return None'ステートメントを混乱させるかもしれないと思います。あなたはそれをより正確にするために悪いリンクやそれに類するものをスキップするために 'continue'と置き換えることができます。 – UriCS