传统的使用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()