所以我有一个我想要在periodiacally爬行的网站(让我们说一周一次) 我希望能够跳过访问过的URL以节省时间和结果大小等。
我尝试使用url unique_ids和bool的字典,并将其腌制到文件中,但我似乎无法在所有正在运行的抓取工具之间正确地同步它。
任何人对如何正确完成它有不同的想法?
答案 0 :(得分:1)
您可以使用 Download Middleware :
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
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()
ITEM_PIPELINES = {
'mybot.pipelines.DedupPipeline': 0
}
DOWNLOADER_MIDDLEWARES = {
'mybot.middlewares.DedupMiddleware': 0
}