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 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
Python写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
python进阶教程之模块(module)介绍
Aug 30 Python
不要用强制方法杀掉python线程
Feb 26 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
selenium + python 获取table数据的示例讲解
Oct 13 Python
python顺序执行多个py文件的方法
Jun 29 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
python使用多线程+socket实现端口扫描
May 28 Python
python 写一个水果忍者游戏
Jan 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实现购物车功能(下)
2016/01/05 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
PHP中->和=>的含义及使用示例解析
2020/08/06 PHP
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
详解Python Socket网络编程
2016/01/05 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
合同纠纷调解书
2015/05/20 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL