1

で使用Python 2.7していMac OS X Lion 10.7.5ます。

MySQLdb私は元々、両方を使用してインストールすることpip-2.7 install MySQL-pythonと、ダウンロードしてから実行することに問題がpython2.7 setup.py buildありpython2.7 setup.py installました。MySQL32ビットと64ビットの両方のインストールと対応するアーキテクチャを使用してこれらのさまざまな方法を試しましたが、役に立ちませんでした.

私の解決策はインストールすることでしたMacports。次に、Macports を使用して( ) インストールMySQLしました。MySQL-pythonMySQLdb

私はコードの開発に使用Wing IDEしているので、Macports バージョンのPython- インポートに切り替えましたMySQLdb。また、Python のデフォルトのターミナル バージョンをこの Macports バージョンに切り替え、pythonコマンド ラインから呼び出して、それがデフォルトであることを確認しました。正しいバージョンが起動しました。

問題は、scrapy を使用して映画の Web ページから情報を取得することです。私のパイプラインは、スクレイピングされたデータを、前述のMySQLdbモジュールを使用するデータベースに送信します。コマンドラインからcdプロジェクトに入って実行するscrapy crawl MySpiderと、次のエラーが表示されます。

 raise ImportError, "Error loading object '%s': %s" % (path, e)
 ImportError: Error loading object 'BoxOfficeMojo.pipelines.BoxofficemojoPipeline': No module named MySQLdb.cursors

python2.7シェルからMySQLdb.cursorsをインポートできることを確認したので、使用しているPythonのscrapyのバージョンに問題があると思います...

:::::アップデート:::::

完全なトレースバックは次のとおりです。

 Traceback (most recent call last):
   File "/usr/local/bin/scrapy", line 4, in <module>
execute()
  File "/Library/Python/2.7/site-packages/scrapy/cmdline.py", line 131, in execute
_run_print_help(parser, _run_command, cmd, args, opts)
  File "/Library/Python/2.7/site-packages/scrapy/cmdline.py", line 76, in _run_print_help
func(*a, **kw)
  File "/Library/Python/2.7/site-packages/scrapy/cmdline.py", line 138, in _run_command
cmd.run(args, opts)
  File "/Library/Python/2.7/site-packages/scrapy/commands/crawl.py", line 43, in run
spider = self.crawler.spiders.create(spname, **opts.spargs)
  File "/Library/Python/2.7/site-packages/scrapy/command.py", line 33, in crawler
self._crawler.configure()
  File "/Library/Python/2.7/site-packages/scrapy/crawler.py", line 41, in configure
self.engine = ExecutionEngine(self, self._spider_closed)
  File "/Library/Python/2.7/site-packages/scrapy/core/engine.py", line 63, in __init__
self.scraper = Scraper(crawler)
  File "/Library/Python/2.7/site-packages/scrapy/core/scraper.py", line 66, in __init__
self.itemproc = itemproc_cls.from_crawler(crawler)
  File "/Library/Python/2.7/site-packages/scrapy/middleware.py", line 50, in from_crawler
return cls.from_settings(crawler.settings, crawler)
  File "/Library/Python/2.7/site-packages/scrapy/middleware.py", line 29, in from_settings
mwcls = load_object(clspath)
  File "/Library/Python/2.7/site-packages/scrapy/utils/misc.py", line 39, in load_object
    raise ImportError, "Error loading object '%s': %s" % (path, e)
    ImportError: Error loading object 'BoxOfficeMojo.pipelines.BoxofficemojoPipeline': No module named MySQLdb.cursors

:::::更新2:::::

これが私の現在のパスです:

 $PATH
  -bash:       /opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/Library/Frameworks/Python  .framework/Versions/3.3/bin:/Library/Frameworks/Python.framework/Versions/3.3/bin:/Library/Frameworks/Python.framework/Versions/3.3/bin:/Library/Frameworks/Python.framework/Versions/3.3/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin: No such file or directory

::また::

問題を修正するためにこれをコードに追加しました。これはpy27-mysql( MySQLdb) の場所ですが、同じエラーが返されます。

 import sys; sys.path.append("/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages")

::また#2::

これが私のパイプラインのコードですimport

 from scrapy import log
 from twisted.enterprise import adbapi
 import time
 import MySQLdb.cursors
 import sys; sys.path.append("/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages")
 class BoxofficemojoPipeline(object):

     def __init__(self):
         print ('init')
         self.dbpool = adbapi.ConnectionPool('MySQLdb', db = 'testdb', user='testuser', passwd='test', cursorclass=MySQLdb.cursors.DictCursor, charset='utf8', use_unicode=True)



      def process_item(self, item, spider):
         print('process')
         query = self.dbpool.runInteraction(self._conditional_insert, item)  #("""INSERT INTO Example_Movie (title, url, gross, release) VALUES (%s, %s, %s, %s)""", (item['title'].endcode('utf-8'), item['url'].encode('utf-8'), item['gross'].encode('utf-8'), item['release'].encode('utf-8')))
          query.addErrback(self.handle_error)#self.conn.commit()

         return item

      def _conditional_insert(self, tx, item):
         print ('conditional insert')
          #Create record if doesn't exist
          #all this block run on it's own thread

         tx.execute("select * from example_movie where url = %s", (item['url'], ))
         result = tx.fetchone()
         if result:
              log.msg("Item already stored in db: %s" % item, level = log.DEBUG)
         else:
              tx.execute("insert into example_movie (title, url, gross, release) values (%s, %s, %s, %s)", (item['title'].encode('utf-8'), item['url'].encode('utf-8'), item['gross'].encode('utf-8'), item['release'].encode('utf-8')))
              log.msg("Item stored in db: %s" %  item, level=log.DEBUG)

      def handle_error(self, e):
         print ('handle_error')
         log.err(e)
4

1 に答える 1

0

時間を割いてこれを読んで見てくださったすべての人に感謝します。最後にもう一度コードを調べたところ、問題が見つかりました。私のパイプラインのコードでは、問題は(の場所) のimport MySQLdb.cursors前にあることに気付きました。問題を修正する前にステートメントを配置します。import sys; sys.path.append("/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages")MySQLdb moduleimport sys; sys.path.appendimport MySQLdbimport error

于 2013-08-09T18:19:07.553 に答える