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.6
和 scrapy 1.5.0
。我尝试使用 cmd
和 sublime text editor
来执行文件,但在这两种情况下我都遇到了相同的错误。
我认为你的问题是你像这样执行 spider
:
python infograbber.py
但您需要进入 scrapy.cfg
和 运行 所在的文件夹,像这样抓取:
scrapy crawl infograbber
如果满足两个条件,就会出现 scrapy 找不到您需要的包的问题:
- 您的 scrapy.cfg 不在项目的顶层
- 您的模块“.settings.py”、“.middlewares.py”...不在项目顶层直接声明的包中
发生的事情是,当您调用 scrapys“Crawlerprocess”时,它没有找到要导入的模块。它正在锁定您的“.settings”模块。它通过查找您的“scrapy.cfg”文件来做到这一点。由于您的“scrapy.cfg”文件位于错误的位置,scrapy 无法自动找到它,您需要帮助它:
在你的例子中,“stackoweflowspider.Whosebugspider”的文件夹应该在 sys.path 中。 (sys.path.append(),以及该路径的目录也是如此)。如果它找到了“scrapy.cfg”文件,这将由 scrapys“get_project_settings()”函数完成。
您还需要告诉 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
我在 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.6
和 scrapy 1.5.0
。我尝试使用 cmd
和 sublime text editor
来执行文件,但在这两种情况下我都遇到了相同的错误。
我认为你的问题是你像这样执行 spider
:
python infograbber.py
但您需要进入 scrapy.cfg
和 运行 所在的文件夹,像这样抓取:
scrapy crawl infograbber
如果满足两个条件,就会出现 scrapy 找不到您需要的包的问题:
- 您的 scrapy.cfg 不在项目的顶层
- 您的模块“.settings.py”、“.middlewares.py”...不在项目顶层直接声明的包中
发生的事情是,当您调用 scrapys“Crawlerprocess”时,它没有找到要导入的模块。它正在锁定您的“.settings”模块。它通过查找您的“scrapy.cfg”文件来做到这一点。由于您的“scrapy.cfg”文件位于错误的位置,scrapy 无法自动找到它,您需要帮助它:
在你的例子中,“stackoweflowspider.Whosebugspider”的文件夹应该在 sys.path 中。 (sys.path.append(),以及该路径的目录也是如此)。如果它找到了“scrapy.cfg”文件,这将由 scrapys“get_project_settings()”函数完成。
您还需要告诉 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