Python 无法获得最简单的管道示例以在scrapy中工作

Python 无法获得最简单的管道示例以在scrapy中工作,python,scrapy,Python,Scrapy,这是我的简单代码,我没有得到它的工作 我正在从initspider 这是我的密码 class MytestSpider(InitSpider): name = 'mytest' allowed_domains = ['example.com'] login_page = 'http://www.example.com' start_urls = ["http://www.example.com/ist.php"] def init_request(sel

这是我的简单代码,我没有得到它的工作

我正在从
initspider

这是我的密码

class MytestSpider(InitSpider):
    name = 'mytest'
    allowed_domains = ['example.com']
    login_page = 'http://www.example.com'
    start_urls = ["http://www.example.com/ist.php"]

    def init_request(self):
        #"""This function is called before crawling starts."""
        return Request(url=self.login_page, callback=self.parse)

    def parse(self, response):
        item = MyItem()
        item['username'] = "mytest"
        return item
管道 如果尝试打印项目,我会遇到相同的错误

我得到的错误是

 File "crawler/pipelines.py", line 35, in process_item
            myitem.username = item['username']
        exceptions.TypeError: 'NoneType' object has no attribute '__getitem__'
I问题在于
InitSpider
。我的Piepline没有获取项目对象

items.py setting.py
BOT\u NAME='crawler'
SPIDER_模块=['SPIDER']
NEWSPIDER_模块='spider'
下载程序\u中间件={

“scrapy.contrib.downloadermiddleware.cookies.cookies中间件”:700#
管道。TestPipeline
缺少订单号。它应该类似于
ITEM_pipelines={'s pipelines.TestPipeline':900}
处理项目
函数的另一个问题。根据:

此方法为每个项目管道组件调用,并且必须返回包含数据、项目(或任何子类)对象的dict或引发DropItem异常。已删除的项目不再由其他管道组件处理

在您的情况下,可以在函数末尾添加一个return语句:

def process_item(self, item, spider):
    print item['username']
    return item

如果不包含return语句,则此管道的返回值为
None
。这就是为什么以下管道会抱怨-
item['username']
None
时,您不能执行
item[/username']
,这就是我所做的,并且成功了:

  • 在您的
    MytestSpider
    类中,只需以以下方式编写
    parse
    函数:

    def parse(self, response):
        yield {'username': "mytest"}
    
  • 删除
    items.py
    ,我没有创建任何Item类,它仍然有效

  • 在管道代码中:

    class TestPipeline(object):
    
        def process_item(self, item, spider):
            print item['username']
    
  • 在我的测试代码中,spider中我
    产生的所有内容似乎都将成为管道中的项目
    过程中的项目
    ,但产生的结果必须是一个字典或项目对象……就像上面的第一个答案一样

  • 在settings.py中,我不知道您的整个项目结构,因为这里的路径可能决定您是否将获得输出。 我假设“crawler”是一个文件夹,其中有另一个名为“spiders”的文件夹,您的spider代码在这个“spiders”文件夹中。您的pipelines.py也在“crawler”文件夹下 对我来说,这很有效:

    BOT_NAME = 'crawler'
    
    SPIDER_MODULES = ['crawler.spiders']
    NEWSPIDER_MODULE = 'crawler.spiders'
    
    ROBOTSTXT_OBEY = True
    DOWNLOAD_DELAY = 3
    
    ITEM_PIPELINES = {
       'crawler.pipelines.ScrapeNewsPipeline': 400,
    }
    
  • 最后,为了运行代码,我使用了python终端,cd将代码文件夹中有爬虫文件夹的地方,然后执行

    scrapy runspider crawler/spiders/my_test_spider.py
    

  • 虽然我的测试代码与你的测试代码并非100%相同,但希望这能有所帮助

    你应该发布所有代码以确保完整性(即项目代码和设置文件).目前,您正在创建一个带有代码片段的问题,修改该片段,然后发布另一个问题。例如,我不知道您为什么要使用models.TestUser()在TestPipeline中创建MyItem的实例。@Talvalin,很抱歉,我还将发布其他代码。我的模型是Django模型。但我们可以删除该行以供参考testing@Talvalin,我发现如果我在设置中有上面提到的其他管道,那么我会得到这个错误您会得到与上面不同的错误吗?@Talvalin否错误相同。是第二条管道导致了问题。我从设置中删除了第二条管道,然后一切正常。即使清空没有process item函数的其他管道主体,它也可以正常工作。但我定义了process item函数,然后出现此错误。我暂时删除了其他管道,以便我的代码能正常工作吗
    class TestPipeline(object):
    
        def process_item(self, item, spider):
            print item['username']
    
    BOT_NAME = 'crawler'
    
    SPIDER_MODULES = ['crawler.spiders']
    NEWSPIDER_MODULE = 'crawler.spiders'
    
    ROBOTSTXT_OBEY = True
    DOWNLOAD_DELAY = 3
    
    ITEM_PIPELINES = {
       'crawler.pipelines.ScrapeNewsPipeline': 400,
    }
    
    scrapy runspider crawler/spiders/my_test_spider.py