私はこれをテストしていません!
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()
ください。
この回答にはエラーが含まれている可能性があることを認識しています。これは記憶によって書かれています:-)しかし、コメントがある場合、またはこれを理解できない場合は、必ず更新します。