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

 更新时间:2020年02月18日 11:03:02   作者:侠客云  
这篇文章主要介绍了scrapy数据存储在mysql数据库的两种方式(同步和异步),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

方法一:同步操作

1.pipelines.py文件(处理数据的python文件)

import pymysql
 
class LvyouPipeline(object):
  def __init__(self):
    # connection database
    self.connect = pymysql.connect(host='XXX', user='root', passwd='XXX', db='scrapy_test') # 后面三个依次是数据库连接名、数据库密码、数据库名称
    # get cursor
    self.cursor = self.connect.cursor()
    print("连接数据库成功")
 
  def process_item(self, item, spider):
    # sql语句
    insert_sql = """
    insert into lvyou(name1, address, grade, score, price) VALUES (%s,%s,%s,%s,%s)
    """
    # 执行插入数据到数据库操作
    self.cursor.execute(insert_sql, (item['Name'], item['Address'], item['Grade'], item['Score'],
                     item['Price']))
    # 提交,不进行提交无法保存到数据库
    self.connect.commit()
 
  def close_spider(self, spider):
    # 关闭游标和连接
    self.cursor.close()
    self.connect.close()

2.配置文件中

方式二 异步储存

pipelines.py文件:

通过twisted实现数据库异步插入,twisted模块提供了 twisted.enterprise.adbapi

  1. 导入adbapi

  2. 生成数据库连接池

  3. 执行数据数据库插入操作

  4. 打印错误信息,并排错 

import pymysql
from twisted.enterprise import adbapi
# 异步更新操作
class LvyouPipeline(object):
  def __init__(self, dbpool):
    self.dbpool = dbpool
 
  @classmethod
  def from_settings(cls, settings): # 函数名固定,会被scrapy调用,直接可用settings的值
    """
    数据库建立连接
    :param settings: 配置参数
    :return: 实例化参数
    """
    adbparams = dict(
      host=settings['MYSQL_HOST'],
      db=settings['MYSQL_DBNAME'],
      user=settings['MYSQL_USER'],
      password=settings['MYSQL_PASSWORD'],
      cursorclass=pymysql.cursors.DictCursor  # 指定cursor类型
    )
 
    # 连接数据池ConnectionPool,使用pymysql或者Mysqldb连接
    dbpool = adbapi.ConnectionPool('pymysql', **adbparams)
    # 返回实例化参数
    return cls(dbpool)
 
  def process_item(self, item, spider):
    """
    使用twisted将MySQL插入变成异步执行。通过连接池执行具体的sql操作,返回一个对象
    """
    query = self.dbpool.runInteraction(self.do_insert, item) # 指定操作方法和操作数据
    # 添加异常处理
    query.addCallback(self.handle_error) # 处理异常
 
  def do_insert(self, cursor, item):
    # 对数据库进行插入操作,并不需要commit,twisted会自动commit
    insert_sql = """
    insert into lvyou(name1, address, grade, score, price) VALUES (%s,%s,%s,%s,%s)
    """
    self.cursor.execute(insert_sql, (item['Name'], item['Address'], item['Grade'], item['Score'],
                         item['Price']))
 
  def handle_error(self, failure):
    if failure:
      # 打印错误信息
      print(failure)

注意:

1、python 3.x 不再支持MySQLdb,它在py3的替代品是: import pymysql。

2、报错pymysql.err.ProgrammingError: (1064, ……

原因:当item['quotes']里面含有引号时,可能会报上述错误

解决办法:使用pymysql.escape_string()方法

例如:

sql = """INSERT INTO video_info(video_id, title) VALUES("%s","%s")""" % (video_info["id"],pymysql.escape_string(video_info["title"]))

3、存在中文的时候,连接需要添加charset='utf8',否则中文显示乱码。

4、每执行一次爬虫,就会将数据追加到数据库中,如果多次的测试爬虫,就会导致相同的数据不断累积,怎么实现增量爬取?

  • scrapy-deltafetch
  • scrapy-crawl-once(与1不同的是存储的数据库不同)
  • scrapy-redis
  • scrapy-redis-bloomfilter(3的增强版,存储更多的url,查询更快)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python动态规划实现虚拟机部署的算法思想

    Python动态规划实现虚拟机部署的算法思想

    这篇文章主要介绍了Python动态规划实现虚拟机部署的算法思想,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • python 读取.csv文件数据到数组(矩阵)的实例讲解

    python 读取.csv文件数据到数组(矩阵)的实例讲解

    今天小编就为大家分享一篇python 读取.csv文件数据到数组(矩阵)的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python获取、格式化当前时间日期的方法

    Python获取、格式化当前时间日期的方法

    在本篇文章里小编给大家整理的是关于Python获取、格式化当前时间日期的方法,对此有需要的朋友们可以学习参考下。
    2020-02-02
  • python实现从尾到头打印单链表操作示例

    python实现从尾到头打印单链表操作示例

    这篇文章主要介绍了python实现从尾到头打印单链表操作,结合实例形式分析了Python单链表的定义、判断、添加、打印等相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • python cx_Oracle的基础使用方法(连接和增删改查)

    python cx_Oracle的基础使用方法(连接和增删改查)

    这篇文章主要给大家介绍了关于python cx_Oracle的基础使用方法,其中包括连接、增删改查等基本操作,并给大家分享了python 连接Oracle 乱码问题的解决方法,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • Mac在python3环境下安装virtualwrapper遇到的问题及解决方法

    Mac在python3环境下安装virtualwrapper遇到的问题及解决方法

    这篇文章主要介绍了Mac在python3环境下安装virtualwrapper遇到的问题及解决方法,我在使用mac安装virtualwrapper的时候遇到了问题,搞了好长时间,,在这里总结一下分享出来,供遇到相同的问题的朋友使用,少走些弯路,需要的朋友可以参考下
    2019-07-07
  • django使用图片延时加载引起后台404错误

    django使用图片延时加载引起后台404错误

    本文给大家介绍的是作者在Django中使用图片的延时加载技术后引起后台404错误的问题以及解决思路和方法,有需要的小伙伴可以参考下
    2017-04-04
  • Pytorch 多块GPU的使用详解

    Pytorch 多块GPU的使用详解

    今天小编就为大家分享一篇Pytorch 多块GPU的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python实现按学生年龄排序的实际问题详解

    Python实现按学生年龄排序的实际问题详解

    这篇文章主要给大家介绍了关于Python实现按学生年龄排序实际问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • 浅谈python3 构造函数和析构函数

    浅谈python3 构造函数和析构函数

    这篇文章主要介绍了浅谈python3 构造函数和析构函数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论