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函数返回多个值的示例方法
Dec 04 Python
python发布模块的步骤分享
Feb 21 Python
测试、预发布后用python检测网页是否有日常链接
Jun 03 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
Python assert关键字原理及实例解析
Dec 13 Python
python绘制封闭多边形教程
Feb 18 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
Jun 11 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
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
利用Python检测URL状态
2019/07/31 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
python微信公众号开发简单流程实现
2020/03/09 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
python如何支持并发方法详解
2020/07/25 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
遥感技术与仪器求职信
2014/02/22 职场文书
产品开发计划书
2014/04/27 职场文书
慰问信格式
2015/02/14 职场文书
辛亥革命观后感
2015/06/02 职场文书