zoukankan      html  css  js  c++  java
  • 使用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:0@localhost: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()
    

      

  • 相关阅读:
    Java注释中的@deprecated与源代码中的@Deprecated
    android KE or NE分析
    Android手机中UID、PID作用及区别
    mtk刷机错误汇总
    区分Integer.getInteger和Integer.valueOf、Integer.parseInt() 的使用方法
    :>/dev/null 2>&1 的作用
    android 小技巧
    转:Eclipse自动补全功能轻松设置
    android开发常用地址
    转:大数据 2016 landscape
  • 原文地址:https://www.cnblogs.com/pythonClub/p/9740793.html
Copyright © 2011-2022 走看看