博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scrapy之持久化存储
阅读量:6456 次
发布时间:2019-06-23

本文共 4152 字,大约阅读时间需要 13 分钟。

下面演示基于管道存储到mysql、redis、和本地文件

代码实现流程

1. 将解析到的页面数据存储到items对象

2. 使用yield关键字将items提交给管道文件进行处理
3. 在管道文件中编写代码完成数据存储的操作
4. 在配置文件中开启管道操作

代码实现

items:存储解析到的页面数据

pipelines:处理持久化存储的相关操作

下面以抓取糗百的段子为例:

 

爬虫相关操作

# -*- coding: utf-8 -*-import scrapyfrom qiubai.items import QiubaiItemclass QiubaiSpiderSpider(scrapy.Spider):    name = 'qiubai_spider'    # 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')        # 存储解析到的页面数据        for div in div_list:            # xpath解析到的指定内容被存储到了Selector对象            # extract()该方法可以将Selector对象中存储的数据值拿到            # author = div.xpath('./div/a[2]/h2/text()')            # extract_first()  ==   extract()[0]            author = div.xpath('./div/a[2]/h2/text()').extract_first()            content = div.xpath('.//div[@class="content"]/span/text()').extract_first()            # 1. 创建item对象            item = QiubaiItem()            item['author'] = author            item['content'] = content            # 2. 提交给管道            yield item

 

储存解析到的页面数据:

# -*- coding: utf-8 -*-# Define here the models for your scraped items## See documentation in:# https://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass QiubaiItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    # 声明属性    author = scrapy.Field()    content = scrapy.Field()

 

处理持久化储存

# -*- coding: utf-8 -*-# Define your item pipelines here## Don't forget to add your pipeline to the ITEM_PIPELINES setting# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport redisimport pymysqlclass QiubaiPipeline(object):    conn = None    def open_spider(self, spider):        print('redis连接开始')        self.conn = redis.Redis(host='127.0.0.1', port=6379)    # 编写向数据库中存储数据的相关代码    def process_item(self, item, spider):        """        :param item: 接收到的item对象        :param spider:        :return:        """        dic = {            'author': item['author'],            'content': item['content'],        }        self.conn.lpush('data', dic)        return item    def close_spider(self, spider):        print('redis链接结束')class QiubaiByMysql(object):    """        实现将数据值存储到mysql数据库中    """    conn = None    cursor = None    # 编写向数据库中存储数据的相关代码    def open_spider(self, spider):        print('mysql链接开始')        # 链接数据库        self.conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='112233', db='qiubai')    def process_item(self, item, spider):        """        :param item: 接收到的item对象        :param spider:        :return:        """        print('数据已写入mysql')        # 1. 链接数据库        # 2. 执行sql语句        sql = f'insert into qiubai values("{item["author"]}","{item["content"]}")'        self.cursor = self.conn.cursor()        try:            self.cursor.execute(sql)            self.conn.commit()        except Exception as e:            print(e)            self.conn.rollback()        # 3. 提交事物        return item    def close_spider(self, spider):        print('mysql链接结束')        self.cursor.close()        self.conn.close()class QiubaiByFiles(object):    """    将数据值存储到本地磁盘中    """    fp = None    def open_spider(self, spider):        print('打开文件')        self.fp = open('../qiubai.txt', 'w', encoding='utf-8')    def process_item(self, item, spider):        print('数据已经写入到文件')        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()

 

配置文件的编写

BOT_NAME = 'qiubai'SPIDER_MODULES = ['qiubai.spiders']NEWSPIDER_MODULE = 'qiubai.spiders'USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'ROBOTSTXT_OBEY = False# 配置管道ITEM_PIPELINES = {    'qiubai.pipelines.QiubaiPipeline': 300,    'qiubai.pipelines.QiubaiByFiles': 400,    'qiubai.pipelines.QiubaiByMysql': 500,}

 

转载于:https://www.cnblogs.com/lshedward/p/10697116.html

你可能感兴趣的文章
又来勒索,有完没完 - 数据库安全指南
查看>>
机器学习——随机森林算法及原理
查看>>
java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]
查看>>
关于Excel导入的问题记录
查看>>
java一些基础问题(听说是java应聘者老被问的问题!)
查看>>
对Windows Server 2008上的ARP缓存进行管理的步骤
查看>>
linux shell 实用小实例
查看>>
JavaScript面向对象
查看>>
curl sh带参数运行
查看>>
CSS优化
查看>>
关于Linux积累的相关博客
查看>>
自动拆装箱【简】
查看>>
ceph-deploy源码制作rpm包 <转>
查看>>
ElasticSearch客户端注解使用介绍
查看>>
UITableView 抽取及控制器的调用整合
查看>>
Hadoop HA高可用集群模式搭建指南
查看>>
我的友情链接
查看>>
tomcat自动发布脚本
查看>>
java关键字strictfp的用途
查看>>
表格移动到指定的cell
查看>>