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

  

使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL的更多相关文章

  1. sqlalchemy 的 ORM 方式使用示例

    知乎: 使用 sqlalchemy 的 orm 方式操作数据库是一种怎样的体验? 答: 酸爽! 本文基于:win10 + python3.4 + sqlAlchemy 1.0.13 先看一个图(来源) ...

  2. SQLAlchemy(1) -- Python的SQLAlchemy和ORM

    Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...

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

    知乎: sqlalchemy 的 ORM 与 Core 混合方式操作数据库是一种怎样的体验? 答: 酸! 本文基于:win 10 + python 3.4 + sqlalchemy 1.0.13 基本 ...

  4. SQLAlchemy的ORM

    表关系: 表之间的关系存在三种:一对一.一对多.多对多.而SQLAlchemy中的ORM也可以模拟这三种关系.因为一对一其实在SQLAlchemy中底层是通过一对多的方式模拟的,所以先来看下一对多的关 ...

  5. xorm:golang的orm(只写了一小部分)

    xorm xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便.这个库是国人开发的,是基于原版 xorm:https://github.com/go-xorm/xorm 的定制 ...

  6. sqlalchemy 的 Core 方式使用示例

    知乎: sqlalchemy 的 Core 方式操作数据是一种怎样的体验? 答: 爽! 本文基于:win 10 + python 3.4 + sqlalchemy 1.0.13 基本步骤如下: 1. ...

  7. jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画

    地狱的镰刀 bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){ ...

  8. JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...

  9. Django类方式写view

    问题: Django官方教程中都是通过def函数方式来写view,如何通过类方式写view以及为何要通过类方式写view? 那,如何解决这个问题? 用户访问浏览器,一般两种方式,get获取网页和pos ...

随机推荐

  1. (转)redis分布式锁-SETNX实现

    Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXists.这系列的命令非常有用,这里讲使用SETNX来实现分布式锁 ...

  2. (转)从拜占庭将军问题谈谈为什么pow是目前最好的共识机制

    我们知道基于区块链技术现在有很多的共识机制,包括不限于POW,POS,DPOS,PBFT……,我先不说为什么我最认可POW,我们先来看看著名的拜占庭将军问题: 拜占庭帝国即中世纪的土耳其,拥有巨大的财 ...

  3. linux curl命令如何上传本地文件夹和下载文件

    本地有一个文件夹为my_dir,里面有四个文件,分别是test1.txt,user_account,tools_user,plans 要把这个my_dir文件夹传到ftp 192.168.8.251 ...

  4. android 调用webview控件,为逆向h5app做准备

    activity对应layout文件加入: <WebView android:id="@+id/main_web" android:layout_width="ma ...

  5. Deeplab v3+的结构代码简要分析

    添加了解码模块来重构精确的图像物体边界.对比如图 deeplab v3+采用了与deeplab v3类似的多尺度带洞卷积结构ASPP,然后通过上采样,以及与不同卷积层相拼接,最终经过卷积以及上采样得到 ...

  6. mybatis之注解式开发

    注解: 注解是用于描述代码的代码.例如:@Test(用于描述方法进行junit测试),@Override(用于描述方法的重写),@Param(用于描述属性的名称) 注解的使用风格:@xxx(属性),使 ...

  7. vue中使用base64和md5

    1.在项目根目录下安装 cnpm install --save js-base64 cnpm install --save js-md5 2.在项目文件中引入 import md5 from 'js- ...

  8. [转]kafka介绍

    转自 https://www.cnblogs.com/hei12138/p/7805475.html kafka介绍 1.1. 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台 ...

  9. redis基本命令

    1指定配置文件启动 ./redis-server /opt/server/redis/conf/redis.conf vim redis.conf #配置文件requirepass    #后面跟密码 ...

  10. Vue系列之 => 钩子函数生命周期

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...