Scrapy高并发数据库写入_scrapy process_item是并发的吗-程序员宅基地

技术标签: 数据库  

前言

爬虫过程中不可缺少的环节就是数据存储,一般来说这些数据首选是保存到数据库中。但是数据库写的方式是同步写入,能不能像 request 请求那样遇到这种 I/O 操作就去执行其他任务呢?答案是可以的。

Scrapy异步写入

Scrapy 是基于 Twisted 库实现的爬虫框架,而 Twisted 库已经为我们准备好了异步写入数据库的方法,配置也很简单,在 pipelines.py 里定义一个类,并实现这几个方法就好。

from twisted.enterprise import adbapi

import pymysql
import pymysql.cursors

# Twisted高并发的mysql插入
class MysqlTwistedPipeline(object):
    def __init__(self, dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
    	# 数据库配置
		pass

    def process_item(self, item, spider):
        # 使用Twisted将mysql插入变成异步执行
		pass

    def handle_error(self, failure, item, spider):
        # 处理异步插入的异常
		pass

    def do_insert(self, cursor, item):
        # 执行具体插入
		pass

函数解释

from_settings, 类方法, 从字面意思也不难理解,它的功能就是定义一个连接池,传入两个参数: settingscls 并返回一个连接池对象供数据库读写时调用。具体实现代码如下:

@classmethod
def from_settings(cls, settings):
    # 数据库配置
    dbparms = dict(
        host=settings["MYSQL_HOST"],  # 数据库Host
        database=settings["MYSQL_DBNAME"],	# 数据库名
        user=settings["MYSQL_USER"],	#数据库用户名
        password=settings["MYSQL_PASSWORD"],	#数据库密码
        charset='utf8', # 使用的字符集
        cursorclass=pymysql.cursors.DictCursor,	# 将游标类型设置为字典形式
        use_unicode=True # 使用unicode格式
    )
    dbpool = adbapi.ConnectionPool("pymysql", **dbparms) 
    return cls(dbpool) 返回一个

数据库配置的字段名不能随便乱起,在 pymysql.connections 有定义规则:
connections.py
clscls 主要用在类方法定义,而 self 则是实例方法。
普通的实例方法,第一个参数需要是 self ,它表示一个具体的实例本身。
如果用了 staticmethod ,那么就可以无视这个 self ,而将这个方法当成一个普通的函数使用。
而对于 classmethod ,它的第一个参数不是self,是cls,它表示这个类本身。

settings 可以理解为我们工程的 settings.py 文件对象,我们在函数传入 settings 参数,这样才可以在其他文件里调用 settings.py 里的内容,通过字典的方式可以调用参数,比如下面这四个:
settings.py中定义
这是数据库的配置,我在 settings.py 的最下方有如下定义,下面这些参数名可以自己起,方便使用即可

MYSQL_HOST = "host"
MYSQL_DBNAME = "dbname"
MYSQL_USER = "username"
MYSQL_PASSWORD = "password"

process_item, 数据库的写入就是在该函数下操作的,异步逻辑就是在它下面实现的:

def process_item(self, item, spider):
    # 使用Twisted将mysql插入变成异步执行
    query = self.dbpool.runInteraction(self.do_insert, item)  # 该方法会把我们的函数变为异步的,返回一个 query 对象,第一个就是执行函数,第
    															二个item就是我们要写入的数据
    query.addErrback(self.handle_error, item, spider)  # 异步处理出错时执行, 第一个是错误处理函数,

do_insert, 这个就是我定义的写入函数,名字随意,而且自动帮我们 commit

def do_insert(self, cursor, item):
    # 执行具体插入
    insert_sql = """
        insert into table(column1,column2,column3) values ("%s", "%s", "%s")
    """
    data = (item["字段一"], item["字段二"], item["字段三"])
    cursor.execute(insert_sql % data)

handle_error, 异常处理,名字随意,4个参数,第一个是对象本身,第二个就是具体failure,第三个是item,第四个是当前spider,后面两个参数可以忽略,那上方 query.addErrback(self.handle_error) 就可以这样了

 def handle_error(self, failure, item, spider):
     # 处理异步插入的异常
     print(failure)

最后我们把这个类在 settings.py 中声明,我的工程名是 douban

ITEM_PIPELINES = {
   'douban.pipelines.MysqlTwistedPipeline': 1,
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35068933/article/details/89765543

智能推荐

VBS基本语法_vbs脚本语法-程序员宅基地

文章浏览阅读830次,点赞2次,收藏16次。 一、初识VBSVbs 是一种变量无关、解释性执行的脚本语言。vbs语言中不区分大小写。语句以换行结束。dim 声明变量;批量名称声明,多个变量之间用逗号分隔:set &..._vbs脚本语法

Vuex笔记(三)--- actions和mutations交互时候,传递的是一个包含数据的对象-程序员宅基地

文章浏览阅读565次。actions和mutations交互时候,传递的是一个包含数据的对象。这个对象包含不同数据。eg.state.js: 保存数据const state = { foods: [], shops: []}export default state问题就是mutations.js里面:1.第二个参数foods是用{}包住,foods传递的是一个包含数据的对象。2.第二个...

pytorch中的batch_norm, instance_norm, layer_norm, group_norm_f.batch_norm-程序员宅基地

文章浏览阅读1.3k次。1 BatchNorm1.1 实现Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shifthttp://d2l.ai/chapter_convolutional-modern/batch-norm.html?highlight=batchnorm2d import torch import torch.nn.functi..._f.batch_norm

vue3+ts+element-plus el-table组件二次封装(2024-03-20 TTable组件新增新增第一列既显示(复选、单选)和序列号)_vue3+ts+element plus封装表格-程序员宅基地

文章浏览阅读6.6k次,点赞2次,收藏20次。vue3+ts+element-plus el-table组件二次封装(新增动态设置列的显示与隐藏并且可以随意拖地排序功能、改用vitepress编辑组件文档;新增了单元格编辑功能))新增了单元格编辑键盘事件及第三方组件事件功能;2023-06-08 TTable组件新增整行拖拽排序功能;TTable组件修复表头合并插槽使用失效;TTable组件单元格编辑新增表单校验功能/表格内操作按钮权限配置)新增展开行功能;2024-03-20 TTable组件新增新增第一列既显示(复选、单选)和序列号_vue3+ts+element plus封装表格

