在整个scrapy框架中其中的一个最关键的步骤就是保存文件,在scrapy中保存文件的方式有很多,其中最简单的一种就是直接在执行scrapy时在后面加上-o 加上要保存的文件名称就可以
scrapy crawl 项目名 -o 文件名称
但是这种现在文件的方式并不是很受官方推荐,原因就是他有很大的局限性,最大的一点就是他只能保存文本内容像是一些下载图片的功能就实现不了,其中最受官方推荐保存文件方式就是使用piplines这个文件进行保存文件
piplines开始使用
首先我们需要在settings中对下面的几个代码进行取消注释
ITEM_PIPELINES = {
'gupiao.pipelines.GupiaoPipeline': 300,
}
这里的300表示他的优先级,有时候我们会在一个scrapy项目中爬取多个网站,这里的300就表示我们运行这个的顺序,前面的就对应这相应的项目名称,不过在现在来说我们并不需要进行修改
piplines文件
我们首先需要明白piplines这个文件的作用,他的作用就是用来保存文件,首先在我们打开文件时候scrapy就已经生成了一个类,类下面就有一个对应的名为process_item的方法,这个方法里面的item就是我们在我们items文件中设置的一个类,他是一个类似字典类型的数据,我们一般就是这个方法下面设置如何下载文件
但是这个文件的功能并没有这么的low,我们还可以在这个类中定义两个方法一个是open_spider,还有一个是close_spider 看他们的名字就只到他们的作用,一个是就是打开这个piplines时就执行的方法,另外一个是关闭这个piplines执行的方法注意:这两个方法都要有一个参数是spider 这里的open_spider方法就类似与类中的_init_()
下面是一个piplines示例
import time
import pandas as pd
import csv
import os
class GupiaoPipeline(object):
def open_spider(self,spider):
now_time=time.strftime('%Y-%m-%d',time.localtime(time.time()))
csv_headers = ['data' + str(i) for i in range(0, 14)]
# csv_headers=['基金代码','基金名称','单位净值(元)','日涨幅(%)','周涨幅(%)','月涨幅(%)','季涨幅(%)','半年涨幅(%)','年涨幅(%)','今年以来(%)','成立以来(%)','费率(%)','起购金额(元)','最新净值时间']
with open('{}.csv'.format(str(now_time)),'a+') as f:
ride=csv.DictWriter(f,csv_headers)
ride.writeheader()
def process_item(self, item, spider):
print(item)
now_time=time.strftime('%Y-%m-%d',time.localtime(time.time()))
csv_headers=['data'+str(i) for i in range(0,14)]
with open('{}.csv'.format(str(now_time)),'a+') as f:
ride=csv.DictWriter(f,csv_headers)
ride.writerow(item)
return item
def close_spider(self,spider):
now_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
label=pd.read_csv('{}.csv'.format(now_time))
csv_headers = ['基金代码', '基金名称', '单位净值(元)', '日涨幅(%)', '周涨幅(%)', '月涨幅(%)', '季涨幅(%)', '半年涨幅(%)', '年涨幅(%)',
'今年以来(%)', '成立以来(%)', '费率(%)', '起购金额(元)', '最新净值时间']
label.columns=csv_headers
label.to_csv('{}.csv'.format(now_time),index=False)