Scrapy 在执行时抛出 "ModuleNotFoundError"

Scrapy throws "ModuleNotFoundError" upon execution

我在 scrapy 中编写了一个非常基本的蜘蛛程序,用于从 Whosebug 的登录页面抓取问题的标题。在过去的几个小时里,我一直在努力让它工作,但每次执行我的脚本时,我都会遇到同样的错误。完整的回溯如下。

items.py 包括:

import scrapy

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

infograbber.py 又名蜘蛛包含:

import scrapy
from scrapy import Selector
from scrapy.crawler import CrawlerProcess
from Whosebugspider.items import WhosebugspiderItem

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

    def parse(self, response):
        sel = Selector(response)
        items = []
        for question in sel.css(".question-hyperlink"):
            title = WhosebugspiderItem()
            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:

我遇到的错误:

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

仅供参考:当我像下面那样尝试时它会起作用,但我不想这样。

import scrapy
from scrapy.crawler import CrawlerProcess

class InfograbberSpider(scrapy.Spider):
    name = 'infograbber'
    allowed_domains = ['whosebug.com']
    start_urls = ['https://whosebug.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 来执行文件,但在这两种情况下我都遇到了相同的错误。

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

python infograbber.py

但您需要进入 scrapy.cfg 和 运行 所在的文件夹,像这样抓取:

scrapy crawl infograbber

如果满足两个条件,就会出现 scrapy 找不到您需要的包的问题:

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

发生的事情是,当您调用 scrapys“Crawlerprocess”时,它没有找到要导入的模块。它正在锁定您的“.settings”模块。它通过查找您的“scrapy.cfg”文件来做到这一点。由于您的“scrapy.cfg”文件位于错误的位置,scrapy 无法自动找到它,您需要帮助它:

  1. 在你的例子中,“stackoweflowspider.Whosebugspider”的文件夹应该在 sys.path 中。 (sys.path.append(),以及该路径的目录也是如此)。如果它找到了“scrapy.cfg”文件,这将由 scrapys“get_project_settings()”函数完成。

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

    设置
    os.environ.setdefault('SCRAPY_SETTINGS_MODULE', "stackoweflowspider.Whosebugspider.settings")
    

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

CrawlerProcess(get_project_settings())

然后就可以了。要设置你的 USER AGENT 信息,你需要多做一步,但我这里主要关注的是 scrapy 找不到你的包和模块的问题。

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

from ..items import WhosebugspiderItem