【问题标题】:Scrapy throws "ModuleNotFoundError" upon executionScrapy 在执行时抛出“ModuleNotFoundError”
【发布时间】:2018-12-12 01:23:12
【问题描述】:

我在 scrapy 中编写了一个非常基本的蜘蛛,用于从 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

我遇到的错误:

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 来执行该文件,但在这两种情况下我都会遇到相同的错误。

【问题讨论】:

  • 你能展示你如何运行你的蜘蛛吗?
  • 你试过from stackoverflowspider.stackoverflowspider.items import StackoverflowspiderItem吗?
  • 我试过你的建议,先生,但发现同样的错误。

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


【解决方案1】:

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

from ..items import StackoverflowspiderItem

【讨论】:

    【解决方案2】:

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

    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”的环境变量来实现。使用设置它

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

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

    CrawlerProcess(get_project_settings())
    

    那么它就会起作用。要设置您的 USER AGENT 信息,您需要多做一步,但我在这里关注的是 scrapy 找不到您的包和模块的问题。

    【讨论】:

    • 据我记得,这就是我发现它的工作原理sys.path.append(r'C:\Users\WCS\Desktop\stackoverflowspider')
    • 可能的。至少这足以找到“scrapy.cfg”文件。如果该文件定义了“.settings”模块,则足以使其工作(然后通过从该文件中读取设置与上述相同的环境模块)。我只是更喜欢将这两个任务都移到 python 中。如果您以后想使用 pyinstaller 会有所帮助...
    【解决方案3】:

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

    python infograbber.py
    

    但你需要进入scrapy.cfg所在的文件夹并像这样运行scrapy:

    scrapy crawl infograbber
    

    【讨论】:

    • 感谢@Druta Ruslan 的解决方案。它终于奏效了。我不知道有关scrapy.cfg 的信息。但是,您能建议我如何使用 .CrawlerProcess() 从 sublime 文本编辑器中运行相同的操作吗?我可以将scrapy.cfg 移动到我项目中的任一文件夹中吗?谢谢。
    • 抱歉,我不与 sublime 合作,我不知道你能在那里做什么,你可以在 stackoverflow 上搜索关于此的任何问题
    • 这不一定是崇高的。任何IDE,如pycharm,anaconda,我的意思是cmd以外的?如果有任何相关的解决方案出现,让我们再等一会儿。您的解决方案值得勾选。
    猜你喜欢
    • 2017-08-12
    • 2017-07-12
    • 2019-04-01
    • 2016-06-24
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多