Scrapy在执行时抛出“ ModuleNotFoundError”

时间:2018-07-03 16:45:59

标签: python python-3.x web-scraping scrapy scrapy-spider

我写了一个非常基本的抓取工具,以从stackoverflow的着陆页抓取问题的标题。在过去的几个小时里,我一直在努力使其工作,但每次执行脚本时,我都会遇到相同的错误。完整的追溯如下。

items.py包括:

import scrapy

class StackoverflowspiderItem(scrapy.Item):
    name = scrapy.Field()

infograbber.py又名蜘蛛包含:

import scrapy
from scrapy import Selector
from scrapy.crawler import CrawlerProcess
from stackoverflowspider.items import StackoverflowspiderItem

class InfograbberSpider(scrapy.Spider):
    name = 'infograbber'
    allowed_domains = ['stackoverflow.com']
    start_urls = ['https://stackoverflow.com/questions/']

    def parse(self, response):
        sel = Selector(response)
        items = []
        for question in sel.css(".question-hyperlink"):
            title = StackoverflowspiderItem()
            title['name'] = question.css("::text").extract_first()
            items.append(title)
        return items

c = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0',

})
c.crawl(InfograbberSpider)
c.start()

这是Project Hierarchy

enter image description here

我遇到的错误:

Traceback (most recent call last):
  File "C:\Users\WCS\Desktop\stackoverflowspider\stackoverflowspider\spiders\infograbber.py", line 4, in <module>
    from stackoverflowspider.items import StackoverflowspiderItem
ModuleNotFoundError: No module named 'stackoverflowspider'

仅供参考:当我尝试如下操作时,它可以工作,但我不希望这样。

import scrapy
from scrapy.crawler import CrawlerProcess

class InfograbberSpider(scrapy.Spider):
    name = 'infograbber'
    allowed_domains = ['stackoverflow.com']
    start_urls = ['https://stackoverflow.com/questions/']

    def parse(self, response):
        for question in response.css(".question-hyperlink"):
            print(question.css("::text").extract_first())


c = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0',

})
c.crawl(InfograbberSpider)
c.start()

我要去哪里了?在此先感谢您提供任何解决方案。顺便说一句,我正在使用python 3.6scrapy 1.5.0。我尝试使用cmdsublime text editor执行文件,但是在两种情况下,我都会遇到相同的错误。

3 个答案:

答案 0 :(得分:2)

我认为您的问题是您像这样执行spider

python infograbber.py

但是您需要进入scrapy.cfg所在的文件夹,然后像这样运行scrapy:

scrapy crawl infograbber

答案 1 :(得分:1)

如果满足两个条件,就会出现无法找到所需软件包的问题:

  1. 您的scrapy.cfg不在您项目的顶层
  2. 您的模块“ .settings.py”,“。middlewares.py”,...不在直接在项目顶层声明的包中

发生的事情是,当您将scrapys称为“ Crawlerprocess”时,它找不到要导入的模块。它正在锁定您的“ .settings”模块。它通过查找“ scrapy.cfg”文件来实现。由于您的“ scrapy.cfg”文件位置不正确,因此scrapy不能自动找到它,因此您需要提供帮助:

  1. 在您的情况下,“ stackoweflowspider.stackoverflowspider”的文件夹应位于sys.path中。 (sys.path.append()也包含该路径的目录)。如果找到了“ scrapy.cfg”文件,则可以通过scrapys的“ get_project_settings()”函数完成。

  2. 您还需要告诉scrapy哪个模块确实是“ .settings”模块。为此,您可以设置一个名为“ SCRAPY_SETTINGS_MODULE”的环境变量。使用

    进行设置
    DispatchQueue.main.async

如果之后您以get_project_settings()作为参数调用CrawlerProcess

os.environ.setdefault('SCRAPY_SETTINGS_MODULE', "stackoweflowspider.stackoverflowspider.settings")

然后它将起作用。要设置您的用户代理信息,您需要再执行一步,但我在这里着重解决了找不到您的软件包和模块的问题。

答案 2 :(得分:1)

下面的代码解决了我的问题:

from ..items import StackoverflowspiderItem