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 }

 

posted @ 2018-07-30 15:29  音量  阅读(263)  评论(0编辑  收藏  举报