2017-10-28 8 views
0

私は治療を学んでおり、私は小さなプロジェクトを持っています。スクラップで重複を処理する方法は?

def parse(self, response): 
    links = LinkExtractor().extract_links(response) 
    for link in links: 
      yield response.follow(link, self.parse) 

    if (some_condition): 
     yield {'url': response.url} # Store some data 

私はこのページにいくつかのデータがある場合、すべてのリンクを作成してデータを保存します。例えば、http://example.com/some_pageを処理した場合、次回はスキップします。私の仕事は次回もそれを処理することです。このページが既に処理されていることを知りたいので、この場合は他のデータを保存する必要があります。

答えて

1

最初に、あなたが訪れたリンクを追跡する必要があります。次に、同じページを繰り返し訪問することをScrapyに伝える必要があります。

変更コードこの方法:コンストラクタに

def __init__(self, *args, **kwargs): 
    super(MySpider, self).__init__(*args, **kwargs) 
    self.visited_links = set() 

def parse(self, response): 
    if response.url in self.visited_links: 
     yield {} # Store some other data 
    else: 
     self.visited_links.add(response.url) 

     links = LinkExtractor().extract_links(response) 
     for link in links: 
      yield response.follow(link, self.parse, dont_filter=True) 

     if (some_condition): 
      yield {'url': response.url} # Store some data 

が追加され、visited_linksはすでにvisistedリンクを追跡するために使用されます。 (ここではスパイダークラスの名前はMySpiderとし、このコード部分は共有していません)parseでは、まずリンクが既に訪問されているかどうかを確認します(URLはvisited_linksに設定されています)。そうでない場合は、訪問済みリンクセットに追加し、Requestresponse.followを使用)を新規作成した場合は、dont_filter=Trueを使用して重複要求をフィルタ処理しないように指示します。

+0

それは仕事ですが、私がこれを好きなら外部リンクもクロールするように見えます。だから私はそれらを自分でフィルターする必要がありますか? – GhostKU

+0

'dont_filter'は重複要求をフィルタリングするだけです。 –

関連する問題