2

プロジェクトのルートで Scrapy シェルを実行しようとしていますが、ある種の DATABASE 設定に関して不明なエラーが発生し続けます。これが SQLAlchemy の問題なのか、それともスキーマ定義の問題なのかわかりません。

scrapy shell http://some_website.comプロジェクトのパス以外のディレクトリから実行しても問題ありません。

シェルを起動しようとしています:

me@me:~/my_spider$ scrapy shell http://some_website.com
2015-12-13 15:15:58-0800 [scrapy] INFO: Scrapy 0.24.4 started (bot: my_bot)
2015-12-13 15:15:58-0800 [scrapy] INFO: Optional features available: ssl, http11, boto, django
2015-12-13 15:15:58-0800 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'my_spider.spiders', 'DEPTH_LIMIT': 2, 'CONCURRENT_REQUESTS_PER_DOMAIN': 1, 'CONCURRENT_REQUESTS': 1, 'SPIDER_MODULES': [''my_spider.spiders'], 'BOT_NAME': 'my_bot', 'COOKIES_ENABLED': False, 'LOGSTATS_INTERVAL': 0, 'DOWNLOAD_DELAY': 5}
2015-12-13 15:15:58-0800 [scrapy] INFO: Enabled extensions: TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2015-12-13 15:15:59-0800 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, RandomUserAgentMiddleware, ProxyMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, ChunkedTransferMiddleware, DownloaderStats
2015-12-13 15:15:59-0800 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware

そしてここにトレースバックがあります:

Traceback (most recent call last):
  File "/usr/local/bin/scrapy", line 11, in <module>
    sys.exit(execute())
  File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 143, in execute
    _run_print_help(parser, _run_command, cmd, args, opts)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 89, in _run_print_help
    func(*a, **kw)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 150, in _run_command
    cmd.run(args, opts)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/commands/shell.py", line 46, in run
    self.crawler_process.start_crawling()
  File "/usr/local/lib/python2.7/dist-packages/scrapy/crawler.py", line 124, in start_crawling
    return self._start_crawler() is not None
  File "/usr/local/lib/python2.7/dist-packages/scrapy/crawler.py", line 139, in _start_crawler
    crawler.configure()
  File "/usr/local/lib/python2.7/dist-packages/scrapy/crawler.py", line 47, in configure
    self.engine = ExecutionEngine(self, self._spider_closed)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/core/engine.py", line 65, in __init__
    self.scraper = Scraper(crawler)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/core/scraper.py", line 66, in __init__
    self.itemproc = itemproc_cls.from_crawler(crawler)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/middleware.py", line 50, in from_crawler
    return cls.from_settings(crawler.settings, crawler)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/middleware.py", line 35, in from_settings
    mw = mwcls()
  File "~/my_spider/pipelines.py", line 14, in __init__
    engine = db_connect()
  File "~/my_spider/libs/database/__init__.py", line 14, in db_connect
    url = URL(**settings.DATABASE)
AttributeError: 'module' object has no attribute 'DATABASE'

アドバイスをいただければ幸いです。

4

2 に答える 2

1

settingsスクレイピーが見つける(または必要とする)と考えている変数定義ではなく、スクレイピーが見つけている変数定義があります。

モジュール呼び出しが使用しているsettingsオブジェクトを見つける代わりに、設定オブジェクトを見つけて、属性を提供するためにそれを探しています。あなたが持っているコード、TraceBack、および最新のPython 2.7のスクレイピーからのコード行を見ることなく:scrapy/middleware.pyfrom_settings().DATABASEmy_bot

 26     @classmethod
 27     def from_settings(cls, settings, crawler=None):
 28         mwlist = cls._get_mwlist_from_settings(settings)
 29         middlewares = []
 30         for clspath in mwlist:
 31             try:
 32                 mwcls = load_object(clspath)
 33                 if crawler and hasattr(mwcls, 'from_crawler'):
 34                     mw = mwcls.from_crawler(crawler)
 35                 elif hasattr(mwcls, 'from_settings'):
 36                     mw = mwcls.from_settings(settings)

意図しない設定オブジェクトへのメソッド解決を提案するか、from_settings()必要な属性を実装せずに指定したチュートリアルに従いました。

于 2015-12-13T23:46:22.833 に答える
1

@tristan が指摘したこととは別に、トレースバックによると、シェルを起動すると、Scrapy はパイプラインを含むプロジェクト設定を取得します。パイプラインの 1 つはdb_connect()関数を実行しており、settings.DATABASE設定を使用します。

url = URL(**settings.DATABASE)

DATABASEプロジェクト設定で辞書が定義されていることを確認してください。

于 2015-12-13T23:50:11.387 に答える