scrapy数据存储在mysql数据库的两种方式(同步和异步)

Scrapy是一个用于爬取网页并提取数据的Python框架。在爬取数据后,我们需要把数据保存到数据库中进行后续处理,使其更方便的进行分析和应用。Scrapy支持将数据存储到多种不同类型的数据库中,其中包括MySQL。在MySQL数据库中,Scrapy数据存储的主要方式是同步和异步。

  1. 同步方式

同步方式是指将数据存储到MySQL数据库时,采用常规的同步方式,遵循线性执行的方式,即一条SQL语句执行完后再执行下一条。在Scrapy中,同步方式的存储使用的是MySQLdb库和pymysql库。具体步骤如下:

  • 下载MySQLdb库或pymysql库:
pip install MySQL-python
或
pip install PyMySQL
  • 配置数据库信息

在Scrapy配置文件中配置数据库信息。比如在settings.py中,配置MySQL数据库信息和相关的处理程序:

MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'scrapy_db'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'

ITEM_PIPELINES = {
    'myproject.pipelines.SyncMySQLPipeline': 300,
}
  • 定义Pipeline

在Scrapy项目中,定义数据存储Pipeline。在Pipeline中,定义process_item函数,连接到数据库并执行SQL语句。

import MySQLdb

class SyncMySQLPipeline(object):
    def __init__(self):
        self.db = MySQLdb.connect(
            host=settings['MYSQL_HOST'],
            db=settings['MYSQL_DBNAME'],
            user=settings['MYSQL_USER'],
            passwd=settings['MYSQL_PASSWORD'],
            charset='utf8',
            use_unicode=True
        )
        self.cursor = self.db.cursor()

    def process_item(self, item, spider):
        sql = "insert into table_name(col1, col2, col3) values('%s', '%s', '%s')"%(item['col1'], item['col2'], item['col3'])
        self.cursor.execute(sql)
        self.db.commit()
        return item
  • 执行Scrapy爬虫

在命令行中执行Scrapy爬虫:

scrapy crawl spider_name
  1. 异步方式

异步方式是指将数据存储到MySQL数据库时,采用异步方式,不遵循线性执行的方式。在Scrapy中,异步方式的存储使用的是Twisted库。具体步骤如下:

  • 下载Twisted库:
pip install Twisted
  • 配置数据库信息

在Scrapy配置文件中配置数据库信息。比如在settings.py中,配置MySQL数据库信息和相关的处理程序:

MYSQL_HOST = 'localhost'
MYSQL_DBNAME = 'scrapy_db'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'

ITEM_PIPELINES = {
    'myproject.pipelines.AsyncMySQLPipeline': 300,
}
  • 定义Pipeline

在Scrapy项目中,定义数据存储Pipeline。在Pipeline中,定义__init__函数和process_item函数,连接到数据库。

from twisted.enterprise import adbapi
import MySQLdb

class AsyncMySQLPipeline(object):
    def __init__(self):
        self.dbpool = adbapi.ConnectionPool(
            'MySQLdb',
            host=settings['MYSQL_HOST'],
            db=settings['MYSQL_DBNAME'],
            user=settings['MYSQL_USER'],
            passwd=settings['MYSQL_PASSWORD'],
            charset='utf8',
            use_unicode=True
        )

    def process_item(self, item, spider):
        query = self.dbpool.runInteraction(self._insert, item)
        query.addErrback(self._handle_error)
        return item

    def _insert(self, tx, item):
        sql = "insert into table_name(col1, col2, col3) values('%s', '%s', '%s')"%(item['col1'], item['col2'], item['col3'])
        tx.execute(sql)

    def _handle_error(self, failure):
        print(failure)
  • 执行Scrapy爬虫

在命令行中执行Scrapy爬虫:

scrapy crawl spider_name

示例说明:

假设我们要爬取豆瓣电影Top 250的电影信息,并将其存储到MySQL数据库中。这里以同步方式为例。

  1. 先根据需要定义Item:
import scrapy

class DoubanMovieItem(scrapy.Item):
    movie_name = scrapy.Field()
    movie_score = scrapy.Field()
    movie_director = scrapy.Field()
  1. 编写Spider
class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        item = DoubanMovieItem()
        movies = response.xpath('//ol[@class="grid_view"]/li')
        for movie in movies:
            item['movie_name'] = movie.xpath('.//span[@class="title"]/text()').extract_first()
            item['movie_score'] = movie.xpath('.//span[@class="rating_num"]/text()').extract_first()
            item['movie_director'] = movie.xpath('.//p[@class=""]/text()[1]')
            yield item
  1. 定义Pipeline
import MySQLdb

