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报错[Warning] TIMESTAMP with implicit DEFAULT value is deprecated和Buffered warning: Changed limits

    报错2019-04-24 12:06:46 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more detail…

    MySQL 2023年4月16日
    00
  • SQL Server中identity(自增)的用法详解

    SQL Server中identity(自增)的用法详解 在SQL Server中,自增列(identity)是一个非常常用的功能。本文将详细讲解如何在表中定义自增列,并提供一些示例以便更好地理解该功能。 定义自增列 要创建自增列,可以通过使用IDENTITY关键字在表定义中指定列属性。IDENTITY的值是从引入记录的第一个插入操作中生成,并且逐步递增。下…

    database 2023年5月21日
    00
  • MySQL权限控制实现原理

    MySQL权限控制是指对MySQL服务器上的用户和资源进行访问限制的控制机制。它由MySQL特定的权限表决定并且允许管理员为每个MySQL值创建一个或多个帐户,并且要求他们在访问MySQL数据时提供身份验证信息。本篇文章将详细介绍MySQL权限控制的实现原理。 MySQL权限表 MySQL存储权限表系统的信息,其中包括用户和他们的权限。这些信息存储在MySQ…

    MySQL 2023年3月10日
    00
  • 彻底杀掉redis挖矿程序及其守护进程wnTKYg

    今天又遇到了一件烦心的事,前几天刚解决服务器内存跑满的问题,今天又碰到了神奇而又久违的redis挖矿程序。 查询了一下挖矿,就是有人借助redis漏洞借用别人的服务器进行挖矿。 上次做电子商城项目时,开发过程中环境用的阿里云服务器,中途碰到了俄罗斯的ip成功黑了我的服务器,好在文件访问权限有限制,对方仅给我home目录加了密。后来,实在担心留有其它隐藏程序,…

    Redis 2023年4月11日
    00
  • 详解MongoDB创建数据库步骤

    MongoDB是一款基于文档存储的非关系型数据库,以下是如何创建数据库的完整攻略。 安装MongoDB 首先需要在计算机上安装MongoDB,安装方法可以查看官方文档或者从MongoDB官网下载安装程序,根据安装向导完成安装。 启动MongoDB服务 在安装完成后,需要启动MongoDB服务。在Windows系统中,可以通过运行CMD或者PowerShell…

    MongoDB 2023年3月14日
    00
  • python3+mysql学习——mysql查询语句写入csv文件中

    操作mysql:需要导入pymysql模块 参考代码: import pymysql# 打开数据库连接db = pymysql.connect(‘123.123.0.126′,’root’,’root’,’fdgfd’)# 使用cursor()方法创建一个游标对象 cursorcursor = db.cursor()# execute()方法执行sql查询c…

    MySQL 2023年4月13日
    00
  • MySQL 逻辑备份与恢复测试的相关总结

    MySQL 逻辑备份与恢复测试的相关总结攻略 概述 MySQL 逻辑备份是指将数据库中数据导出为标准的 SQL 脚本的过程,而恢复则是将导出的 SQL 脚本运行到 MySQL 服务器上,以便将数据库中的数据恢复到原始状态。MySQL 逻辑备份有利于数据的迁移、备份和还原。本文将总结关于 MySQL 逻辑备份与恢复测试的相关经验,并提供相应的攻略。 MySQL…

    database 2023年5月21日
    00
  • MySQL 数据库(一):创建数据库、创建表

    创建数据库 语法:(译:亏诶特。得特贝斯) create database 示例:创建数据库 test; create database test; 创建表 语法:(译:亏诶特。tei bou) create table 表名 (字段1 类型1,字段2 类型2,字段3 类型3) DEFAULT CHARSET=utf8; 解释: 字段名:用来标识表的一列 字…

    MySQL 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部