在上一篇文章中,谈及了如何使用scrapy取获取网页数据,可参考Scrapy入门学习之初步探索。在此继续谈一下数据保存和一些settings.py的配置。
文中会继续上文的豆瓣读书小项目,并新增一个爬取简书所有用户信息的爬虫小项目,文章力求能够讲清学习时所遇到的坑,所以略显冗长。如若您没有耐心,就别往下翻了O(∩_∩)O~
环境申明:
Python3+Pycharm2017
所需第三方包:
scrapy,pymysql
数据库:
MySQL5.7
使用item-pipeline保存数据
学习爬虫主要是为了收集一些数据用于分析,而用的多的数据格式无非就是json,csv或是通过数据库MySQL,mongodb等。
在此,系统的记录相应的数据格式处理方式。
OK,这里你需要做的有:
- 在items.py中定义你需要的数据
- 在pipelines.py中定义你处理数据的方式
- 在settings.py中注册定义的pipeline
首先scrapy自带了相应模块用于处理数据,在item export中
- ‘CsvItemExporter’,
- ‘JsonItemExporter’
scrapy文档使用 Item Exporter
建议直接阅读源码
保存为csv数据
- 自定义保存
在Pipelines.py中定义item数据的处理方式,如下代码,定义了CsvPipeline类,并在settings.py中的ITEM_PIPELINES注册即可。
ITEM_PIPELINES = {
#’JianShu.pipelines.JianshuPipeline’: 300 ,
’ JianShu.pipelines.JsonEncodingPipeline’:1 ,#这里1是优先级
}
注意
启用一个 Item Pipeline 组件,
必须将它的类添加到 ITEM_PIPELINES 配置,分配给每个类的整型值,确定了他们运行的顺序,item 按数字从低到高的顺序,通过 pipeline,通常将这些数字定义在 0-1000 范围内。
class CsvPipeline(object):
def __init__(self):
self.csvf=open('db_Top250.csv','a+',encoding='utf-8',newline='')
self.writer=csv.writer(self.csvf)#这里可以加入delimiter=','分隔符参数,默认为逗号
self.writer.writerow(['书名','作者','国家','荐语','出版时间','出版社','评分','Star','参与短评人次','力荐','推荐','还行','较差','烂'])
self.csvf.close()
def process_item(self,item,spider):
with open('db_Top250.csv','a+',encoding='utf-8',newline='')as f:
writer=csv.writer(f)
writer.writerow([item['title'],item['author'],item['country'],item['note'],item['publish_date'],item['press'],item['Score'],item['Star'],item['People_nums'],item['s5'],item['s4'],item['s3'],item['s2'],item['s1']])
return item
注意事项:
- 打开文件时有个newline=’ ‘参数,避免写入数据后会空一行
encoding=’utf-8’,碰到了excel中打开csv中文无法正常显示的情况,如图。目前解决方法有:
用记事本、sublime或pycharm打开,可以正常显示。再以ANSI或utf8-bom编码保存,再次用excel打开正常显示
- 使用item export中的CsvItemExporter
一样要在settings.py中注册
导入from scrapy.contrib.exporter import CsvItemExporter
同样是在pipelines.py中
class CSVPipeline(object):
def __init__(self):
self.files = {}
def from_crawler(cls, crawler):
pipeline = cls()
crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
return pipeline
def spider_opened(self, spider):
file = open('%s_items.csv' % spider.name, 'w+b')
self.files[spider] = file
self.exporter = CsvItemExporter(file)
#self.e