gpt4 book ai didi

python - 如何使用 Scrapy 从数据库中删除过期的项目

转载 作者:太空宇宙 更新时间:2023-11-03 15:29:03 25 4
gpt4 key购买 nike

我正在使用抓取一个内容经常过期的视频网站。我正在考虑使用 scrapy做我的蜘蛛网,但我不确定如何删除过期的项目。

检测元素是否过期的策略是:

  1. 抓取网站的“delete.rss”。
  2. 每隔几天,尝试重新加载内容页面并确保它仍然有效。
  3. 抓取网站内容索引的每一页,如果找不到则删除视频。

请告诉我如何删除 scrapy 中的过期项目。我将通过 django 将我的 scrapy 项目存储在 mysql 数据库中。

2010-01-18更新

我找到了一个有效的解决方案,但可能仍然不是最佳解决方案。我在我同步的每个视频上维护一个“found_in_last_scan”标志。当蜘蛛启动时,它会将所有标志设置为 False。完成后,它会删除仍将标志设置为 False 的视频。我通过附加到 signals.spider_openedsignals.spider_closed 来做到这一点。请确认这是一个有效的策略并且没有问题。

最佳答案

我还没有测试过这个!
我不得不承认,我还没有尝试在 Scrapy 中使用 Django 模型,但是这里是:

我想象的最简单的方法是通过扩展 XMLFeedSpider(从 scrapy 文档复制,然后修改)为 deleted.rss 文件创建一个新的蜘蛛。我建议您创建一个新的蜘蛛,因为以下逻辑很少与用于抓取站点的逻辑相关:

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()

您没有保存,而是 delete the items using Django's Model APIScrapy's ItemPipeline - 我假设你使用的是 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()


我知道这个答案可能包含错误,它是凭内存写的 :-) 但如果您有意见或无法解决这个问题,我一定会更新。

关于python - 如何使用 Scrapy 从数据库中删除过期的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com