我正在尝试运行自己的scrapy项目。我以为我在这里发布的帖子中解决了相关问题:[urlparse: ModuleNotFoundError, presumably in Python2.7 and under conda
我做了完整的系统映像还原并简单地安装了Python 2.7和Miniconda。但是,Atom编辑器仍在标记/强调“导入urlparse”#。
代码基于一本写得很好的书,作者提供了一个很棒的VM游乐场来运行本书中的脚本。在VM中,代码工作正常。
但是,为了尝试自己练习,我现在收到以下错误:
(p2env) C:\Users\User-1\Desktop\scrapy_projects\dictionary>scrapy crawl basic
Traceback (most recent call last):
File "C:\Users\User-1\Miniconda2\envs\p2env\Scripts\scrapy-script.py", line 5, in <module>
sys.exit(scrapy.cmdline.execute())
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\cmdline.py", line 148, in execute cmd.crawler_process = CrawlerProcess(settings)
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\crawler.py", line 243, in __init__
super(CrawlerProcess, self).__init__(settings)
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\crawler.py", line 134, in __init__
self.spider_loader = _get_spider_loader(settings)
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\crawler.py", line 330, in _get_spider_loader
return loader_cls.from_settings(settings.frozencopy())
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\spiderloader.py", line 61, in from_settings
return cls(settings)
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\spiderloader.py", line 25, in __init__
self._load_all_spiders()
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\spiderloader.py", line 47, in _load_all_spiders
for module in walk_modules(name):
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\utils\misc.py", line 71, in walk_modules
submod = import_module(fullpath)
File "C:\Users\User-1\Miniconda2\envs\p2env\lib\importlib\__init__.py", line 37, in import_module
__import__(name)
File "C:\Users\User-1\Desktop\scrapy_projects\dictionary\dictionary\spiders\basic.py", line 11, in <module>
from terms.items import TermsItem
ImportError: No module named terms.items
我的文件夹层次结构如下:
└───dictionary
│ scrapy.cfg
│
└───dictionary
│ items.py
│ middlewares.py
│ pipelines.py
│ settings.py
│ settings.pyc
│ __init__.py
│ __init__.pyc
│
└───spiders
basic.py
basic.pyc
__init__.py
__init__.pyc
我的items.py代码如下:
# -*- coding: utf-8 -*-
from scrapy.item import Item, Field
class TermsItem(Item):
# Primary fields
title = Field()
definition = Field()
# Housekeeping fields
url = Field()
project = Field()
spider = Field()
server = Field()
date = Field()
我的spider.py如下:
# -*- coding: utf-8 -*-
import datetime
import urlparse
import socket
import scrapy
from scrapy.loader.processors import MapCompose, Join
from scrapy.loader import ItemLoader
from terms.items import TermsItem
class BasicSpider(scrapy.Spider):
name = "basic"
allowed_domains = ["web"]
# Start on a property page
start_urls = (
'http://dictionary.com/browse/there',
)
def parse(self, response):
# Create the loader using the response
l = ItemLoader(item=TermsItem(), response=response)
# Load fields using XPath expressions
l.add_xpath('title', '//h1[@class="head-entry"][1] / text()',
MapCompose(unicode.strip, unicode.title))
l.add_xpath('definition', '//*[@class="def-list"][1]/text()',
MapCompose(unicode.strip, unicode.title))
# Housekeeping fields
l.add_value('url', response.url)
l.add_value('project', self.settings.get('BOT_NAME'))
l.add_value('spider', self.name)
l.add_value('server', socket.gethostname())
l.add_value('date', datetime.datetime.now())
return l.load_item()
基于此stackoverflow问题:Scrapy ImportError: No module named Item,其中指示编码人员从项目的顶级目录中执行Scrapy命令。 - alecxe &#39; **让我想知道我使用的conda环境是否导致错误? No module named items堆栈问题有类似的观点&#39; **进行什么导入?什么是sys.path的工作目录/内容。如果父目录不在工作目录中并且不在sys.path中出现,则无法找到Project_L。 - ShadowRanger 5月11日22:24 &#39; **但是,据我所知,我正在构建项目并且相应的层次结构是正确的。
非常感谢任何帮助。对于冗长的帖子道歉,我只想尽可能全面,并确保人们理解这个问题与我所关联的类似问题之间的区别。
此致
答案 0 :(得分:2)
简洁地说,我能够通过替换:
来生成解决方案并绕过错误from terms.items import TermsItem
与
from ..items import TermsItem
此解决方案及其变体已在我最初附上的链接中提供:
Scrapy ImportError: No module named Item
我确信我最初尝试过,但是我怀疑当我试图重新运行代码时我必须忘记保存,因此从之前的.pyc拉出来了
应该注意的是,代码所依据的书,上述链接Scrapy ImportError: No module named Item表示我的原始代码
from terms.items import TermsItem
应该有效。 我强烈建议那些遇到相同错误的人,他们已经尝试了我链接的相关stackflow问题中提供的解决方案,并确保将父目录名称与蜘蛛的名称区分开来,通过 jq170727 查看此主题中的评论。这个人提供了关于如何使用-v选项来更好地识别问题的很好的指导,并且包含了他已经记录的非常详细的错误跟踪方法的链接,该方法使用了PYTHONVERBOSE命令。我是一个全新的,因此无法在这一点上完全理解其含义,但是,我将发布我认为是 jq170727的方法所引发的问题:
import scrapy.loader.processors # precompiled from C:\Users\User-1\Miniconda2\envs\p2env\lib\site-packages\scrapy\loader\processors.pyc
Traceback (most recent call last):
我认为这是由于我使用的conda环境目前正在使用我正在使用的Python2.7和Scrapy。再次,在完整的线程中,我链接并引用其他stackflow贡献者的相关点,我认为可能允许某人完全纠正他们的问题(因为我仍然非常绿色)。
答案 1 :(得分:1)
回溯表示问题出在特定的导入中。 您可以从命令行验证这一点。比如我的 机器我得到了
$ python -c 'from terms.items import TermsItem'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named terms.items
查看文件夹层次结构,我看不到名为“terms”的模块 这可能是你所遗漏的,但是既然你指出了 代码正在作者的VM中工作,我会尝试运行 该VM中的以下命令:
$ python -v -c 'from terms.items import TermsItem'
-v
选项将使python显示所有导入的路径
e.g。
$ python -v -c 'from terms.items import TermsItem'
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site.pyc matches /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site.py
import site # precompiled from /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site.pyc
...
import encodings.ascii # precompiled from /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/encodings/ascii.pyc
Python 2.7.12 (default, Nov 29 2016, 14:57:54)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named terms.items
# clear __builtin__._
# clear sys.path
...
# cleanup ints: 20 unfreed ints
# cleanup floats
如果你在代码工作的地方那样做,那么输出中的某个地方就会 是一个成功的导入。从那以后你可以找到它的名字 您系统上缺少的模块并相应地安装它。
编辑:仔细观察你的帖子我注意到你提到你的“items.py”包含class TermsItem(Item):
# Primary fields
...
所以我怀疑你的问题是你的导入应该是
from items import TermsItem