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 相关文章推荐
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
在Django中同时使用多个配置文件的方法
Jul 22 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
python简单区块链模拟详解
Jul 03 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
python add_argument()用法解析
Jan 29 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
详解Pymongo常用查询方法总结
Jan 29 Python
python实现学生通讯录管理系统
Feb 25 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 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摘要生成函数(无乱码)
2012/02/04 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
JS实现打字游戏
2019/12/17 Javascript
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
python__name__原理及用法详解
2019/11/02 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
拾金不昧表扬信范文
2014/01/11 职场文书
铁路工务反思材料
2014/02/07 职场文书
公共场所禁烟标语
2014/06/25 职场文书
就业协议书
2014/09/12 职场文书
企业法人任命书
2015/09/21 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
教师反邪教心得体会
2016/01/15 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书