如何系统的学习Java达到工作要求?_java自学怎样才能达到企业要求-程序员宅基地

文章浏览阅读270次。1.制定好一下系统的学习规划,每天定量,学完什么知识点就掌握,能自己应用,而不是能看懂,写不出来东西。因为现在有很多人都是这样,表面上我是学会了,但是以上手去写但是怎么也写不出来。2.不要自己一个人闷头学,找一套质量不错的视频教程跟着去学习,听课的过程当中一定要把笔记记录下来。笔记当中只记忆重点的结论。把不懂的地方记下来,有时间就去解决。要学会在学习中记好笔记,一定要记得去复习。3.机会都是留给有准备的人,坚持每天学习也考验你的耐性和毅力,中途如果没有什么事情千万不能松懈,一天都不可以,保持一周6天的学_java自学怎样才能达到企业要求

JS中的async/await的用法和理解_js await-程序员宅基地

文章浏览阅读2.2w次。1、首先需要理解async 和 await的基本含义 async 是一个修饰符,async 定义的函数会默认的返回一个Promise对象resolve的值,因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数// 0. async基础用法测试async function fun0() { console.log(1) return 1}fun0().then( x => { console.log(x) }) // 输出结果 1,.._js await

随便推点

STM32F10X新建工程步骤_菲斯塔固件-程序员宅基地

文章浏览阅读473次,点赞2次,收藏5次。STM32创建新工程第一步下载固件包第二步创建工程第三步完成配置,修改main文件为空执行编译第一步下载固件包网址如下:1、Openedv:http://openedv.com/posts/list/6054.htm2、ST官网:https://www.stmcu.com.cn/Designresource/list/STM32F1/firmware_software/firmware_software固件库介绍:Libraries:CMSIS、STM32F10x_StdPeriph_Driv_菲斯塔固件

Ubuntu虚拟机连接开发板网络设置_ubuntu18 虚拟机连接开发板-程序员宅基地

文章浏览阅读1.4k次。1.VMware必须设置成桥接模式,且要在“编辑-》虚拟网络编辑器”里指定桥接到HOST主机的物理网卡 2.Ubuntu虚拟机、HOST主机和目标开发板的IP必须在同一个网段 3.将网线连接开发板并上电,否则Ubuntu虚拟机的ifconfig不会显示已配置的网络设置..._ubuntu18 虚拟机连接开发板

html5开发之ios屏幕适配,iOS开发屏幕尺寸以及屏幕适配等问题(转载内容)-程序员宅基地

文章浏览阅读377次。原帖地址:http://blog.csdn.net/phunxm/article/details/42174937/仅供我个人收藏学习,原博主如不同意请联系qq651263878进行删除,在此表示感谢以及歉意。1.iPhone尺寸规格后续上市的iPhone7以及iPhone7plus 与六代相同1 inch = 2.54cm = 25.4mm上表中的宽高(width/height)为手机的物理尺..._ios html注入屏幕尺寸适配

计算机制作贺卡教案,教案与学生成果:制作电子贺卡-程序员宅基地

文章浏览阅读719次。教案与学生成果:制作电子贺卡狮山镇松岗中心小学 朱蔼玲【教学目的与要求】(1)、通过利用计算机制作贺卡,让学生理解、掌握并熟练运用word这一章的各知识点。(2)通过练习掌握word提供的强大的编辑功能,并能进行综合运用,完成贺卡的制作。(3)进一步熟练掌握用绘图工具绘制图形、文本框及自选图形的制作与修饰、艺术字的插入等操作。(4)通过制作电子贺卡,培养学生动手实践和主动探究的兴趣。为学生创造现代..._计算机作业电子贺卡

html-1 圆角边框的常用写法_html圆角矩形边框-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏15次。<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <tit_html圆角矩形边框

mysql 有链接不上去_求助:MySQL 出现间歇性链接不上~~-程序员宅基地

文章浏览阅读568次。程序平时运行正常,每天总能出现几次,数据库链接不上异常,ORM 使用的是 iBatis ,那位兄弟遇到过呀?未经处理的异常: IBatisNet.DataMapper.Exceptions.DataMapperException: Unable to open connection to "ADO.Net driver for MySQL". ---> System.Security.Au..._为验证提供的消息或签名已被更改

推荐文章

热门文章

相关标签