私はスクレイピーを使用して、ニュース Web サイトを毎日クロールしています。スクレイピーがすでにスクレイピングされた URL をスクレイピングしないように制限するにはどうすればよいですか。また、 に関する明確なドキュメントや例はありますかSgmlLinkExtractor
。
5 に答える
これは、 http://snipplr.com/view/67018/middleware-to-avoid-revisiting-already-visited-items/にあるscrapyスニペットを使用して実際に非常に簡単に行うことができます。
これを使用するには、リンクからコードをコピーして、Scrapyプロジェクトのファイルに入れます。それを参照するには、settings.pyに行を追加して参照します。
SPIDER_MIDDLEWARES = { 'project.middlewares.ignore.IgnoreVisitedItems': 560 }
あなたが行う番号を選ぶ理由の詳細はここで読むことができます:http://doc.scrapy.org/en/latest/topics/downloader-middleware.html
最後に、items.pyを変更して、各アイテムクラスに次のフィールドが含まれるようにする必要があります。
visit_id = Field()
visit_status = Field()
そして、それだけだと思います。次回スパイダーを実行すると、同じサイトの回避を自動的に開始する必要があります。
幸運を!
これは簡単です。以前にクロールしたすべての URL を python dict で維持します。そのため、次回それらを試すときは、その URL が dict にあるかどうかを確認してください。そうでなければクロールします。
def load_urls(prev_urls):
prev = dict()
for url in prev_urls:
prev[url] = True
return prev
def fresh_crawl(prev_urls, new_urls):
for url in new_urls:
if url not in prev_urls:
crawl(url)
return
def main():
purls = load_urls(prev_urls)
fresh_crawl(purls, nurls)
return
上記のコードは、SO テキスト エディター (別名ブラウザー) で入力されました。構文エラーがある可能性があります。また、いくつかの変更を加える必要がある場合もあります。しかし、ロジックはそこにあります...
注:ただし、一部の Web サイトでは常にコンテンツが変更されていることに注意してください。そのため、更新されたコンテンツを取得するためだけに、特定の Web ページ (つまり、同じ URL) を再クロールする必要がある場合があります。
Scrapy はスクレイピングされた URL を自動フィルタリングできますよね? 「www.xxx.com/home/」や「www.xxx.com/home/index.html」など、同じページを指すいくつかの異なる URL はフィルタリングされません。
jama22の回答は少し不完全だと思います。
スニペットif self.FILTER_VISITED in x.meta
: では、そのリクエストを無視するには、Request インスタンスに FILTER_VISITED が必要であることがわかります。これは、横断して移動したいリンクと、二度と見たくないアイテム リンクを区別できるようにするためです。