from twisted.enterprise import adbapi
class MySQLAsyncPipeline:
def open_spider(self, spider):
db = spider.settings.get('MYSQL_DB_NAME', 'scrapy_default')
host = spider.settings.get('MYSQL_HOST', 'localhost')
port = spider.settings.get('MYSQL_PORT', 3306)
user = spider.settings.get('MYSQL_USER', 'root')
passwd = spider.settings.get('MYSQL_PASSWORD', 'root') self.dbpool = adbapi.ConnectionPool('MySQLdb', host=host, db=db,
user=user, passwd=passwd, port=port, charset='utf8') def close_spider(self, spider):
self.dbpool.close() def process_item(self, item, spider):
self.dbpool.runInteraction(self.insert_db, item) return item def insert_db(self, tx, item):
values = (
item['f1'],
item['f2'],
) sql = 'INSERT INTO books VALUES (%s,%s)'
tx.execute(sql, values)

#redis入库

import redis
from scrapy import Item class RedisPipeline:
def open_spider(self, spider):
db_host = spider.settings.get('REDIS_HOST', 'localhost')
db_port = spider.settings.get('REDIS_PORT', 6379)
db_index = spider.settings.get('REDIS_DB_INDEX', 0) self.db_conn = redis.StrictRedis(host=db_host, port=db_port, db=db_index)
self.item_i = 0 def close_spider(self, spider):
self.db_conn.connection_pool.disconnect() def process_item(self, item, spider):
self.insert_db(item)
return item def insert_db(self, item):
if isinstance(item, Item):
item = dict(item) self.item_i += 1
self.db_conn.hmset('book:%s' % self.item_i, item)

  

scrapy Pipeline使用twisted异步实现mysql数据插入的更多相关文章

  1. Scrapy基础(十二)————异步导出Item数据到Mysql中

    异步导出数据到Mysql中 上次说过从Item中同步写入数据库,因为网络的下载速度和数据库的I/O速度是不一样的所以有可能会发生下载快,但是写入数据库速度慢,造成线程的堵塞:关于堵塞和非堵塞,同步和异 ...

  2. mysql数据插入前判断是否存在

    今天在对一些抓取到的数据做插入的时候,因为使用了定时器,每间隔几分钟会抓取一次,导致很多数据插入的是重复数据,为了解决这个问题, 一般是在插入之前先通过一个标识去查询表数据看是否已经有了,没有再执行插 ...

  3. MYSQL数据插入、更新及删除

    上文讲到创建数据表,本文介绍create table后的数据插入: 一.通过insert into ...values...插入 insert into tablename (column1,colu ...

  4. mysql 数据插入优化方法(concurrent_insert=2)

    当一个线程对一个表执行一个DELAYED语句时,如果不存在这样的处理程序,一个处理器线程被创建以处理对于该表的所有DELAYED语句.通常来说,在MyISAM里读写操作是串行的,但当对同一个表进行查询 ...

  5. mysql 数据插入时的问题

    问题:在实现json串插入到数据库的时候发现中文utf-8传入的.但到数据中的时候反斜杠\就不见了,导致后面显示的时候也不能正常显示. 解决方法:comment=comment.replace(&qu ...

  6. MYSQL数据插入和更新的语法

    tag:原文章地址 经常会遇到一行数据在特定条件下如果存在就更新列,不存在就插入新的行,用replace和duplicate语法都可以实现,但是也是有区别的.如果是数据覆盖就用replace,如果只是 ...

  7. mysql 数据插入insert

    mysql> select * from user; +------+----------+-----------+ | id | name | address | +------+------ ...

  8. pymysql 使用twisted异步插入数据库:基于crawlspider爬取内容保存到本地mysql数据库

    本文的前提是实现了整站内容的抓取,然后把抓取的内容保存到数据库. 可以参考另一篇已经实现整站抓取的文章:Scrapy 使用CrawlSpider整站抓取文章内容实现 本文也是基于这篇文章代码基础上实现 ...

  9. Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步

    [TOC] 1, 环境 CentOS, MySQL, Redis, Nodejs 2, Redis简介 Redis是一个开源的K-V内存数据库,它的key可以是string/set/hash/list ...

随机推荐

  1. HNUSTOJ 1444:树的最长路径

    1444: 树的最长路径 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 7 [提交][状态][讨论版] 题目描述 定义:无向树中结点的路径为该结点所能到达的最远距离:无向 ...

  2. stdcall 函数调用过程(以delphi为例),还有负数的补码

    以delphi下调用stdcall 函数为例,从右往左压栈:procedure TForm1.Button2Click(Sender: TObject);var i:integer;begin i:= ...

  3. 攻防世界--IgniteMe

    测试文件:https://adworld.xctf.org.cn/media/task/attachments/fac4d1290e604fdfacbbe06fd1a5ca39.exe 1.准备 获取 ...

  4. k3 cloud付款单提示余额不足,科目余额表中余额为正,银行存款流水账中未负数

    对比科目余额表中的科目明细账和银行存款流水账,发现科目余额表不全,这说明有部分凭证没做,付款的时候验证的主要以银行流水账为主(主要来自现金流量表),这时候需要调整出纳部分和总账部分

  5. nice - 改变执行程序的优先级

    总览 (SYNOPSIS) nice [OPTION]... [COMMAND [ARG]...] 描述 (DESCRIPTION) 以 调整过的 调度优先级 运行 COMMAND. 如果 没给出 C ...

  6. pypi源

    清华大学pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple豆瓣pip install requests -i https: ...

  7. centos7安装mxnet

    pip install mxnet-cu90 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 安装sklearn时总报错 ...

  8. 039:模版结构优化之include标签详解

    引入模版: 有时候一些代码是在许多模版中都用到的.如果我们每次都重复的去拷贝代码那肯定不符合项目的规范.一般我们可以把这些重复性的代码抽取出来,就类似于Python中的函数一样,以后想要使用这些代码的 ...

  9. 【leetcode】1103. Distribute Candies to People

    题目如下: We distribute some number of candies, to a row of n = num_people people in the following way: ...

  10. 利用Django框架实现分页 demo