传统的使用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. 浅谈Python web框架

    一.Python web框架 Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全 ...

  2. Python 全栈开发七 面向对象

    一.编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式 ...

  3. mac上命令行解压rar

    时间进入到2018年12月,mac上好用的rar解压工具要收费了.被逼的没办法,用命令行吧,谁让咱擅长呢? 1,使用Homebrew安装unrar,没有自己装去 brew install unrar ...

  4. selenium + python 测试环境搭建 (WINDOWS)

    1. 下载Python , 运行.exe -> http://python.org/getit/ 2. 下载Python Setuptools 基础包管理工具安装,官方文档参考 https:// ...

  5. ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeeper create failed after 4 attempts

    ERROR [main] zookeeper.RecoverableZooKeeper: ZooKeeper create failed after 4 attempts ERROR [main] m ...

  6. LightGBM调参总结

    1. 参数速查 使用num_leaves,因为LightGBM使用的是leaf-wise的算法,因此在调节树的复杂程度时,使用的是num_leaves而不是max_depth. 大致换算关系:num_ ...

  7. ROSETTA使用技巧随笔--控制Log输出等级

    一般运行ROSETTA,屏幕上的Log很多,而且很复杂,让我们看着眼晕,现在我们可以通过控制Log等级来控制屏幕上输出的东西.  Integer Level 0 Fatal 100 Error 200 ...

  8. rosetta mpi error: protocols.jobdist.JobDistributors:(0)Master Node -- Waiting for job request:tag=1

    很简单,因为使用了mpi编译版本的rosetta,却只给它分配了一个线程,然后这个线程用于分配任务,就没有线程跑任务,所以就freeze了

  9. Hello world!(内含自己编写的C语言二叉树同学录)

      修改:刷了一段时间的题,水平渐涨,发现同学录真的要做成市面可行的应用的话,应该按学号建立二叉平衡树,红黑树是一个可行的选择. 在同学的推荐下,来到博客园来找志同道合的人交流代码.3个月后参加蓝桥杯 ...

  10. c#除掉字符串最后一个字符几种方法

    有一数组:转换为字符串后为 aaa|bbb|ccc|ddd| 现要去掉最后一个| 第一种方法: 语句为:str1=aaa|bbb|ccc|ddd| str=str1.substring(0,lasti ...