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的web框架编写前端模版的教程
Apr 30 Python
python实现合并两个数组的方法
May 16 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
python实现搜索文本文件内容脚本
Jun 22 Python
Python爬虫的两套解析方法和四种爬虫实现过程
Jul 20 Python
python re库的正则表达式入门学习教程
Mar 08 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
Python测试线程应用程序过程解析
Dec 31 Python
利用Python将多张图片合成视频的实现
Nov 23 Python
浅谈pytorch中的dropout的概率p
May 27 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 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编程最快明白》第三讲:php数组
2010/11/01 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
Thinkphp中的volist标签用法简介
2014/06/18 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
smarty中常用方法实例总结
2015/08/07 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
Prototype 工具函数 学习
2009/07/23 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
js转html实体的方法
2016/09/27 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
详解JS预解析原理
2020/06/16 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
跟老齐学Python之复习if语句
2014/10/02 Python
Python MySQLdb Linux下安装笔记
2015/05/09 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
越南综合购物网站:Lazada越南
2019/06/10 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
乌克兰排名第一的在线旅游超市:Farvater.Travel
2020/01/02 全球购物
开办大学饮食联盟创业计划书
2014/01/29 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
2014年话务员工作总结
2014/11/19 职场文书
2014年内勤工作总结
2014/11/24 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书