class SyncMySQLPipeline(object):
    def __init__(self):
        self.db = MySQLdb.connect(
            host=settings['MYSQL_HOST'],
            db=settings['MYSQL_DBNAME'],
            user=settings['MYSQL_USER'],
            passwd=settings['MYSQL_PASSWORD'],
            charset='utf8',
            use_unicode=True
        )
        self.cursor = self.db.cursor()

    def process_item(self, item, spider):
        sql = "insert into douban_movie(movie_name, movie_score, movie_director) values('%s', '%s', '%s')"%(item['movie_name'], item['movie_score'], item['movie_director'])
        self.cursor.execute(sql)
        self.db.commit()
        return item
  1. 执行Scrapy爬虫

在命令行中执行Scrapy爬虫:

scrapy crawl douban

这样即可将豆瓣电影Top 250的电影信息存储到MySQL数据库中。

另外,对于异步方式的存储,只需要将Pipeline中的AsyncMySQLPipeline类替换为前面的SyncMySQLPipeline类,不需要修改其他任何代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:scrapy数据存储在mysql数据库的两种方式(同步和异步) - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 对MySQL子查询的简单改写优化

    关于对MySQL子查询的简单改写优化,一般可以采用以下两种方式: 1. 使用连接(JOIN)代替子查询 子查询执行时,会把每个子查询结果保存在临时表中,然后再执行主查询,这就会增加查询语句的运行时间。而连接(JOIN)是更有效的方式,因为它只需要执行一次查询。 以下是一个使用连接代替子查询的示例: SELECT c.customerName, o.order…

    database 2023年5月19日
    00
  • Python操作ES的方式及与Mysql数据同步过程示例

    下面是详细讲解Python操作ES的方式及与Mysql数据同步过程的完整攻略。 Python操作ES的方式 安装elasticsearch-py库 使用pip安装elasticsearch-py库: pip install elasticsearch 连接Elasticsearch 连接Elasticsearch的方式: from elasticsearch…

    database 2023年5月22日
    00
  • Zabbix安装图文教程(需要LAMP或者LNMP运行环境)

    Zabbix安装图文教程(需要LAMP或者LNMP运行环境) 介绍 Zabbix是一个开源的网络监控系统,可以监控服务器、网络设备、应用程序、数据库等,支持邮件、短信、微信、电话等方式的告警通知。本文提供基于LAMP或LNMP环境的Zabbix安装攻略。 环境要求 操作系统:CentOS、Debian、Ubuntu等Linux发行版。 LAMP或LNMP环境…

    database 2023年5月22日
    00
  • oracle 指定类型和指定位数创建序列号的代码详解

    下面是关于“oracle 指定类型和指定位数创建序列号的代码详解”的完整攻略。 1. 什么是 Oracle 序列号 在 Oracle 数据库中,序列号(Sequence)是一种对象,其生成的序列数字可以被用于创建唯一的主键值和其他编号,以保证数据表中的记录唯一性。 2. 创建一个无限序列号 如果您想要创建一个无限序列号,步骤如下: CREATE SEQUEN…

    database 2023年5月21日
    00
  • SQL中where语句的用法及实例代码(条件查询)

    当我们需要从数据库中获取一些指定的数据时,一般会使用 SQL 的条件查询语句 WHERE。WHERE 语句可以根据条件来筛选出需要的数据行。本文将向您具体介绍 WHERE 的用法及实例代码。 WHERE 语句的格式 WHERE 语句的一般格式如下: SELECT column1, column2, … FROM table_name WHERE cond…

    database 2023年5月21日
    00
  • Linux管理员手册(4)–内存管理

    Linux管理员手册(4)–内存管理 简介 内存管理是Linux系统管理中的一个重要方面。本文将介绍Linux内存管理的各个方面,包括物理内存、虚拟内存、交换空间管理等重要内容。同时,本文还将涉及一些常见的Linux内存管理工具和技巧。 物理内存管理 Linux中的内存管理遵循一种称为“分页”的技术。具体来说,物理内存被分成固定大小的块,称为“页框”。每个…

    database 2023年5月22日
    00
  • 解决mysql数据库设置远程连接权限执行grant all privileges on *.* to ‘root’@’%’ identified by ‘密码’ with grant optio报错

    这个问题可能是由于MySQL数据库服务器没有设置允许来自远程主机的连接,或者没有正确设置用户名和密码所致。为了解决这个问题,我们可以采取以下步骤: 修改MySQL数据库配置文件 首先需要修改MySQL数据库的配置文件 my.cnf,打开终端并输入以下命令查看文件是否存在: $ sudo ls -ahl /etc/mysql/my.cnf 如果文件不存在,可以…

    database 2023年5月18日
    00
  • 讲解Oracle数据库中的数据字典及相关SQL查询用法

    讲解Oracle数据库中的数据字典及相关SQL查询用法需要分几个方面来讲: 一、数据字典简介 在Oracle数据库中,数据字典是一个数据储存区,它记录了关于数据库逻辑和物理方面的重要信息,如表名、列名、数据类型、索引、用户信息等等。它是一组包含系统元数据和描述数据库特定信息的表和视图的总称。这些元数据是由Oracle存储在系统表、数据字典视图、表表存储过程以…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部