我没有测试过这个!
我必须承认我没有尝试在 Scrapy 中使用 Django 模型,但这里是:
我想最简单的方法是deleted.rss
通过扩展 XMLFeedSpider 为文件创建一个新的蜘蛛(从scrapy文档复制,然后修改)。我建议您创建一个新的蜘蛛,因为以下逻辑很少与用于抓取网站的逻辑相关:
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 模型 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()
.
我知道这个答案可能包含错误,它是由记忆编写的 :-) 但如果您有意见或无法弄清楚,我肯定会更新。