使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL

Posted CrossPython

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL相关的知识,希望对你有一定的参考价值。

传统的使用scrapy爬下来的数据存入mysql,用的是在pipeline里用pymysql存入数据库,

这种方法需要写sql语句,如果item字段数量非常多的 情况下,编写起来会造成很大的麻烦.

我使用的python 库:sqlalchemy来编写,用orm的方式,使代码变得非常简洁,按照数据库

表的字段,编写好自己的类,在settings里面设置好pipeline即可.

# -*- coding: utf-8 -*-
 
# author:lihansen
 
from sqlalchemy import create_engine,Column,Integer,String,Table,MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
 
class ArticleTemplate():
    id = Column(Integer, primary_key=True)#主键自增
    sourceName = Column(String(100))
    sourceUrl = Column( String(100))
    articleUrl = Column( String(100))
    articleCategory = Column( String(100))
    articleFromName = Column( String(100))
    articleFromUrl = Column( String(100))
    articleLabel = Column( String(100))
    title = Column( String(200))
    author = Column( String(100))
    publishTime = Column( String(100))
    articleContent = Column( String(10000))
    imageUrlList = Column( String(300))
    imageTitleList = Column( String(100))
 
    def __init__(self, **items):
        for key in items:
            if hasattr(self,key):
                setattr(self,key,items[key])
 
 
class ArticleSpidersPipeline(object):
 
    def __init__(self):#执行爬虫时
        self.engine = create_engine(‘mysql://root:[email protected]:3306/spider?charset=utf8‘,echo=True)#连接数据库
        self.session=sessionmaker(bind=self.engine)
        self.sess=self.session()
        Base = declarative_base()
	#动态创建orm类,必须继承Base, 这个表名是固定的,如果需要为每个爬虫创建一个表,请使用process_item中的
        self.Article = type(‘article_articletest‘,(Base,ArticleTemplate),{‘__tablename__‘:‘article_article‘})
 
 
    def process_item(self,item,spider):#爬取过程中执行的函数
	#按照爬虫名动态创建一个类
        # if not hasattr(self,spider.name):
        #     self.Article = type(spider.name, (Base, ArticleTemplate), {‘__tablename__‘: spider.name, })
        #在数据库中创建这个表
        # if spider.name not in self.engine.table_names(): #create table for this spider
        #     self.Article.metadata.create_all(self.engine)
 
        self.sess.add(self.Article(**item))
        self.sess.commit()
 
 
    def close_spider(self, spider):#关闭爬虫时
        self.sess.close()

  

以上是关于使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

sqlalchemy 的 ORM 与 Core 混合方式使用示例

python之SQLAlchemy ORM 上

SqlAlchemy 用 ORM 截断表

如何理解python的sqlalchemy这种orm框架

SQLAlchemy -- Python的SQLAlchemy和ORM

orm-sqlalchemy