1. 程式人生 > >Python中scrapy爬蟲框架的資料儲存方式(包含:圖片、檔案的下載)

Python中scrapy爬蟲框架的資料儲存方式(包含:圖片、檔案的下載)

注意:1、settings.py中ITEM_PIPELINES中數字代表執行順序(範圍是1-1000),引數需要提前配置在settings.py中(也可以直接放在函式中,這裡主要是放在settings.py中),同時settings.py需要配置開啟

2、 process_item() 從spider中yield過來的item, 都要執行這個函式。會被多次呼叫

3、return item:如果後面還有操作需要用到item,那麼在當前操作結束後必須return item供後面的操作使用!

一、scrapy自帶的儲存方式(圖片,文件的下載)

需要在settings.py中配置:主要是開啟

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {

    # 啟用scrapy自帶的圖片下載ImagesPipeline(None:為關閉)
    'scrapy.pipelines.images.ImagesPipeline': None,

    # 啟用scrapy自帶的檔案下載FilesPipeline
    # 'scrapy.pipelines.files.FilesPipeline': 2
# 如果採用自定義的CustomImagesPipeline,需要將自帶的ImagesPipeline設定為None。如下面的小說封面的下載和內容Mongodb的儲存 'NovelSpider.pipelines.CustomImagesPipeline': 1, 'NovelSpider.pipelines.MongoPipeline': 2, }

附加處理圖片的示例程式碼:(主要是通過做的result結果檢視資料!!)

如果需要這樣的操作就就在settings.py中開啟(示例程式碼是文章列表的圖片!)


from scrapy.pipelines.images import ImagesPipeline
class JobbolePipeline(object):
    def process_item(self, item, spider):
        return item


# 定義處理圖片的Pipeline
class ImagePipeline(ImagesPipeline):
    def item_completed(self, results, item, info):
        print('---',results)
        return item
        # 如果圖片能夠下載成功,說明這個文章是有圖片的。如果results中不存在path路徑,說明是沒有圖片的。
        # [(True, {'path': ''})]
        # if results:
        #     try:
        #         img_path = results[0][1]['path']
        #     except Exception as e:
        #         print('img_path獲取異常,',e)
        #         img_path = '沒有圖片'
        # else:
        #     img_path = '沒有圖片'

        # 判斷完成,需要將變數img_path重新儲存到item中。

二、儲存Json資料格式

直接使用cmd命令列(進入scrapy虛擬環境才行):scrapy crawl 專案名 -o 檔名.json -s FEED_EXPORT_ENCIDING=utf-8

自定義Json儲存:

import json


class JsonPipeline(object):
    def __init__(self):
        self.file = open('檔名.json', 'wb')

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line.encode('utf-8'))
        return item

    # def close_spider(self, spider):
    #     self.file.close()

在settings.py中配置:

ITEM_PIPELINES = {
    #'NovelSpider.pipelines.NovelspiderPipeline': 300,
    'NovelSpider.pipelines.JsonPipeline': 300,
    # 'NovelSpider.pipelines.MongoPipeline': 301,

    # 啟用scrapy自帶的圖片下載ImagesPipeline
    #'scrapy.pipelines.images.ImagesPipeline': None,

    # 啟用scrapy自帶的檔案下載FilesPipeline
    # 'scrapy.pipelines.files.FilesPipeline': None

    # 如果採用自定義的CustomImagesPipeline,需要將自帶的ImagesPipeline設定為None。
    #'NovelSpider.pipelines.CustomImagesPipeline': 1,
    #'NovelSpider.pipelines.MongoPipeline': 2,
}

三、儲存到Mongodb資料庫

現在sesttings.py中配置,如圖:

MONGOCLIENT = 'localhost'
#連線是的引數,novel為資料庫的名(自己定義)
DB = 'novel'
class MongoPipeline(object):
    def __init__(self, client, db):
        self.client = pymongo.MongoClient(client)
        self.db = self.client[db]

    # from_crawler()作用就是從settings.py中讀取相關配置,然後可以將讀取結果儲存在類中使用。
    @classmethod
    def from_crawler(cls, crawler):
        # 建立當前類的物件,並傳遞兩個引數。
        obj = cls(
            client=crawler.settings.get('MONGOCLIENT', 'localhost'),
            db=crawler.settings.get('DB', 'test')
        )
        return obj

    def process_item(self, item, spider):
        #novel資料庫名,儲存方式是更新式(url欄位更新),另一種存入方式覆蓋式:self.db['資料庫名'].insert_one(item)
        self.db['novel'].update_one({'url': item['url']}, {'$set': dict(item)}, True)
        # return item(如果後面還需要item就必須return)

