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实现从订阅源下载图片的方法
Mar 11 Python
python+pyqt实现右下角弹出框
Oct 26 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
详解Django解决ajax跨域访问问题
Aug 24 Python
Python subprocess库的使用详解
Oct 26 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
python分布式编程实现过程解析
Nov 08 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
使用字符串函数输出整数化的PHP版本号
2006/10/09 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
Openlayers实现距离面积测量
2020/09/28 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
python实现的各种排序算法代码
2013/03/04 Python
python基础教程之lambda表达式使用方法
2014/02/12 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
酒店管理专业学生求职信
2013/09/27 职场文书
电子信息专业学生自荐信
2013/11/09 职场文书
人力资源专业推荐信
2013/11/29 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
法学毕业生自我鉴定
2014/01/31 职场文书
学习雷锋活动总结
2014/04/29 职场文书
批评与自我批评范文
2014/10/15 职场文书
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android