Я не проверял это!
Я должен признаться, что я не пытался использовать модели Джанго в Scrapy, но здесь идет:
Самым простым способом, который я представляю, было бы создание нового паука для файла 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
, но я уверен, что вы можете понять, как извлечь URL из XML. Теперь этот пример импортирует myproject.items.DeletedUrlItem
, который является просто строкой в этом примере, но вам нужно создать DeletedUrlItem, используя что-то вроде кода ниже:
Вам необходимо создать элемент DeletedUrlItem:
class DeletedUrlItem(Item):
url = Field()
Вместо сохранения вы удаляете элементы с помощью API модели Django в ItemPipeline Scrapy - я предполагаю, что вы используете 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()
.
Я знаю, что этот ответ может содержать ошибки, он написан по памяти :-), но я обязательно обновлю, если у вас есть комментарии или вы не можете понять это.