私はScrapyが新しく、誰かがprocess_linksとprocess_requestが最も有用なサンプルコードを教えてくれればと思っていました。私はprocess_linksがURLをフィルタリングするのに使われているのを見ていますが、コード化する方法はわかりません。Scrapy process_linksとprocess_requestのコード例
ありがとうございます。
私はScrapyが新しく、誰かがprocess_linksとprocess_requestが最も有用なサンプルコードを教えてくれればと思っていました。私はprocess_linksがURLをフィルタリングするのに使われているのを見ていますが、コード化する方法はわかりません。Scrapy process_linksとprocess_requestのコード例
ありがとうございます。
あなたは、彼らはかなり名前が言うか、リンクを抽出して処理される時間との間のミドルウェアの一種として作用する他の言葉で/ダウンロードを行う最も一般的scrapy.CrawlSpider
で使用されているscrapy.spiders.Rule
を意味します。
process_links
リンクが抽出され、要求に変換されるまでの間にあります。これにはかなり便利なケースがあります。普通のものをいくつか挙げておきます。
例:
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
といくつかのユースケースを共有するが、実際のように、いくつかの他のクールなものを行うことができます。
例:あなたはおそらくつもり頻繁にそれらを使用していないが、これらの二つは、いくつかの場面では本当に便利で簡単にショートカットすることができ
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
。
Cool!これは素晴らしい。ありがとうございました。これは、私が持っていた問題を解決します。私は2つの質問がありますが、1)あなたのprocess_linksコードでは、最後の2行は冗長ではありません。 2)process_linksでNoneを返すと、 "TypeError: 'NoneType'オブジェクトが反復可能ではありません。"私はこのエラーを無視できることを知っています。なぜなら、Scrapyは次のリンクに移動するためですが、このエラーを修正することはできますか?私は、もしNoneTypeが返されたと見なされるならば、Scrapyが動くことを望んでいました。 – Arrow
#1について - 私はちょうどスペースを節約するために2つの例を見せてくれました。 #2については、私の最後に少しのタイプミスがあります。実際には、 'process_links'関数は実際にリンクのリストを取り、戻り値としていくつかのリストを期待しています。これを反映するように答えを調整しました。 – Granitosaurus
@Granitosaurusこれは本当に役に立ちます - ありがとう。あなたの 'process_links()'関数が、将来の読者と 'return None'ステートメントを混乱させるかもしれないと思います。あなたはそれをより正確にするために悪いリンクやそれに類するものをスキップするために 'continue'と置き換えることができます。 – UriCS