如何停止scrapy蜘蛛但处理所有想要的物品?

时间:2013-07-16 00:49:34

标签: python mysql scrapy

我在我的pipleline中有一个方法来检查项目的发布日期是否比mysql中发现的更早,所以让lastseen成为从数据库中检索的最新日期时间:

def process_item(self, item, spider):
    if item['post_date'] < lastseen:
        # set flag to close_spider
        # raise DropItem("old item")

此代码基本上有效,除了:我每小时检查一次网站只是为了获取新帖子,如果我不停止蜘蛛,它将继续爬行数千页,如果我停止蜘蛛在旗帜上,很少有请求不会被处理,因为它们可能会在蜘蛛关闭后重新排队,即使这些请求在发布日期可能更新,但是说,是否有解决方法可以进行更精确的抓取?

谢谢,

1 个答案:

答案 0 :(得分:0)

不确定这是否适合您的设置,但您可以在初始化蜘蛛时从MySQL获取lastseen并在响应包含postdate < lastseen的项目时停止在回调中生成请求,因此基本上移动了逻辑停止直接在Spider内部爬行而不是管道。

将参数传递给蜘蛛

有时会更简单
scrapy crawl myspider -a lastseen=20130715

并设置Spider的属性以在回调中进行测试(http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

class MySpider(BaseSpider):
    name = 'myspider'

    def __init__(self, lastseen=None):
        self.lastseen = lastseen
        # ...


    def parse_new_items(self, reponse):

        follow_next_page = True

        # item fetch logic
        for element in <some_selector>:

            # get post_date
            post_date = <extract post_date from element>

            # check post_date
            if post_date < self.lastseen:
                follow_next_page = False
                continue

            item = MyItem()
            # populate item...
            yield item

        # find next page to crawl
        if follow_next_page:

            next_page_url = ...

            yield Request(url = next_page_url, callback=parse_new_items)