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中defaultdict与dict的差异详情

    Python中defaultdict与dict的差异详情

    这篇文章主要介绍了Python中defaultdict与dict的差异,在collections模块中的defauldict使用时与dict有何不同,为何我们用dict中的key值不存在时会报错,而defaudict不会报错,下面文章做出解答,需要的朋友可以参考一下
    2021-11-11
  • 详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法

    详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法

    这篇文章主要介绍了详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Tkinter组件Entry的具体使用

    Tkinter组件Entry的具体使用

    本文主要介绍了Tkinter组件Entry的具体使用,Entry组件通常用于获取用户的输入文本,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Python用GET方法上传文件

    Python用GET方法上传文件

    本文给大家介绍的是在Python中使用GET方法实现上传文件的方法,起因是有网友说Get方法不能用来上传文件,于是就做了这个例子,这里分享给大家,有需要的小伙伴参考下吧。
    2015-03-03
  • Python MySQL如何通过Binlog获取变更记录恢复数据

    Python MySQL如何通过Binlog获取变更记录恢复数据

    本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录,并展示了一个简单的Python脚本,该脚本读取Binlog事件并打印出插入、更新和删除操作的SQL语句,此外,还提到可以使用pandas将结果输出到Excel表格中进行数据分析处理
    2025-01-01
  • 对pytorch中x = x.view(x.size(0), -1) 的理解说明

    对pytorch中x = x.view(x.size(0), -1) 的理解说明

    这篇文章主要介绍了对pytorch中x = x.view(x.size(0), -1) 的理解说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • PIL包中Image模块的convert()函数的具体使用

    PIL包中Image模块的convert()函数的具体使用

    这篇文章主要介绍了PIL包中Image模块的convert()函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • wxPython实现绘图小例子

    wxPython实现绘图小例子

    这篇文章主要为大家详细介绍了wxPython实现绘图小例子,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Python获取Redis所有Key以及内容的方法

    Python获取Redis所有Key以及内容的方法

    今天小编就为大家分享一篇Python获取Redis所有Key以及内容的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • 详解Python中数据类型的转换

    详解Python中数据类型的转换

    这篇文章主要为大家详细介绍了Python中数据类型转换的相关资料,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-03-03

最新评论