10

这是我的简单代码,我没有让它工作。

我从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

管道

class TestPipeline(object):
    def process_item(self, item, spider):
            print item['username']

如果尝试打印该项目,我会收到同样的错误

我得到的错误是

 File "crawler/pipelines.py", line 35, in process_item
            myitem.username = item['username']
        exceptions.TypeError: 'NoneType' object has no attribute '__getitem__'

我的问题是InitSpider。我的管道没有获取项目对象

项目.py

class MyItem(Item):
    username = Field()

设置.py

BOT_NAME = 'crawler'

SPIDER_MODULES = ['spiders']
NEWSPIDER_MODULE = 'spiders'


DOWNLOADER_MIDDLEWARES = {

    'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700 # <-
}

COOKIES_ENABLED = True
COOKIES_DEBUG = True


ITEM_PIPELINES = [

'pipelines.TestPipeline',


]

IMAGES_STORE = '/var/www/htmlimages'
4

3 回答 3

3

pipelines.TestPipeline缺少订单号。它应该是类似的东西ITEM_PIPELINES = {'pipelines.TestPipeline': 900}

于 2015-01-02T07:25:23.823 回答
2

process_item您的功能还有另一个问题。根据官方文档

为每个项目管道组件调用此方法,并且必须返回带有数据的字典、项目(或任何后代类)对象或引发 DropItem 异常。丢弃的项目不再由其他管道组件处理。

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

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

如果不包含 return 语句,则此管道的返回值为None. 这就是为什么下面的管道抱怨——你不能做item['username']when itemis None

于 2016-04-10T01:51:54.430 回答
2

这就是我所做的并且有效:

  1. 在您的MytestSpider课程中,只需以这种方式编写parse函数:

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

  3. 在您的管道代码中:

    class TestPipeline(object):
    
        def process_item(self, item, spider):
            print item['username']
    

在我的测试代码中,似乎我yield在蜘蛛中的所有内容都将成为 Pipeline 中的项目process_item,但产量结果必须是字典,或 Item 对象......就像上面的第一个答案一样。

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

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

    scrapy runspider crawler/spiders/my_test_spider.py
    

虽然我的测试代码与你的不是 100% 相同,但希望这可能会有所帮助

于 2016-11-21T00:20:20.390 回答