Scrapy框架实现持久化存储

Posted harryblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy框架实现持久化存储相关的知识,希望对你有一定的参考价值。

硬盘存储

(1) 基于终端指令

* 保证parse方法返回一个可迭代类型的对象(存储解析到页面内容)
* 使用终端指定完成数据存储到磁盘文件的操作
     scrapy crawl 爬虫文件名称 -o 磁盘文件.后缀

def parse(self, response):
    # 建议使用xpath进行解析(框架集成了xpath解析的接口)
    div_list = response.xpath(//div[@id="content-left"]/div )
    # 存储解析到的页面数据
    data_list = []
    for div in div_list:
        # xpath解析到的指定内容存储到了Selector对象
        # extract()该方法可以将Selector对象存储中存储的数据值拿到
        author = div.xpath(./div/a[2]/h2/text()).extract_first()
        # extract_first = extract()[0]
        content = div.xpath(.//div[@class="content"]/span/text()).extract_first()
        data_dict = 
            author:author,
            content:content
        
        data_list.append(data_dict)
    return data_list

(2) 基于管道

* items: 存储解析到的页面数据
* piplines: 处理持久化存储的相关操作
* 代码流程:

  1. 将解析到的页面数据存储到items对象
  2. 使用yield关键字将items提交给管道文件进行处理
  3. 在管道文件中编写代码完成数据存储的操作
  4. 在配置文件开启管道操作
技术图片
class QiubaiSpider(scrapy.Spider):
    name = qiubai
    # allowed_domains = [‘www.qiushibaike.com/text‘]
    start_urls = [https://www.qiushibaike.com/text/]

    def parse(self, response):
        # 建议使用xpath进行解析(框架集成了xpath解析的接口)
        div_list = response.xpath(//div[@id="content-left"]/div )
        # 存储解析到的页面数据
        data_list = []
        for div in div_list:
            # xpath解析到的指定内容存储到了Selector对象
            # extract()该方法可以将Selector对象存储中存储的数据值拿到
            author = div.xpath(./div/a[2]/h2/text()).extract_first()
            # extract_first = extract()[0]
            content = div.xpath(.//div[@class="content"]/span/text()).extract_first()

            # 将解析到的数据值(author和content)存储到items对象
            item = SpiderqiubaiItem()
            item[author] = author
            item[content] = content
            # 将item对象提交给管道
            yield item
qiubai.py
技术图片
import scrapy
class SpiderqiubaiItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    author = scrapy.Field()
    content = scrapy.Field()
items.py
技术图片
class SpiderqiubaiPipeline(object):
    fp = None

    # 在整个爬虫过程中,该方法只会在开始爬虫的时候被调用一次
    def open_spider(self, spider):
        print(开始爬虫)
        self.fp = open(./qiubai_pipe.txt, w, encoding=utf-8)

    # 该方法可以接收爬虫文件提交过来的对象,并且对item对象中存储的页面数据进行持久化存储
    # 参数:item表示的就是接收到的item对象
    # 每当爬虫文件向管道提交一次item 则该方法就会执行一次
    def process_item(self, item, spider):
        # 取出item对象中存储的数据值
        author = item[author]
        content = item[content]
        # 持久化存储
        self.fp.write(author+":"+content+"\n\n\n")
        return item

    # 该方法只会在爬虫结束的时候被调用一次
    def close_spider(self, spider):
        print("爬虫结束")
        self.fp.close()
piplines.py

 

数据库存储

* 代码流程:

  1. 将解析到的页面数据存储到items对象
  2. 使用yield关键字将items提交给管道文件进行处理
  3. 在管道文件中编写代码完成数据存储(存入数据库)的操作
  4. 在配置文件开启管道操作
class SpiderqiubaiPipeline(object):
    conn = None

    # 在整个爬虫过程中,该方法只会在开始爬虫的时候被调用一次
    def open_spider(self, spider):
        # 连接数据库
        self.conn = pymysql.Connect(host=192.168.1.10, port=3306, user=root, password=cs1993413, db=qiubai)

    # 该方法可以接收爬虫文件提交过来的对象,并且对item对象中存储的页面数据进行持久化存储
    # 参数:item表示的就是接收到的item对象
    # 每当爬虫文件向管道提交一次item 则该方法就会执行一次
    def process_item(self, item, spider):
        # 1 连接数据库
        # 2 执行sql语句
        sql = insert into qiubai values("%s", "%s") %(item[author], item[content])
        self.cursor = self.conn.cursor()
        try:
            self.cursor.execute(sql)
            
            self.conn.commit()
        except Exception as e:
            self.conn.rollback()
        # 3 提交事务
        # 取出item对象中存储的数据值
        return item

    # 该方法只会在爬虫结束的时候被调用一次
    def close_spider(self, spider):
       self.conn.close()

redis存储

class SpiderqiubaiPipeline(object):
    conn = None

    # 在整个爬虫过程中,该方法只会在开始爬虫的时候被调用一次
    def open_spider(self, spider):
        # 连接数据库
        self.conn = redis.Redis(host=192.168.1.10, port=6379)

    def process_item(self, item, spider):
        data_dict = 
            author: item[author],
            content: item[content]
        
        self.conn.lpush(data, data_dict)
        return item

pipline高级操作

将数据同时存在本地以及数据库和redis上

# 将数据值存储到本地磁盘中
class QiubaiByFiels(object):
    fp = None

    def open_spider(self, spider):
        print(开始爬虫)
        self.fp = open(./qiubai_pipe.txt, w, encoding=utf-8)

    def process_item(self, item, spider):
        author = item[author]
        content = item[content]
        self.fp.write(author + ":" + content + "\n\n\n")
        return item

    def close_spider(self, spider):
        print("爬虫结束")
        self.fp.close()

将数据值存储到mysql数据库中

class QiubaiByMysql(object):
    conn = None

    def open_spider(self, spider):
        self.conn = pymysql.Connect(host=192.168.1.10, port=3306, user=root, password=cs1993413, db=qiubai)

    def process_item(self, item, spider):
        sql = insert into qiubai values("%s", "%s") % (item[author], item[content])
        self.cursor = self.conn.cursor()
        try:
            self.cursor.execute(sql)

            self.conn.commit()
        except Exception as e:
            self.conn.rollback()
        return item

    def close_spider(self, spider):
        self.conn.close()

settings.py

ITEM_PIPELINES = 
   spiderqiubai.pipelines.SpiderqiubaiPipeline: 300,
   spiderqiubai.pipelines.QiubaiByMysql: 200,
   spiderqiubai.pipelines.QiubaiByFiels: 100,

 

以上是关于Scrapy框架实现持久化存储的主要内容,如果未能解决你的问题,请参考以下文章

爬虫之Scrapy框架

scrapy框架之递归解析和post请求

Scrapy框架基础应用和持久化存储

爬虫学习 11.scrapy框架持久化存储

爬虫学习 12.scrapy框架之递归解析和post请求

scrapy 框架持久化存储