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

yizhihongxing

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日

相关文章

  • java编程实现根据EXCEL列名求其索引的方法

    Java编程实现根据Excel列名求其索引的方法 在编写Java程序时,有时需要根据Excel表格中列名查询到其所在列的索引。本文将介绍一种实现该功能的方法。 思路 我们知道,Excel的列名是由字母组成的,从A开始到ZZ(第702列)结束,其中每一列的名称都是唯一的。因此,如果我们能将Excel的列名转换为索引数字,就能够快速地定位到需要操作的列。 具体来…

    database 2023年5月22日
    00
  • 使用BAT批处理执行sql语句的代码

    使用BAT批处理执行SQL语句的过程可以分为以下几个步骤: 安装MySQL命令行工具批处理文件需要用到MySQL命令行工具,所以需要先安装MySQL数据库并配置好环境变量。 编写SQL语句在执行SQL语句之前,需要先编写好需要执行的SQL语句,并将其保存到文本文件中。 编写批处理脚本使用文本编辑器编写批处理脚本文件,例如“run_sql.bat”,可以参考以…

    database 2023年5月21日
    00
  • 如何在Python中插入数据到Oracle数据库?

    在Python中,我们可以使用cx_Oracle模块连接Oracle数据库,并使用SQL语句执行插入操作。以下是如何在Python中插入数据到Oracle数据库的完整使用攻略,包括连接数据库、执行插入语句、提交事务等步骤。同时,提供两个示例以便更好理解如何在Python中插入数据到Oracle数据库。 步骤1:安装cx_Oracle模块 在Python中,我…

    python 2023年5月12日
    00
  • redis 内部数据结构 ziplist

    这是《redis 七种内部数据结构》:https://www.cnblogs.com/christmad/p/11364372.html 的第四篇   通过这篇笔记你将了解到:   (1)ziplist 是 redis 中用来压缩数据的结构,ziplist 定义了在小字节宽度(1-4字节)的编码,值越小的数据就用越小的编码宽度来存储。   (2)压缩编码的魔…

    Redis 2023年4月13日
    00
  • LINUX下Oracle数据导入导出的方法详解

    LINUX下Oracle数据导入导出的方法详解 本文将介绍在LINUX系统下如何进行Oracle数据库的数据导入和导出,以及一些常用的导入导出命令。 数据库导出 在LINUX系统下,在使用Oracle数据库进行数据导出时,可以使用expdp命令进行导出。该命令的语法如下: expdp system/password@ORACLE_SID SCHEMAS=SC…

    database 2023年5月22日
    00
  • 配置ogg异构mysql-oracle 单向同步

    从mysql到oracle和oracle到mysql差不多。大致步骤如下: 环境是:192.168.0.165 (Mysql ) —> 192.168.0.164 ( Oracle )想将mysql的sure库下的ah6 同步到 oracle的 hr.ah6下 版本:操作系统:redhat5.8Oracle: 11.2.0.3Mysql: 5.5.37…

    MySQL 2023年4月12日
    00
  • 五分钟让你快速弄懂MySQL索引下推

    MySQL索引下推是MySQL优化器的一种技术,利用索引的属性和查询条件构造一个更加高效的执行计划,以减少查询的IO消耗和提升查询性能。下面,我将为大家详细讲解五分钟让你快速弄懂MySQL索引下推的完整攻略。 索引下推的原理 MySQL的优化器会将查询条件中涉及到的索引字段通过索引进行筛选,然后再使用其他的查询条件对记录进行过滤,这种方式就被称为“先过滤后索…

    database 2023年5月22日
    00
  • MySql 5.7.20安装及data和my.ini文件的配置

    MySQL是一种重要的数据库,下面就MySQL 5.7.20的安装及data和my.ini文件的配置进行详细讲解。 下载安装MySQL 5.7.20 MySQL官网下载链接:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载适合自己操作系统版本的MySQL安装包,接着进行安装。 配置data…

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