scrapy持久化存儲的幾種方式的簡介


從存儲方式上分為2種,存入磁盤和數據庫。

如下是原始的爬蟲代碼

# -*- coding: utf-8 -*-
import scrapy


class FirstfileSpider(scrapy.Spider):
    name = 'firstfile'
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
        # 使用框架的xpath接口
        list_div = response.xpath('//div[@id="content-left"]/div')
        for div in list_div:
            author = div.xpath("./div/a[2]/h2/text()").extract()[0]
            content = div.xpath("./a/div/span/text()").extract()[0]

a.磁盤文件

1.基於終端指令的持久化存儲

   首先保證parse方法返回一個可迭代類型的對象(存儲解析到的頁面內容),再使用終端指令完成數據存儲到制定磁盤文件中的操作。代碼修改如下

# -*- coding: utf-8 -*-
import scrapy


class FirstfileSpider(scrapy.Spider):
    name = 'firstfile'
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
        # 使用框架的xpath接口
        list_div = response.xpath('//div[@id="content-left"]/div')
        # 存儲解析到的頁面數據
        data_list = []
        for div in list_div:
            author = div.xpath("./div/a[2]/h2/text()").extract()[0]
            content = div.xpath("./a/div/span/text()").extract()[0]

            res_dict = {
                "author": author,
                "content": content,
            }
            data_list.append(res_dict)
        return data_list

終端輸入參數為:scrapy crawl  你的文件名 –o test.csv

當然你也可以用其他的格式。在打開test.csv可以看見結果。

image

2.基於管道的持久化存儲

如同Django里面的models一樣,items.py用來設置數據存儲模版,結構化數據。pipelines用來數據持久化處理。總的來說就是items先存儲解析到的頁面數據,然后pipelines處理持久化存儲的相關操作.

代碼的實現流程:

   1.將解析到的頁面數據存儲到items對象

   2.使用yield關鍵字將items提交給管道文件進行處理

   3.在管道文件編寫代碼完成數據存儲的操作

   4.在配置文件中開啟管道操作

firstproject(爬蟲文件名字).py

# -*- coding: utf-8 -*-
import scrapy
from firstproject.items import FirstprojectItem


class FirstfileSpider(scrapy.Spider):
    name = 'firstfile'
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
        list_div = response.xpath('//div[@id="content-left"]/div')
        for div in list_div:
            author = div.xpath("./div/a[2]/h2/text()").extract()[0]
            content = div.xpath(".//div[@class='content']/span/text()").extract()[0]
            print(author)
            print(content)
            # 1 存儲到items對象
            item = FirstprojectItem()
            item['author'] = author
            item['content'] = content
            # 2 提交給管道
            yield item

items.py

import scrapy

class FirstprojectItem(scrapy.Item):
    # define the fields for your item here like:
    author = scrapy.Field()
    content = scrapy.Field()

pipelines.py

class FirstprojectPipeline(object):
    fp = None

    def open_spider(self, spider):
        # 該方法再整個流程中被調用一次
        print("開始爬蟲")
        self.fp = open("./test.txt", "w", encoding="utf-8")
    # 爬蟲每向管道提交一次item,該方法就會被執行一次

    def process_item(self, item, spider):
ITEM_PIPELINES = {
   'firstproject.pipelines.FirstprojectPipeline': 300,
}
        # item就是接受到的item對象
        author = item["author"]
        content = item["content"]
        # 持久化存儲操作
        self.fp.write(author+":"+content)
        return item

    def close_spider(self, spider):
        print("爬蟲結束")
        self.fp.close()

settings.py中添加這一行

ITEM_PIPELINES = {
   'firstproject.pipelines.FirstprojectPipeline': 300,
}

b.數據庫

代碼流程:類似於管道持久化,區別就是pipelines文件中持久化方式的區別

1.基於mysql持久化存儲

在上面的基礎上修改下pipelines文件,其他注意提前在mysql創建好相應的表的列和行

import pymysql
class FirstprojectPipeline(object):
    conn = None
    cursor = None

    def open_spider(self):
        self.conn = pymysql.Connect(host="127.0.0.1", port=3306, user='root')

    def process_item(self, item, spider):
        # item就是接受到的item對象
        author = item["author"]
        content = item["content"]
        sql = 'insert into qiubai values ("%s","%s")' % (author, content)
        self.cursor = self.conn.cursor()
        try:
            self.cursor.execute(sql)
            self.conn.commit()
        except Exception as e:
            print(e)
            self.conn.rollback()
        return item

    def close_spider(self):
        self.cursor.close()

2.基於redis存儲

由於windows對redis支持不友好,所以我們這里在Linux上開發。非分布式的爬蟲在這里實際上和基於mysql只有pipelines文件的區別。

首先開啟好redis服務,再連接即可。注意這里的python的redis模塊使用的是2.10.6版本。使用命令pip3 install redis-2.10.6來回退版本。

import redis
class FirstprojectPipeline(object):
    conn = None

    def open_spider(self, spider):
        print("start spider")
        self.conn = redis.Redis(host="127.0.0.1", port=6379)

    def process_item(self, item, spider):
        my_dict = {
            "author": item['author'],
            'content': item['content'],
        }
        print(my_dict)
        try:
            self.conn.rpush("my_data", my_dict)
        except Exception as e:
            print(e)
        return item

然后在終端輸入redis-cli開啟客戶端,輸入hgetall my_data查看是否寫入即可。可能會抽風,等待下網絡即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM