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