运行蜘蛛时为什么会出现“ ModuleNotFoundError”?

时间:2019-06-29 14:06:57

标签: python scrapy pipeline

我在python 3中使用 scrapy 1.5.2

我有一个非常简单的蜘蛛,并且创建了一个小的管道来转换商品的日期字段。

这是我的项目“企业”的树形文件夹:http://prntscr.com/o8axfc

如您在此屏幕快照中所见,我创建了一个文件夹“ pipelines”,在其中添加了tidyup.py文件,并在其中添加了以下代码:

from datetime import datetime

class TidyUp(object):
    def process_item(self, item, spider):
        item['startup_date_creation']= map(datetime.isoformat, item['startup_date_creation'])
        return item

您还可以在我添加到项目settings.py的屏幕快照中看到参数:

ITEM_PIPELINES = {'entreprises.pipelines.tidyup.TidyUp': 100}

这是我的蜘蛛usine-digitale2.py的代码:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.utils.response import open_in_browser


def parse_details(self,response):
    if "item_name" not in response.body:
        open_in_browser(response)
        
    item=response.mega.get('item',None)
    if item:
        return item
    else:
        self.logger.warning("pas d'item reçu pour %s", response.url)
        
        
        

class UsineDigital2Spider(CrawlSpider):
    name = 'usine-digital2'
    allowed_domains = ['website.fr']
    start_urls = ['https://www.website.fr/annuaire-start-up/']

    rules = (
        Rule(LinkExtractor(restrict_xpaths="//*[@rel='next']")),
        Rule(LinkExtractor(restrict_xpaths="//*[@itemprop='url']"),
             callback='parse_item')
    )

    def parse_item(self, response):
        i = {}    
        
        i["startup_name"] = response.xpath("//h1/text()").extract()
        i["startup_date_creation"] = response.xpath("//*[@itemprop='foundingDate']/@content").extract()
        i["startup_website"] = response.xpath ("//*[@id='infoPratiq']//a/@href").extract()
        i["startup_email"] = response.xpath ("//*[@itemprop='email']/text()").extract()
        i["startup_address"] = response.xpath ("//*[@id='infoPratiq']//p/text()").extract()
        i["startup_founders"] = response.xpath ("//*[@itemprop='founders']/p/text()").extract()
        i["startup_market"] = response.xpath ("//*[@id='ficheStartUp']/div[1]/article/div[6]/p").extract()
        i["startup_description"] = response.xpath ("//*[@itemprop='description']/p/text()").extract()
        i["startup_short_description"] = response.xpath ("//*[@itemprop='review']/p").extract()
        
        return i

当我运行命令时:

scrapy crawl usine-digital2 -s CLOSESPIDER_ITEMCOUNT=30

我收到此错误消息:

  

ModuleNotFoundError:没有名为“ entreprises.pipelines.tidyup”的模块; “ entreprises.pipelines”不是软件包

这是登录我的终端:

http://prntscr.com/o8azt0

我在代码中到处搜索。我没有看到任何错误。这段代码来自“ Learn Scrapy”一书(来自Dimitrios Kouzis-loukas),在其中我遵循了说明。我不明白为什么它不起作用。

您可以在此处找到scrapy项目“ entreprises”的所有源代码:

https://github.com/FormationGrowthHacking/scrapy/tree/master/entreprises

当我在阅读“ Learn Scrapy”这本书时,您很容易猜到我是一名新手,正准备开发他的第一个刮板。我将非常感谢一些专家的帮助。

亲切的问候

1 个答案:

答案 0 :(得分:2)

您的项目中有pipelines个文件夹 pipelines.py文件,这是导致问题的原因。

enter image description here

我建议删除文件夹并将管道类移至pipelines.py文件中

删除pipelines.py并通过此导入添加pipelines/__init__.py

# -*- coding: utf-8 -*-
from .tidyup import TidyUp

也在settings.py中:

ITEM_PIPELINES = {'entreprises.pipelines.TidyUp': 100}