傳統的使用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()
