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


Posted in Python onFebruary 18, 2020

方法一:同步操作

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.配置文件中

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

方式二 异步储存

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操作json数据的一个简单例子
Apr 17 Python
Web服务器框架 Tornado简介
Jul 16 Python
python中nan与inf转为特定数字方法示例
May 11 Python
详解Python进程间通信之命名管道
Aug 28 Python
python字典操作实例详解
Nov 16 Python
python3处理含有中文的url方法
May 10 Python
python实现多进程代码示例
Oct 31 Python
python防止随意修改类属性的实现方法
Aug 21 Python
PyQt+socket实现远程操作服务器的方法示例
Aug 22 Python
基于YUV 数据格式详解及python实现方式
Dec 09 Python
python实现三次密码验证的示例
Apr 29 Python
Python - 10行代码集2000张美女图
May 23 Python
通过python连接Linux命令行代码实例
Feb 18 #Python
Python日志syslog使用原理详解
Feb 18 #Python
Pytorch中.new()的作用详解
Feb 18 #Python
Pytorch maxpool的ceil_mode用法
Feb 18 #Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 #Python
Python3的socket使用方法详解
Feb 18 #Python
Python批量启动多线程代码实例
Feb 18 #Python
You might like
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
PHPCMS的使用小结
2010/09/20 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
基于jQuery的星级评分插件
2011/08/12 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
JavaScript经典案例之简易计算器
2020/08/24 Javascript
python list中append()与extend()用法分享
2013/03/24 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
详解python中index()、find()方法
2019/08/29 Python
python 实现简易的记事本
2020/11/30 Python
硕士研究生自我鉴定范文
2013/12/27 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
2014年工人工作总结
2014/11/25 职场文书
勤俭节约主题班会
2015/08/13 职场文书
党组织结对共建协议书
2016/03/23 职场文书
python实现简单聊天功能
2021/07/07 Python
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技