Scrapy在异常情况下未打印出堆栈跟踪信息

3

有没有一种特殊机制可以强制Scrapy打印出所有的Python异常/堆栈跟踪。

我犯了一个简单的错误,将一个列表属性搞错了,导致AttributeError没有完整地显示在日志中。显示出来的是:

2015-11-15 22:13:50 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 264,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 40342,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2015, 11, 15, 22, 13, 50, 860480),
 'log_count/CRITICAL': 1,
 'log_count/DEBUG': 1,
 'log_count/INFO': 1,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'spider_exceptions/AttributeError': 1,
 'start_time': datetime.datetime(2015, 11, 15, 22, 13, 49, 222371)}

因此,它显示了AttributeError计数为1,但没有告诉我在哪里和如何出错,我不得不在代码中手动放置ipdb.set_trace()来找出它在哪里出错。Scrapy本身继续执行其他线程而没有打印任何内容。

ipdb>
AttributeError: "'list' object has no attribute 'match'"
> /Users/username/Programming/regent/regentscraper/spiders/regent_spider.py(139)request_listing_detail_pages_from_listing_id_list()
    138             volatile_props = ListingScanVolatilePropertiesItem()
--> 139             volatile_props['position_in_search'] = list_of_listing_ids.match(listing_id) + rank_of_first_item_in_page
    140

scrapy settings

# -*- coding: utf-8 -*-

# Scrapy settings for regentscraper project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     http://doc.scrapy.org/en/latest/topics/settings.html
#     http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
#     http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html

import sys
import os
import django
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__name__), os.pardir)))

print sys.path

os.environ['DJANGO_SETTINGS_MODULE'] = 'regent.settings'
django.setup()  #new for Django 1.8



BOT_NAME = 'regentscraper'

SPIDER_MODULES = ['regentscraper.spiders']
NEWSPIDER_MODULE = 'regentscraper.spiders'


ITEM_PIPELINES = {
   'regentscraper.pipelines.ListingScanPipeline': 300,
}

添加了问题设置 - dowjones123
不行,没有帮助 - 刚刚尝试过了。谢谢 @alecxe - dowjones123
我已经确定了问题出在设置文件的以下行上(我需要它是因为我正在使用Django 1.8)- django.setup() #Django 1.8新增 --- 删除此行将开始记录回溯信息 - 不确定原因。 - dowjones123
请将您的解决方案作为答案提供,以便易于查找并获得投票。 - Gallaecio
2个回答

1
我遇到了与上述描述相同的事件。 在我的环境中使用以下版本:
  • Django(1.11.4)
  • Scrapy(1.4.0)
  • scrapy-djangoitem(1.1.1)
我通过在 scrapy 中加载的 django 的设置中添加 "LOGGING_CONFIG = None" 来解决问题。 我创建了一个名为 settings_scrapy 的新的 django 设置文件,其中包含以下内容:

mysite.settings_scrapy

try:
    from mysite.settings import *
    LOGGING_CONFIG = None
except ImportError:
    pass

然后,将设置文件加载到scrapy的设置文件中:

import sys
import os
import django
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings_scrapy'
django.setup()

之后,爬虫和管道中的异常堆栈跟踪出现了。

参考资料

https://docs.djangoproject.com/en/1.11/topics/logging/#disabling-logging-configuration


你可以在Django项目的settings.py中将LOGGING['disable_existing_loggers']设置为False,而不是设置LOGGING_CONFIG = None。 - Akihisa Oishi

0

从您实际的爬虫堆栈跟踪中可以看出,似乎您正在尝试将其连接到定义项中?

我建议您同时包括完整的爬虫代码以及您的项,以帮助解决这个问题,尽管这已经是两年前的事情了,所以我相信您已经解决或者找到了解决方法。

正如堆栈跟踪所指出的那样“'list' object has no attribute 'match'”,这可能是一个错误,因为您正在使用Python中已有的逻辑列表... 似乎是罪魁祸首,因为堆栈跟踪告诉您列表没有属性名称匹配,因此它正在使用列表函数,所以... 是的...

也可能是在您的完整爬虫代码中,您必须找到您的项值,然后重新定义为列表?

为了保险起见,在使用单词列表时,除非使用其可用的逻辑,否则将您的“列表”命名为其他任何东西,而不是列表,明白我的意思吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接