练习scrapy框架的管道存储时报错,报错代码:
class JuliveproPipeline:
fp = None
def start_spider(self,spider):
print('_______start crawl……')
self.fp = open('./julive.txt','w',encoding='utf-8')
def process_item(self, item, spider):
name = item['name']
sell_price = item['sell_price']
self.fp.write(name+'\t'+sell_price+'\n')
return item
def end_spider(self,spider):
print('_______finsh crawl!!!')
self.fp.close()
错误为代码:
AttributeError: ‘NoneType’ object has no attribute ‘write’
fp的布尔值属性没变,还是None,所以不能写,后面还有个不能close,都是一个意思。
错误原因:重写父类时候自己定义的start_spider方法和end_spider方法并没有被调用,因为人家只能调用固定的方法……还以为可以自定义的,所以报错了。
修改代码:
class JuliveproPipeline:
fp = None
def open_spider(self,spider):
print('_______start crawl……')
self.fp = open('./julive.txt','w',encoding='utf-8')
def process_item(self, item, spider):
name = item['name']
sell_price = item['sell_price']
self.fp.write(name+'\t'+sell_price+'\n')
return item
def close_spider(self,spider):
print('_______finsh crawl!!!')
self.fp.close()
改为open_spider和close_spider,运行结果为:
_______start crawl……
_______finsh crawl!!!
pipelines.py重写父类时候要注意,可调用方法有3个(目前学到的人家封装好的),open_spider process_item close_spider 其中process_item是一开始就能看到的,另外的开始时候执行一次的方法和结束后执行的方法一定要注意方法的命名,是固定了的。