我也找到有很多scrapy使用SQLAlchemy的文章,但都是现生成表,再插入,我这里的表是别人已经创建好,所以我需要先获取表再插入。
之前也写出来一份,但是有问题,好像因为不是declarative_base
这个base(暂时不知道是不是确实是这个原因),而导致异步的时候插入错误,但是如果攒起来,也就是假如到100个再存一下的话,其中一个有问题,这100个全存不进去了,最后成型这个方式,就这样吧,基本实现了。
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from sqlalchemy import create_engine, Column, Integer, String, Table, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
url = "mysql+pymysql://数据库用户名:密码@ip:端口/库名?charset=utf8mb4"
engine = create_engine(url, echo=False, encoding="utf-8")
Base = declarative_base()
metadata = MetaData(engine)
# 这个暂时没啥用, 也可以按照这种的去改,但是这份儿代码没用到
class User(Base):
__table__ = Table("User", metadata, autoload=True) # User是表名
class WlcbCloudPipeline(object):
def open_spider(self, spider):
self.SessionClass = sessionmaker(bind=engine) # 利用工厂模式获取SessionClass
self.session_obj = self.SessionClass() # 创建session对象,此时已绑定数据库引擎,但是未关联任何的对象模型
self.User_table = Table("User", metadata, autoload=True) # autoload=True这个是关键
def process_item(self, item, spider):
self.session_obj.execute(self.User_table.insert(), [item]) # item是{"id":1,"name":"xxx"}
# self.User_table.insert(id=1, name="2")
self.session_obj.commit()
return item
def close_spider(self, spider):
self.session_obj.close()
self.session_obj.commit()
#
网友评论