1

我在我的管道中有一个方法来检查项目的发布日期是否比在 mysql 中找到的更旧,所以让我们lastseen从数据库中检索到最新的日期时间:

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

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

谢谢,

4

1 回答 1

0

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

有时将参数传递给蜘蛛会更简单

scrapy crawl myspider -a lastseen=20130715

并设置你的蜘蛛的属性来测试你的回调(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)
于 2013-07-16T09:48:56.053 回答