保存文件信息到本地 並用json形式 在pipelines.py中操作用代碼實現

1.


import codecs
import os
import json

class HongxiuPipeline(object):
    def __init__(self):
        self.file = codecs.open(filename='book.json',mode='w',encoding='utf-8')
        self.file.write('"book_list":[')
    def process_item(self, item, spider):
        res = dict(item)
        str = json.dumps(res,ensure_ascii=False)
        self.file.write(str)
        self.file.write(',\n')

        return item

    def close_spider(self,spider):
        self.file.seek(-1,os.SEEK_END)
        self.file.truncate()

        self.file.seek(-1,os.SEEK_END)
        self.file.truncate()

        self.file.write(']')
        self.file.close()

2.

#用來打開指定文件 並且對文件進行轉碼 防止出現亂碼問題
import codecs
import json
import os

class XiaoshuoPipeline(object):
    def __init__(self):

        #w 寫文件  w+  讀寫文件  r+   讀寫文件
        #前者讀寫文件 如果文件不存在 則創建
        # 後者讀寫文件 如果不存在 拋出異常
        self.file = codecs.open(filename='book.json',mode='w+',encoding = 'utf-8')
        self.file.write('"list":[')
    # 如果想要將數據寫入本地 或者使用數據庫的時候 這個方法需要保留
    def process_item(self, item, spider):
        # print(item)
        print('--------------------------------')
        #將item對象 轉化爲字典對象
        res = dict(item)
        # print(res)
        #dumps將字典對象轉化成字符串 ascii編碼是否可用
        # 如果直接將字典形式的數據寫入到文件中 會出錯
        # 所以 需要將字典形式的值,轉化成字符串寫入到文件夾中
        str = json.dumps(res,ensure_ascii=False)
        print(str)
        print('-----------------------------------')
        self.file.write(str)
        self.file.write(',\n')

    def open_spider(self,spider):
        print('爬蟲開始了')

    def close_spider(self,spider):
        print('爬蟲結束了')
        #刪除文件當中最後一個字符
        #-1 表示偏移量
        # SEEK_END 定位到文件的最後一個字符
        self.file.seek(-1,os.SEEK_END)
        #開始執行
        self.file.truncate()

        self.file.seek(-1,os.SEEK_END)
        self.file.truncate()

        self.file.write(']')
        self.file.close()

3.有些情況下 保存信息到本地時 需要兩層文件夾(文件夾內部有文件夾)就需要對第二層文件夾進行設置

import scrapy

# ImagesPipeline系統中下載圖片的管道
from scrapy.pipelines.images import ImagesPipeline
# 系統管道有下載圖片的功能 我們的管道繼承了系統通道 也有了下載圖片的功能
class ZhanzhangPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        #這個方法會循環執行 ,前面每次傳入一個人item
        # 這個item被交給了引擎,引擎又交給了管道來執行,管道里面有很多個方法
        # 這些方法會一次指定
        # print('管道執行')
        # print(item['title'])
        # print(item['img'])
        yield scrapy.Request(url = item['img'][0],meta={'item':item})
        # 管道里面提供了一系列的內置方法,這些會放在自動從第一個執行到最後一個
    def file_path(self,request,response=None,info = None):
        print('+++++++++++++++++++++++++++++++++++++++++++++++++++++++')
        item=request.meta['item']
        print(item['title'])
        print(item['img'])
        #設置圖籤的路徑爲  類名名稱/url地址
        img_name = item['img'][0].split('/')[-1]
        # 在拼接圖簽名字的時候 注意 /和\
        path = '%s/%s'%(item['title'],img_name)
                        #()內 前者爲第一層文件夾名 後者爲第一層文件夾下文件夾名
        return path

4.在存儲到本地時 也可以將信息存入sqlite3 數據庫中,同樣在管道文件pipelines.py中操作

#存入數據庫要先引入數據庫
import sqlite3
class HongixuPipeline(object):
    def process_item(self, item, spider):
        return item
class HongXiuDBPipeline(object):
    def open_spider(self,spider):
           #創建數據庫
        self.connect = sqlite3.connect('hongxiuDB')
          #創建光標
        self.cursor = self.connect.cursor()
         #利用光標執行操作,建出數據表
        self.cursor.execute('create table if not exists bookTable(name text,author next,img next,intro next)')
        self.connect.commit()

    def process_item(self,item,spider):
         #往數據庫中插入數據並執行(數據庫操作一定不能忘記執行 commit)
        self.cursor.execute('insert into bookTable(name,author,intro,img)VALUES ("{}","{}","{}","{}")'.format(item['name'],item['author'],item['intro'],item['img']))
        self.connect.commit()

    def close_spider(self,spider):
        #關閉時 先關閉光標再關閉數據庫
        self.cursor.close()
        self.connect.close()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章