配置settings.py檔案:

ITEM_PIPELINES = {
    #'NovelSpider.pipelines.NovelspiderPipeline': 300,
    #'NovelSpider.pipelines.JsonPipeline': 300,
    'NovelSpider.pipelines.MongoPipeline': 301,

    # 啟用scrapy自帶的圖片下載ImagesPipeline
    #'scrapy.pipelines.images.ImagesPipeline': None,

    # 啟用scrapy自帶的檔案下載FilesPipeline
    # 'scrapy.pipelines.files.FilesPipeline': None

    # 如果採用自定義的CustomImagesPipeline,需要將自帶的ImagesPipeline設定為None。
    #'NovelSpider.pipelines.CustomImagesPipeline': 1,
    #'NovelSpider.pipelines.MongoPipeline': 2,
}

簡單的方法:(省略了settings.py的配置Mongodb的引數和呼叫讀取配置!),還是需要配置settings.py中的ITEM_PIPELINES如上述程式碼!

import pymongo

class JobsPipeline(object):
    def process_item(self, item, spider):
        # 引數1 {'zmmc': item['zmmc']}: 用於查詢表中是否已經存在zmmc對應的documents文件。
        # 引數3 True: 更新(True)還是插入(False, insert_one())
        # 引數2 要儲存或者更新的資料
        #示例程式碼“zmcc”欄位,僅做參考!!!資料庫名是job
        self.db['job'].update_one({'zmmc': item['zmmc']}, {'$set': dict(item)}, True)
        return item

    def open_spider(self, spider):
        self.client = pymongo.MongoClient('localhost')
        self.db = self.client['jobs']

四、儲存到MySQL資料庫

注意:MySQL資料庫會出現非同步寫入,用來提高寫入速度防止出現寫入阻塞!

首先在MySQL資料庫中建立對應的表,注意欄位的設計!

匯入:

import pymysql
#BolePipeline:自定義的!
class BolePipeline(object):
    def __init__(self):
        self.db = None
        self.cursor = None   
    
    def process_item(self, item, spider):
        #資料庫的名字和密碼自己知道!!!bole是資料庫的名字
        self.db = pymysql.connect(host='localhost', user='root', passwd='123456', db='bole')
        self.cursor = self.db.cursor()
        #由於可能報錯所以在這重複拿了一下item中的資料,存在了data的字典中
        data = {
            "list_sort":item['list_sort'],
            "article_sort":item['article_sort'],
            "title":item['title'],
            "article_url":item['article_url'],
            "zan":item['zan'],
            "content": item['content']
        }
        #注意:MySQL資料庫命令語句
        insert_sql = "INSERT INTO bole (list_sort, article_sort, title, article_url,zan, content) VALUES (%s,%s,%s,%s,%s,%s)"
        try:
            self.cursor.execute(insert_sql, (data['list_sort'], data['article_sort'], data['title'], data['article_url'],data['zan'], data['content']))
            self.db.commit()
        except Exception as e:
            print('問題資料跳過!.......',e)
            self.db.rollback()
        self.cursor.close()
        self.db.close()
        return item

在settings.py中配置:
ITEM_PIPELINES = {
    #'NovelSpider.pipelines.NovelspiderPipeline': 300,
    #'NovelSpider.pipelines.JsonPipeline': 300,
    #'NovelSpider.pipelines.MongoPipeline': 301,
    'NovelSpider.pipelines.BolePipeline': 301,
    # 啟用scrapy自帶的圖片下載ImagesPipeline 
    #'scrapy.pipelines.images.ImagesPipeline': None, 
    # 啟用scrapy自帶的檔案下載FilesPipeline 
    # 'scrapy.pipelines.files.FilesPipeline': None 
    # 如果採用自定義的CustomImagesPipeline,需要將自帶的ImagesPipeline設定為None。 
    #'NovelSpider.pipelines.CustomImagesPipeline': 1, 
    #'NovelSpider.pipelines.MongoPipeline': 2,
}

簡單方式:最後在settings.py中配置!

import pymysql

class HongxiuPipeline(object):
    #示例程式碼是儲存小說資訊
    # process_item() 從spider中yield過來的item, 都要執行這個函式。會被多次呼叫
    def process_item(self, item, spider):  
        insert_sql = "INSERT INTO hx(title, author, tags, total_word_num, keep_num, click_num, info) VALUES (%s, %s, %s, %s, %s, %s, %s)"
        self.cursor.execute(insert_sql, (item['title'], item['author'], item['tags'], item['total_word_num'], item['keep_num'], item['click_num'], item['info']))
        self.connect.commit()

    # open_spider()和close_spider():只在爬蟲被開啟和關閉時,執行一次。
    def open_spider(self, spider):
        self.connect = pymysql.connect(
            host='localhost',
            user='root',
            port=3306,
            passwd='123456',
            db='hongxiu',
            charset='utf8'
        )
        self.cursor = self.connect.cursor()

    def close_spider(self, spider):
        self.cursor.close()
        self.connect.close()

五、儲存Excel中(.csv格式)

cmd命令直接儲存(注意:必須進入scrapy虛擬環境中!儲存後表格中有空行!):

scrapy crawl 專案名 -o 檔名.csv -s FEED_EXPORT_ENCIDING=utf-8

自定義建立表格(以儲存招聘資訊為例):

#excel儲存
class Excel(object):
    #def __init__(self):
        #self.row = 1

    def creat_excel(self):
        # 1.建立workbook物件
        book = xlwt.Workbook(encoding='utf-8')
        # 2.建立選項卡
        # 此處選項卡名字為:職位簡介
        sheet = book.add_sheet('職位簡介')
        # 3.新增頭
        # 第一個引數是行,第二個引數是列,第三個引數是列的欄位名
        sheet.write(0, 0, '職位名稱')
        sheet.write(0, 1, '工作地點')
        sheet.write(0, 2, '公司月薪')
        sheet.write(0, 3, '職位要求')

        return book, sheet



class PythonjobPipeline(object):
    print("---------開始儲存!!")
    def __init__(self):
        self.row = 1
        obj = Excel()
        self.book, self.sheet = obj.creat_excel()

    def process_item(self, item, spider):
        self.sheet.write(self.row, 0, item['title'])
        print(item['title'])
        self.sheet.write(self.row, 1, item['addr'])
        self.sheet.write(self.row, 2, item['money'])
        self.sheet.write(self.row, 3, item['company_detail'])

        self.row += 1
        self.close_file(item)

    def close_file(self,item):
        self.book.save('職位簡介.xls')
        return item
在settings.py中配置
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'scrapy.pipelines.files.FilesPipeline': None,
    'pythonjob.pipelines.PythonjobPipeline': 300,
   
}

六、自定義下載圖片和文件並儲存

首先:在settings.py中設定引數

# 配置圖片的儲存目錄
IMAGES_STORE = 'pics'
# 在ImagesPipeline進行下載圖片是,配置圖片對應的Item欄位
IMAGES_URLS_FIELD = 'pic_src'

FILES_STORE = 'novel'

FILES_URLS_FIELD = 'download_url'


圖片下載儲存:

匯入:

from scrapy.http import Request
from scrapy.pipelines.images import ImagesPipeline
class CustomImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        # 從item中獲取要下載圖片的url,根據url構造Request()物件,並返回該物件
        image_url = item['img_url'][0]
        yield Request(image_url, meta={'item': item})

    def file_path(self, request, response=None, info=None):
        # 用來自定義圖片的下載路徑
        item = request.meta['item']
        url = item['img_url'][0].split('/')[5]
        return '%s.jpg'%url

    def item_completed(self, results, item, info):
        # 圖片下載完成後,返回的結果results
        print(results)
        return item

settings.py中配置

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    # 'NovelSpider.pipelines.NovelspiderPipeline': 300,
   
    # 啟用scrapy自帶的圖片下載ImagesPipeline
    'scrapy.pipelines.images.ImagesPipeline': None,

    # 啟用scrapy自帶的檔案下載FilesPipeline
    # 'scrapy.pipelines.files.FilesPipeline':None,

    # 如果採用自定義的CustomImagesPipeline,需要將自帶的ImagesPipeline設定為None。
    'NovelSpider.pipelines.CustomImagesPipeline': 1,
}

檔案的下載儲存(類比圖片的下載儲存)

