欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scrapy爬虫保存数据

程序员文章站 2022-05-08 16:00:56
...

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 }