3

コンテンツの有効期限が頻繁に切れるビデオ サイトをスパイダーで使用しています。スクレイピーを使用してスパイダリングを行うことを検討し ていますが、期限切れのアイテムを削除する方法がわかりません。

アイテムの有効期限が切れているかどうかを検出する方法は次のとおりです。

  1. サイトの「delete.rss」をスパイダーします。
  2. 数日おきに、コンテンツ ページを再読み込みして、まだ機能することを確認してください。
  3. サイトのコンテンツ インデックスのすべてのページをスパイダーし、動画が見つからない場合は削除します。

スクレイピーで期限切れのアイテムを削除する方法を教えてください。djangoを介してmysql DBにスクレイピーアイテムを保存します。

2010-01-18 更新

機能するソリューションを見つけましたが、それでも最適ではない可能性があります。同期するすべてのビデオで「found_in_last_scan」フラグを維持しています。スパイダーが起動すると、すべてのフラグが False に設定されます。終了すると、フラグがまだ False に設定されているビデオを削除します。にアタッチしてこれを 行いました。これが有効な戦略であり、問​​題がないことを確認しsignals.spider_openedてください。signals.spider_closed

4

2 に答える 2

4

私はこれをテストしていません!
Scrapy で Django モデルを使用しようとはしていないことを告白しなければなりませんが、次のようになります。

deleted.rss私が想像する最も簡単な方法は、XMLFeedSpider を拡張してファイル用の新しいスパイダーを作成することです (スクレイピードキュメントからコピーしてから変更します)。次のロジックのほとんどは、サイトのスクレイピングに使用されるロジックに関連していないため、新しいスパイダーを作成することをお勧めします。

from scrapy import log
from scrapy.contrib.spiders import XMLFeedSpider
from myproject.items import DeletedUrlItem

class MySpider(XMLFeedSpider):
    domain_name = 'example.com'
    start_urls = ['http://www.example.com/deleted.rss']
    iterator = 'iternodes' # This is actually unnecesary, since it's the default value
    itertag = 'item'

    def parse_node(self, response, url):
        url['url'] = node.select('#path/to/url').extract()

        return url # return an Item 

SPIDER = MySpider()

これは実際に使用できるスパイダーではありませんが、IIRC の RSS ファイルは純粋な XML です。がどのようにdeleted.rss見えるかはわかりませんが、XML から URL を抽出する方法を理解できると確信しています。この例myproject.items.DeletedUrlItemでは単なる文字列をインポートしますが、以下のコードのようなものを使用して DeletedUrlItem を作成する必要があります。

DeletedUrlItem を作成する必要があります。

class DeletedUrlItem(Item):
    url = Field()

保存する代わりに、Scrapy の ItemPipelineでDjango の Model API を使用してアイテムを削除します- DjangoItem を使用していると仮定します:

# we raise a DropItem exception so Scrapy
# doesn't try to process the item any further
from scrapy.core.exceptions import DropItem

# import your model
import django.Model.yourModel

class DeleteUrlPipeline(item):

    def process_item(self, spider, item):
        if item['url']:
            delete_item = yourModel.objects.get(url=item['url'])
            delete_item.delete() # actually delete the item!
            raise DropItem("Deleted: %s" % item)

に注意してdelete_item.delete()ください。


この回答にはエラーが含まれている可能性があることを認識しています。これは記憶によって書かれています:-)しかし、コメントがある場合、またはこれを理解できない場合は、必ず更新します。

于 2010-01-18T05:45:11.467 に答える