gpt4 book ai didi

python - Scrapy - 悄悄地丢下一个元素

转载 作者:IT老高 更新时间:2023-10-28 20:31:06 26 4
gpt4 key购买 nike

我正在使用 Scrapy 抓取多个网站,这些网站可能共享冗余信息。

对于我抓取的每个页面,我将页面的 url、它的标题和它的 html 代码存储到 mongoDB 中。我想避免数据库中的重复,因此,我实现了一个管道以检查是否已经存储了类似的项目。在这种情况下,我会引发 DropItem 异常。

我的问题是,每当我通过 DropItem 异常删除项目时,Scrapy 会将项目的全部内容显示到日志(标准输出或文件)中。由于我正在提取每个抓取页面的完整 HTML 代码,如果出现丢失,整个 HTML 代码将显示在日志中。

如何在不显示内容的情况下静默放置项目?

感谢您的宝贵时间!

class DatabaseStorage(object):
""" Pipeline in charge of database storage.

The 'whole' item (with HTML and text) will be stored in mongoDB.
"""

def __init__(self):
self.mongo = MongoConnector().collection

def process_item(self, item, spider):
""" Method in charge of item valdation and processing. """
if item['html'] and item['title'] and item['url']:
# insert item in mongo if not already present
if self.mongo.find_one({'title': item['title']}):
raise DropItem('Item already in db')
else:
self.mongo.insert(dict(item))
log.msg("Item %s scraped" % item['title'],
level=log.INFO, spider=spider)
else:
raise DropItem('Missing information on item %s' % (
'scraped from ' + item.get('url')
or item.get('title')))
return item

最佳答案

执行此操作的正确方法似乎是为您的项目实现自定义 LogFormatter,并更改已删除项目的日志记录级别。

例子:

from scrapy import log
from scrapy import logformatter

class PoliteLogFormatter(logformatter.LogFormatter):
def dropped(self, item, exception, response, spider):
return {
'level': log.DEBUG,
'format': logformatter.DROPPEDFMT,
'exception': exception,
'item': item,
}

然后在您的设置文件中,类似:

LOG_FORMATTER = 'apps.crawler.spiders.PoliteLogFormatter'

我运气不好,只是返回“None”,这导致 future 管道出现异常。

关于python - Scrapy - 悄悄地丢下一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13527921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com