当前位置:首页 » 新媒体运营 » 正文

twisted框架,使用异步的twisted框架写入数据

10057 人参与  2022年05月28日 09:34  分类 : 新媒体运营  评论
.twisted框架介绍
  • Twisted是用Python实现的基于事件驱动的网络引擎框架;

  • Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一样,Twisted也具有“内置池”(batteries-included)的特点。Twisted对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,使得配置和部署产品级的Twisted应用变得非常方便。

    QQ截图.jpg

.MySQL数据库信息保存到settings文件中
  • 首先我们需要把MySQL数据库中的配置信息保存到settings文件中,如:MYSQL_HOST = &#;localhost&#;的形式;

MYSQL_HOST = &#;localhost&#;
MYSQL_USER = &#;xkd&#;
MYSQL_PASSWORD = &#;&#;
MYSQL_DATABASE = &#;item_database&#;
MYSQL_PORT = 
MYSQL_OPTIONAL = dict(
 USE_UNICODE = True,
 CHARSET = &#;utf&#;,
)
  • 然后从settings文件中将这些信息导入到pipeline.py文件中使用;

from .settings import MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_OPTIONAL

class MysqlPipeline:
 def __init__(self):
 self.conn = MySQLdb.connect(host=MYSQL_HOST, user=MYSQL_USER, password=MYSQL_PASSWORD, database=MYSQL_DATABASE, use_unicode=MYSQL_OPTIONAL.get(&#;USE_UNICODE&#;), charset=MYSQL_OPTIONAL.get(&#;CHARSET&#;))
 self.cursor = self.conn.cursor()
 def process_item(self, item, spider):
 sql = &#;insert into item(title, image_url, date, image_path, url, url_id)&#; 
 &#;values (%s, %s, %s, %s, %s, %s)&#;
 date = item[&#;date&#;]
 self.cursor.execute(sql, args=(item[&#;title&#;], item[&#;image_url&#;], date, item[&#;image_path&#;], item[&#;url&#;], item[&#;url_id&#;]))
 self.conn.commit()
 return item
 def spider_closed(self, spider):
 self.cursor.close()
 self.conn.close()
.创建异步Pipeline写入数据库
  • 首先创建一个用于异步写入数据的AIOMysqlItemPipeline类,然后在这个类的初始化方法中创建一个pool连接池;

  • 然后在from_settings()方法中获取settings文件中的数据库配置信息,并将配置信息存入一个字典中。使用Twisted中的adbapi获取数据库连接池对象,使用前需要导入adbapi,如:from twisted.enterprise import adbapi。使用时需要用到ConnectionPool连接池:pool=adbapi.ConnectionPool(&#;MySQLdb&#;,**params),参数MySQLdb是使用的数据库引擎的名字,params就是要传递的数据库配置信息;

  • 接着在process_item()方法中使用数据库连接池对象进行数据库操作,自动传递cursor对象到数据库操作方法runInteraction()的第一个参数(自定义方法)如:ret=self.connection_pool.runInteraction(self.mysql_insert,item);

  • 还可以设置出错时的回调方法,自动传递出错消息对象failure到错误处理方法的第一个参数(自定义方法)如:ret.addErrback(self.error_callback);

  • 最后记得修改settings文件中的ITEM_PIPELINES配置,如:&#;XKD_Dribbble_Spider.pipelines.AIOMysqlItemPipeline&#;: ;

from twisted.enterprise import adbapi
import MySQLdb.cursors

class AIOMysqlItemPipeline:
 def __init__(self, pool):
 self.connection_pool = pool

 # :调用类方法
 @classmethod
 def from_settings(cls, settings):
 connkw = {
 &#;host&#;: MYSQL_HOST,
 &#;user&#;: MYSQL_USER,
 &#;password&#;: MYSQL_PASSWORD,
 &#;db&#;: MYSQL_DATABASE,
 &#;port&#;: MYSQL_PORT,
 &#;use_unicode&#;: MYSQL_OPTIONAL.get(&#;USE_UNICODE&#;),
 &#;charset&#;: MYSQL_OPTIONAL.get(&#;CHARSET&#;),
 &#;cursorclass&#;: MySQLdb.cursors.DictCursor,
 }
 pool = adbapi.ConnectionPool(&#;MySQLdb&#;, **connkw)
 return cls(pool)


 # :执行process_item
 def process_item(self, item, spider):
 ret = self.connection_pool.runInteraction(self.mysql_insert, item)
 ret.addErrback(self.error_callback)
 def mysql_insert(self, cursor, item):
 sql = &#;insert into item(title, image_url, date, image_path, url, url_id)&#; 
 &#;values (%s, %s, %s, %s, %s, %s)&#;
 date = item[&#;date&#;]
 cursor.execute(sql, args=(item[&#;title&#;], item[&#;image_url&#;], date, item[&#;image_path&#;], item[&#;url&#;], item[&#;url_id&#;]))
 def error_callback(self, error):
 print(&#;insert_error =========== {}&#;.format(error))
修改settings文件
ITEM_PIPELINES = {
 # &#;XKD_Dribbble_Spider.pipelines.XkdDribbbleSpiderPipeline&#;: ,
 # 当items.py模块yield之后,默认就是下载image_url的页面
 &#;XKD_Dribbble_Spider.pipelines.ImagePipeline&#;: ,
 &#;XKD_Dribbble_Spider.pipelines.AIOMysqlItemPipeline&#;: ,
}

本文链接:http://www.woshiqian.com/post/116539.html

百度分享获取地址:https://share.baidu.com/code
twisted框架  

我是钱微信/QQ:5087088

广告位、广告合作QQ:5087088

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

       

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。