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

时间:2012-12-15 09:19:33

标签: 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(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。我的pieplines没有获取项目对象

items.py

class MyItem(Item):
    username = Field()

setting.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'

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

  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']
    
  4. 在我的测试代码中,似乎蜘蛛中的所有yield都将成为Pipeline process_item中的项目,但yield结果必须是字典或Item对象......像上面的第一个答案。

    1. 在settings.py中,我不知道您的整个项目结构,因为此处的路径可能决定您是否获得输出。 我认为&#39; crawler&#39;是一个文件夹,你有另一个名为&#39; spiders&#39;的文件夹,你的蜘蛛代码在这个&#39;蜘蛛&#39;夹。您的pipelines.py位于&#39; crawler&#39;文件夹也是 对我来说,这很有效:

      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到你有crawler文件夹的代码文件夹,然后执行

      scrapy runspider crawler/spiders/my_test_spider.py
      
    3. 虽然我的测试代码与您的测试代码不是100%相同,但希望这可能会有所帮助