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

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

作者:互联网

我正在使用蜘蛛视频网站,该网站经常使内容过期.我正在考虑使用scrapy进行爬网,但是不确定如何删除过期的项目.

检测某项是否过期的策略是:

>搜寻网站的“ delete.rss”.
>每隔几天,请尝试重新加载内容页面,并确保它仍然有效.
>搜寻网站内容索引的每一页,如果找不到该视频,则将其删除.

请让我知道如何清除刮擦的过期物品.我将通过django将我的易碎物品存储在mysql数据库中.

2010-01-18更新

我找到了一个可行的解决方案,但可能仍不是最佳选择.我在同步的每个视频上都维护着“ found_in_last_scan”标志.蜘蛛启动时,会将所有标志设置为False.完成后,它将删除标记仍设置为False的视频.我通过将信号附加到signals.spider_opened和signals.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()

而不是保存您在Scrapy’s ItemPipeline中的delete the items using Django’s 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().

我知道这个答案可能包含错误,它是由内存写的:-),但如果您有任何评论或无法解决,我肯定会进行更新.

标签:scrapy,screen-scraping,python
来源: https://codeday.me/bug/20191106/2001831.html