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()