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处理二进制数据的方法
Jun 03 Python
python字符串连接方法分析
Apr 12 Python
Python中强大的命令行库click入门教程
Dec 26 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
numpy.random.seed()的使用实例解析
Feb 03 Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 Python
Django框架实现分页显示内容的方法详解
May 10 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
人工神经网络算法知识点总结
Jun 11 Python
python实现计算器简易版
Dec 17 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
php at(@)符号的用法简介
2009/07/11 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
vue 组件简介
2020/07/31 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python深入学习之对象的属性
2014/08/31 Python
Python中字符串对齐方法介绍
2015/05/21 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
财务管理个人自荐书范文
2013/11/24 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
项目建议书范文
2014/05/12 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
班主任高考寄语
2015/02/26 职场文书
冰雪公主观后感
2015/06/16 职场文书
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL