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的ORM框架SQLObject入门实例
Apr 28 Python
用Python的Django框架完成视频处理任务的教程
Apr 02 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
Python KMeans聚类问题分析
Feb 23 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
Python编写打字训练小程序
Sep 26 Python
python将图片转base64,实现前端显示
Jan 09 Python
Visual Studio Code搭建django项目的方法步骤
Sep 17 Python
浅析pandas随机排列与随机抽样
Jan 22 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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 mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
详解基于webpack&gettext的前端多语言方案
2019/01/29 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
python基础教程之Hello World!
2014/08/29 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
python两种注释用法的示例
2020/10/09 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
岗位职责怎么写
2014/03/14 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
新员工入职欢迎词
2015/01/23 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
幼儿园家长心得体会
2016/01/21 职场文书
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL