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 19 Python
python进行两个表格对比的方法
Jun 27 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
Dec 09 Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
Python基于stuck实现scoket文件传输
Apr 02 Python
django form和field具体方法和属性说明
Jul 09 Python
python 爬虫如何正确的使用cookie
Oct 27 Python
详解Python中string模块除去Str还剩下什么
Nov 30 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 Python
python基础入门之字典和集合
Jun 13 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+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php 表单验证实现代码
2009/03/10 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
JS查找字符串中出现次数最多的字符
2016/09/05 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
Python JSON编解码方式原理详解
2020/01/20 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
毕业自我评价范文
2013/11/17 职场文书
年终晚会主持词
2014/03/25 职场文书
新学期教师寄语
2014/04/02 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
Python日志模块logging用法
2022/06/05 Python