#圖片++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class CustomImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        # 從items中獲取要下載圖片的url, 根據url構造Requeset()物件, 並返回該物件
        # sort_title = item['sort_title']
        try:
            image_url = item['pic_src'][0]
            yield Request(image_url, meta={'item': item})
        except:
            image_url = 'https://www.qisuu.la/modules/article/images/nocover.jpg'
        yield Request(image_url, meta={'item': item})

    def file_path(self, request, response=None, info=None):
        item = request.meta['item']
        return '{}/{}.jpg'.format(item['sort'], item['novel_name'])

    def item_completed(self, results, item, info):

        print(results)
        return item

#文字++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class CustomFilesPipeline(FilesPipeline):
    def get_media_requests(self, item, info):

            download_url = item['download_url'][0]
            download_url = download_url.replace("'",'')
            print(download_url)
            yield Request(download_url, meta={'item':item})

    def file_path(self, request, response=None, info=None):
        item = request.meta['item']
       #建立sort_name檔案,在裡面儲存novel_name檔案
        return '%s/%s' % (item['sort'],item['novel_name'])

    def item_completed(self, results, item, info):
        print(results)
        return item

配置settings.py:

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   # 'qishutest.pipelines.QishutestPipeline': 300,
# 啟用scrapy自帶的圖片下載ImagesPipeline
    'scrapy.pipelines.images.QishutestPipeline': None,

    # 啟用scrapy自帶的檔案下載FilesPipeline
    'scrapy.pipelines.files.FilesPipeline': None,

    # 如果採用自定義的CustomImagesPipeline,需要將自帶的ImagesPipeline設定為None。
    'qishutest.pipelines.CustomImagesPipeline':1,
    'qishutest.pipelines.CustomFilesPipeline':2,
}

相關推薦

Pythonscrapy爬蟲框架資料儲存方式包含圖片檔案下載

注意:1、settings.py中ITEM_PIPELINES中數字代表執行順序(範圍是1-1000),引數需要提前配置在settings.py中(也可以直接放在函式中,這裡主要是放在settings.py中),同時settings.py需要配置開啟2、 process_it

PythonScrapy 爬蟲框架部署

python scrapy 爬蟲框架 Scrapy 是采用Python 開發的一個快速可擴展的抓取WEB 站點內容的爬蟲框架。安裝依賴 yum install gcc gcc-c++ openssl mysql mysql-server libffi* libxml* libxml2 l

PythonScrapy爬蟲框架安裝及簡單使用

intern 原理 seda api release linux發行版 3.5 pic www 題記:早已聽聞python爬蟲框架的大名。近些天學習了下其中的Scrapy爬蟲框架,將自己理解的跟大家分享。有表述不當之處,望大神們斧正。 一、初窺Scrapy Scrapy是

Python scrapy框架安裝以及簡單介紹

一、Scrapy的安裝 1. 如果電腦中安裝有Anaconda 直接輸入conda install scrapy 進行安裝. 2. 如果沒有安裝Anaconda,就需要進入http://www.lfd.uci.edu/~gohlke/pythonlibs/,從該網站找到lxml的相關檔案。假

Python影象的陣列化儲存方式

一張720*250的RGB圖片,個人感覺圖片是說的長乘以寬(長720個畫素寬250個畫素),跟陣列的m*n,m行n列還不一樣,所以會以250*720*3的方式存在一個三維陣列中(250行720列),在python的Variable Explorer中,點開陣列會

Python使用Scrapy爬蟲框架爬取天涯社群小說“大宗師”全文

大宗師是著名網路小說作家蛇從革的系列作品“宜昌鬼事”之一,在天涯論壇具有超級高的訪問量。這個長篇小說於2015年3月17日開篇,並於2016年12月29日大結局,期間每天有7萬多讀者閱讀。如果在天涯社群直接閱讀的話,會被很多讀者留言干擾,如圖 於是,我寫了下面的程式碼,從

Android的5種資料儲存方式之——SharedPreferences

SharedPreferences 簡介 SharedPreferences是Android平臺上一個輕量級資料儲存方式,用來儲存應用的一些常用配置,比如Activity狀態,Activity暫停時,將此activity的狀態保到SharedPer

python字串的幾種表達方式用什麼方式表示字串

說明:   今天在學習python的基礎的內容,學習在python中如何操作字串,在此記錄下.   主要是python中字串的幾種表達,表示方式。 python的幾種表達方式   1 使用單引號擴起來字串 >>> 'my python lession' #以單引號

