class MYSQLTwistedPipeline(object):
def __init__(self, pool):
self.dbpool = pool
@classmethod
# def from_crawler(cls, crawler):
def from_settings(cls, settings):
"""
这个函数名称是固定的,当爬虫启动的时候,scrapy会自动执行这些函数,加载配置.
:param settings:
:return:
"""
params = dict(
host=settings["MYSQL_HOST"],
port=settings["MYSQL_POR"],
db=settings["MYSQL_DB"],
user=settings["MYSQL_USER"],
passwd=settings["MYSQL_PASSWD"],
charset=settings["MYSQL_CHARSET"],
cursorclass=pymysql.cursors.DictCursor
)
# 创建一个数据库连接池对象,这个连接池中可以包含多个Connect连接对象
# 参数一:操作数据库的包名
# 参数二:连接数据库的参数
db_connect_pool = adbapi.ConnectionPool("pymysql", **params)
# 初始化这个类的对象
obj = cls(db_connect_pool)
return obj
def process_item(self, item, spider):
"""
在连接池中,开始执行数据的多线程写入操作
:param item:
:param spider:
:return:
"""
# 参数一:在线程中被执行的sql语句
# 参数二:要保存的数据
result = self.dbpool.runInteraction(self.insert, item)
# 给result绑定一个回调函数,用于监听错误信息
result.addErrback(self.error)
return item
def error(self, reason):
print(f"错误原因是{reason}\n")
def insert(self, cursor, item):
insert_data = "insert into bole(title, content_string, content_type, vote_num, collection_num, comment_num, content_time, img_path)values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % (item["title"], item["content_string"], item["content_type"], item["vote_num"], item["collection_num"], item["comment_num"], item["content_time"], item["img_path"])
cursor.execute(insert_data)
# 不需要commit()
scrapy异步写入
最新推荐文章于 2023-11-26 08:00:00 发布