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日

相关文章

  • Node连接mysql数据库方法介绍

    当你想要在 Node.js 中操作 MySQL 数据库时,就需要先通过连接建立起与 MySQL 的连接。下面将为你详细介绍 Node.js 连接 MySQL 数据库的方法。 安装 MySQL 模块 在使用 Node.js 连接 MySQL 数据库时,需要使用 mysql 模块,因此需要先通过 npm 安装 mysql 模块。可以通过以下命令进行安装: npm…

    database 2023年5月21日
    00
  • .net Redis分布式锁,Dictionary,ConcurrentDictionary 介绍

    在计算机世界里,对于锁大家并不陌生,在现代所有的语言中几乎都提供了语言级别锁的实现,为什么我们的程序有时候会这么依赖锁呢?这个问题还是要从计算机的发展说起,随着计算机硬件的不断升级,多核cpu,多线程,多通道等技术把计算机的计算速度大幅度提升,原来同一时间只能执行一条cpu指令的时代已经过去。随着多条cpu指令可以并行执行的原因,原来不曾出现的资源竞争随着出…

    Redis 2023年4月11日
    00
  • MySQL Server 层四个日志详解

    MySQL Server 层的四个日志分别是二进制日志(Binary log)、错误日志(Error log)、查询日志(Query log)和慢查询日志(Slow query log)。下面我会逐一进行详细的讲解。 一、二进制日志 二进制日志是 MySQL 用来记录数据库更新操作的日志文件。它记录的是对 MySQL 数据库进行的所有写操作,包括增加或删除数…

    database 2023年5月21日
    00
  • Centos7下安装MySQL8.0.23的步骤(小白入门级别)

    下面是Centos7下安装MySQL8.0.23的步骤(小白入门级别)的完整攻略: 1. 安装MySQL8.0.23所需的依赖库 在Centos7下安装MySQL8.0.23之前,需要先安装MySQL的依赖库。 sudo yum install -y wget sudo yum install -y curl sudo yum install -y open…

    database 2023年5月22日
    00
  • 如何使用索引提高查询速度

    如何使用索引提高查询速度 索引是优化数据库性能的重要手段之一,它可以提高查询速度和数据的完整性。本文将向您展示如何使用索引优化查询。 什么是索引 索引是数据库中一种数据结构,可以根据它快速定位到表中的指定数据。数据库通过建立一个或多个索引来实现快速查询,提高数据库的查询速度。 如何使用索引 使用索引来优化查询主要包括以下几个步骤: (1)理解查询语句 要使用…

    database 2023年5月22日
    00
  • 如何使用Python查询某个列中的最大值?

    以下是如何使用Python查询某个列中的最大值的完整使用攻略。 步骤1:导入模块 在Python中,我们需要导入相应的模块来连接数据库和执行查询操作。以下是导入mysql-connector-python模块的基本语法: import mysql.connector 以下是导入psycopg2模块的基本语法: import psycopg2 步骤2:连接数据…

    python 2023年5月12日
    00
  • win2003服务器安全设置完全版(脚本之家补充)

    首先,需要说明一下,win2003服务器已经于2015年7月14日停止对公众提供的支持和更新,因此如果仍在使用该操作系统,建议及时升级至更安全的版本,以避免安全隐患。 现在进入正题,以下是“win2003服务器安全设置完全版(脚本之家补充)”攻略的完整过程: 1. 安全设置前准备 在开始进行安全设置之前,需要确保服务器满足以下条件: 开启了Windows更新…

    database 2023年5月21日
    00
  • Mysql主键相关的sql语句集锦

    MySQL数据库经常用到的一个重要概念是主键(Primary Key),主键是一种用于唯一标识表中每个记录的一列或者一组列。主键对于数据表的设计和性能都十分重要,下面是关于MySQL主键的一些SQL语句集锦的完整攻略。 什么是主键? 主键是一种能够唯一标识数据库表中每个记录的列或者列组。主键可以是表中任何一个列或者一组列,只要满足下列条件。 主键的取值必须唯…

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