scrapy爬蟲框架簡單入門例項

接著上一篇文章,我們已經可以用爬蟲訪問目標網站爬取頁面了,現在需要自動提交表單查詢資料,並且從頁面中篩選出每期中獎號碼儲存為json檔案匯出。首先建立一個scrapy.Item類(開啟專案資料夾下的items.py檔案): import scrapy class SsqSpiderIte

scrapy爬蟲框架簡單入門例項

scrapy是一個用於爬取網站資料,提取結構性資料的python應用框架。爬取的資料一般用於資料分析,資料處理,儲存歷史資料等。scrapy的整體架構大致如下: 主要包括了以下元件: 引擎(Scrapy) 用來處理整個系統的資料流, 觸發事務(框架核心) 排程器(

怎樣解決安裝scrapy爬蟲框架失敗的問題圖文教程

下面是我安裝scrapy成功的經歷,分享給大家: 安裝scrapy一般使用:pip install scrapy 是安裝不成功的,在安裝的過程中會報錯,本人的安裝過程中報錯的資訊如下: 1.第一個錯誤提示: 錯誤的原因:沒有安裝Twisted Failed

java代理,靜態代理,動態代理以及spring aop代理方式,實現原理統一彙總 SpringAOP的兩種代理方式Java動態代理和CGLIB代理

若代理類在程式執行前就已經存在,那麼這種代理方式被成為 靜態代理 ,這種情況下的代理類通常都是我們在Java程式碼中定義的。 通常情況下, 靜態代理中的代理類和委託類會實現同一介面或是派生自相同的父類。 一、概述1. 什麼是代理我們大家都知道微商代理,簡單地說就是代替廠家賣商品,廠家“委託”代理為

Python 的類變數和例項變數關鍵詞Python/類變數/例項變數

類變數: class 語句的頂層進行賦值的變數,會被附加在類中,被所有例項所共享; 例項變數:附加在例項上的變數,不被共享,可通過這 2 種方式建立或修改: aInstance.name = sth 的形式; 類的例項方法中,self.name = sth 的形式。

python 3.x 爬蟲基礎---正則表示式案例爬取貓眼資訊,寫入txt,csv,下載圖片

python 3.x 爬蟲基礎 前言   正則表示式是對字串的一種邏輯公式,用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則的字串”,此字串用來表示對字串的一種“過濾”邏輯。正在在很多開發語言中都存在,而非python獨有。對其知識點進行總結後,會寫一個demo。 1.正

python判斷是否為完全平方數在9999平方的範圍內

# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ num=input("Please inp

iOS資料儲存持久化plist,偏好設定,歸檔

1,plist 使用plist儲存資料,首先要指定路徑(一般在Document路徑下),plist只支援以下的型別: NSArray; NSMutableArray; NSDictionary; NSMutableDictionary; NSData; NSMutableD

python7種實現單例模式的方法staticmethodclassmethod類屬性方法__new__裝飾器元類名字覆蓋

本文的以下實現方法為了簡單起見不考慮執行緒安全。 一:staticmethod 程式碼如下: class Singleton(object): instance = None def __init__(self): raise Syntax

pythonos模塊簡單了解系統命令和路徑的獲取

std dirname 寫字板 大小 腳本 工作 users pri 獲取文件屬性 import osos:包含了普遍的操作系統的功能#獲取炒作系統類型,nt-->windows posix-->Linux.Unix或者# Mac os Xprint(os.

SpringMVC總結之資料轉換器時間引數轉換器

  1.前言 SpringMVC 通過反射機制對處理方法的簽名進行分析,並將請求資訊繫結到處理方法的引數中,在請求訊息到達處理方法期間,SpringMVC 還會完成資料轉換,資料格式化和資料檢驗等工作; 2.Converter轉換器 2.1 Spring在org.fra

深度學習框架keras平臺搭建關鍵字windows非GPU離線安裝

當下,人工智慧越來越受到人們的關注,而這很大程度上都歸功於深度學習的迅猛發展。人工智慧和不同產業之間的成功跨界對傳統產業產生著深刻的影響。 最近,我也開始不斷接觸深度學習,之前也看了很多文章介紹,對深度學習的歷史發展以及相關理論知識也有大致瞭解。 但常言道:紙上得來終覺淺,