避免scrapy重新审视不同的运行

时间:2014-05-30 08:27:52

标签: python scrapy

所以我有一个我想要在periodiacally爬行的网站(让我们说一周一次) 我希望能够跳过访问过的URL以节省时间和结果大小等。

我尝试使用url unique_ids和bool的字典,并将其腌制到文件中,但我似乎无法在所有正在运行的抓取工具之间正确地同步它。

任何人对如何正确完成它有不同的想法?

1 个答案:

答案 0 :(得分:1)

您可以使用 Download Middleware


pipelines.py

from mybot.utils import connect_url_database

class DedupPipeline(object):

    def __init__(self):
        self.db = connect_url_database()

    def process_item(self, item, spider):
        url = item['url']
        self.db.insert(url)
        yield item

middlewares.py

from scrapy import log
from scrapy.exceptions import IgnoreRequest
from mybot.utils import connect_url_database

class DedupMiddleware(object):

    def __init__(self):
        self.db = connect_url_database()

    def process_request(self, request, spider):
        url = request.url
        if self.db.has(url):
            log.msg('ignore duplicated url: <%s>'%url, level=log.DEBUG)
            raise IgnoreRequest()

settings.py

ITEM_PIPELINES = {
    'mybot.pipelines.DedupPipeline': 0
}

DOWNLOADER_MIDDLEWARES = {
    'mybot.middlewares.DedupMiddleware': 0
}