2017-06-14 18 views
1

リンクを関連する日付で削り取ることは可能ですか?私はデータベースに記事情報を保存する毎日の実行スパイダーを実装しようとしていますが、私はすでに昨日の記事の前に掻き取ってしまった記事を再スクラップしたくありません。私はthisを渡って同じことを尋ねるので、scrapy-deltafetch pluginが提案されました。Scrapy - 日付別リンクを掻き集める

ただし、これはデータベースに保存されている以前に保存されたrequest fingerprintsに対して新しい要求をチェックすることに依存しています。私は毎日の掻爬がしばらく続くと、すでに掻き取られた要求指紋を格納するためにデータベースに大きなメモリオーバーヘッドが必要になると想定しています。

cnn.comのようなサイトの記事のリストがあるので、6/14/17今日公開されたすべての記事を掻きたいですが、スクレイパーが6/13/17、私はクモを閉じて掻き取りを止めたい。このようなアプローチは治療で可能ですか?記事のページが与えられたら、CrawlSpiderはページの先頭で始まり、順番に記事をこすりますか?

Scrapyに新しくなったので、何を試していいのかわかりません。どんな助けでも大歓迎です、ありがとう!

+1

私はそれが 'scrapy'に組み込まれているとは思っていませんが、記事のURLは'/2017/06/14/politics/two-arrested-brawl-turkish-embassy/index.html'あなたはURLから日付を解析して比較することを考えましたか? – etemple1

+0

@ etemple1残念ながら、この例では 'cnn.com'はサンプルサイトであり、私が掻きたいサイトではありません。私が掻き集めるサイトのほとんどは、URLに日付を含めません – ocean800

+0

ああ、大丈夫です。だから、どのようにして "関連する日付"をリンクで知っていますか? – etemple1

答えて

1

私は、興味のある項目に関する情報を石畳にまとめたものからdatetime.strptime(Item['dateinfo'], "%b-%d-%Y")を使用して日付を構成します。

その後、私は自分の設定で設定された年齢に対してそれをチェックします。これは呼び出しごとにオーバーライドすることができます。古すぎる年齢が見つかった場合や、完成したフラグを設定して、他のコードでそれを処理することができる場合は、closespider例外を発行できます。

物事を覚えておく必要はありません。私は毎日実行するスパイダーでこれを使用し、私は単に24時間の制限を設定します。

+0

ありがとうございます!ちょうど不思議なことに、これを実装するときに 'CrawlSpider'を使いますか?記事がページの最上部に表示された最新のリストに載っていることを考えると、最初の「前回」の日付にヒットしたときにクモを閉じたいと思っていました。しかし、「CrawlSpider」は記事のリンクを上から下に解析しないため、ページをスキップしてすぐにリクエストを停止することはできません。私はページ上のすべての記事を要求することを避けようとしています...しかし、 'CrawlSpider'が順番に行かないということを考えれば、それは不可能ですか? – ocean800

1

日付とタイトルを指紋として確認するカスタムのdelta-fetch_keyを使用することができます。

from w3lib.url import url_query_parameter 

... 

def parse(self, response): 
    ... 
    for product_url in response.css('a.product_listing'): 
     yield Request(
      product_url, 
      meta={'deltafetch_key': url_query_parameter(product_url, 'id')}, 
      callback=self.parse_product_page 
     ) 
    ... 
+0

ありがとうございます。しかし、質問で言及したように 'deltafetch'を使わずにアプローチを使用できるかどうかを知りたいだけですが、' Berkeley DB'を使用していて、 'MongoDB'と互換性があるかどうかはわかりません – ocean800

関連する問題