scrapy爬虫保存数据
1.数据保存为TXT
打开Pipeline.py
import codecs import os import json import pymysql class CoolscrapyPipeline(object):#需要在setting.py里设置'coolscrapy.piplines.CoolscrapyPipeline':300 def process_item(self, item, spider): # 获取当前工作目录 base_dir = os.getcwd() fiename = base_dir + '/news.txt' # 从内存以追加的方式打开文件,并写入对应的数据 with open(fiename, 'a') as f: f.write(item['title'] + '\n') f.write(item['link'] + '\n') f.write(item['posttime'] + '\n\n') return item
2.保存为json格式
在Pipeline.py里面新建一个类
#以下两种写法保存json格式,需要在settings里面设置'coolscrapy.pipelines.JsonPipeline': 200 class JsonPipeline(object): def __init__(self): self.file = codecs.open('logs.json', 'w', encoding='utf-8') def process_item(self, item, spider): line = json.dumps(dict(item), ensure_ascii=False) + "\n" self.file.write(line) return item def spider_closed(self, spider): self.file.close() class JsonPipeline(object): def process_item(self, item, spider): base_dir = os.getcwd() filename = base_dir + '/news.json' # 打开json文件,向里面以dumps的方式吸入数据 # 注意需要有一个参数ensure_ascii=False ,不然数据会直接为utf编码的方式存入比如 # :“/xe15” with codecs.open(filename, 'a') as f: line = json.dumps(dict(item), ensure_ascii=False) + '\n' f.write(line) return item
上面是两种写法,都是一样的
3.保存到mysql
在Pipeline.py里面新建一个类
import json,pymysql class TianyaBbsPipeline(object): def open_spider(self,spider): self.conn=pymysql.Connect(host='localhost',db='books',user='book',port=3306,passwd='1q2w3e4r5t',charset='utf8')#连接数据库 self.course=self.conn.cursor(cursor=pymysql.cursors.DictCursor)#创建游标 sql="create database if not exists tianya character set utf8"#创建一个数据库(判断是否存在,不存在就创建,存在就不创建) self.course.execute(sql)#执行sql sql='''Create Table If Not Exists tianya.guihua ( id Bigint(8) unsigned Primary key Auto_Increment, thTime DateTime, title varchar(50), auth varchar(50), content text(50) ) Engine InnoDB'''#创建表(存在就不创建,不存在就创建) self.course.execute(sql) def process_item(self, item, spider): if isinstance(item,TianyaBbsItem): if item['bbs_title']==None or item['auth_name']==None or item['content']==None: return item sql='insert into tianya.guihua (title,auth,content)values(%s,%s,%s)' self.course.execute(sql,(item['bbs_title'],item['auth_name'],item['content'])) self.conn.commit() return item def close_spider(self,spider): self.course.close() self.conn.close()
编写Settings.py
我们需要在Settings.py将我们写好的PIPELINE添加进去,
scrapy才能够跑起来
这里只需要增加一个dict格式的ITEM_PIPELINES,
数字value可以自定义,数字越小的优先处理
1 ITEM_PIPELINES={'coolscrapy.pipelines.CoolscrapyPipeline':300, 2 'coolscrapy.pipelines.JsonPipeline': 200, 3 'coolscrapy.pipelines.TianyaBbsPipeline': 100, 4 }