13


5

スクレイピー-既にスクレイピングされたURLを識別する方法

毎日スクレイピーを使用してニュースWebサイトをクロールしています。 スクレイピーが既にスクレイピングされたURLをスクレイピングすることを制限するにはどうすればよいですか。 また、 `SgmlLinkExtractor`に関する明確なドキュメントや例もあります。

4 Answer


13


実際にこれを行うには、http://snipplr.com/view/67018/middleware-to-avoid-revisiting-already-visited-items/にあるスクレイピースニペットを使用します。

これを使用するには、リンクからコードをコピーして、スクレイピープロジェクトのファイルに入れます。 それを参照するには、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()

そして、私はそれだと思います。 次回スパイダーを実行すると、同じサイトの回避を自動的に開始しようとします。

がんばろう!


1


jama22の答えは少し不完全だと思います。

スニペット「if self.FILTER_VISITED in x.meta」:で、そのリクエストを無視するには、リクエストインスタンスにFILTER_VISITEDが必要であることがわかります。 これは、横断して移動したいリンクと、再度表示したくないアイテムリンクを区別できるようにするためです。


1


スクレイピーは、スクレイピングされたURLを自動フィルタリングできますか? 「www.xxx.com/home/」や「www.xxx.com/home/index.html」など、同じページを指すいくつかの異なるURLはフィルタリングされません。


0


これは簡単です。 python dictで以前にクロールしたすべてのURLを維持します。 そのため、次回それらを試してみるときに、そのURLが辞書にあるかどうかを確認してください。 他のクロール。

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サイトは常にコンテンツを変更していることに注意してください。 そのため、特定のウェブページの再クロールが必要になる場合があります(つまり、 更新されたコンテンツを取得するためだけに同じURL)。