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 09 Python
python数据结构之链表详解
Sep 12 Python
Python配置mysql的教程(推荐)
Oct 13 Python
wxpython实现图书管理系统
Mar 12 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
django之状态保持-使用redis存储session的例子
Jul 28 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
利用PyTorch实现VGG16教程
Jun 24 Python
python线性插值解析
Jul 05 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 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 输出双引号"与单引号'的方法
2010/05/09 PHP
php数组去重的函数代码
2013/02/03 PHP
php输出xml属性的方法
2015/03/19 PHP
微信红包随机生成算法php版
2016/07/21 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
javascript parseInt与Number函数的区别
2010/01/21 Javascript
javascript 函数使用说明
2010/04/07 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
基于python编写的微博应用
2014/10/17 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
Python虚拟环境项目实例
2017/11/20 Python
Python实现Kmeans聚类算法
2020/06/10 Python
对python字典过滤条件的实例详解
2019/01/22 Python
Python配置文件处理的方法教程
2019/08/29 Python
安装python及pycharm的教程图解
2019/10/10 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
小饰品店的创业计划书范文
2013/12/28 职场文书
环保倡议书100字
2014/05/15 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS