scrapy 爬取到结果后,将结果保存到 sqlite3,有两种方式

  • item Pipeline
  • Feed Exporter

方式一

使用 item Pipeline 有三个步骤

  1. 文件 pipelines.py 中,编写 Sqlite3Pipeline
  2. 文件 settings.py 中,添加 ITEM_PIPELINES
  3. 开始运行爬虫: scrapy crawl example

1. 文件 pipelines.py

说明

参考了官网文档的 MongoDB 的例子

要求

表格 SQLITE_TABLE 要在爬虫运行之前先创建好。否则会报错,原因不详。

代码

import sqlite3

class Sqlite3Pipeline(object):

    def __init__(self, sqlite_file, sqlite_table):
self.sqlite_file = sqlite_file
self.sqlite_table = sqlite_table @classmethod
def from_crawler(cls, crawler):
return cls(
sqlite_file = crawler.settings.get('SQLITE_FILE'), # 从 settings.py 提取
sqlite_table = crawler.settings.get('SQLITE_TABLE', 'items')
) def open_spider(self, spider):
self.conn = sqlite3.connect(self.sqlite_file)
self.cur = self.conn.cursor() def close_spider(self, spider):
self.conn.close() def process_item(self, item, spider):
insert_sql = "insert into {0}({1}) values ({2})".format(self.sqlite_table,
', '.join(item.fields.keys()),
', '.join(['?'] * len(item.fields.keys())))
self.cur.execute(insert_sql, item.fields.values())
self.conn.commit() return item

补充:

Github 有一个使用 twisted 操作 sqlite3 的例子,见这里。请自行对比。

2. 文件 settings.py

激活前面的 Sqlite3Pipeline 类,需要

添加

SQLITE_FILE = 'example.db'
SQLITE_TABLE = 'dmoz' ITEM_PIPELINES = {
'myproject.pipelines.Sqlite3Pipeline': 300,
}

3. 运行爬虫

$ scrapy crawl example

运行效果图:

方式二

使用 Feed Exporter 有三个步骤

  1. 文件 exporters.py 中,编写 Sqlite3ItemExporter
  2. 文件 settings.py 中,添加 FEED_EXPORTERS
  3. 开始运行爬虫: scrapy crawl example -o example.db -t sqlite3

1. 文件 exporters.py

说明

参考了Github的例子,基本没变

代码

from scrapy.exporters import BaseItemExporter
import sqlite3 class Sqlite3ItemExporter(BaseItemExporter): def __init__(self, file, **kwargs):
self._configure(kwargs)
self.conn = sqlite3.connect(file.name)
self.conn.text_factory = str
self.created_tables = [] def export_item(self, item):
item_class_name = type(item).__name__ if item_class_name not in self.created_tables:
keys = None
if hasattr(item.__class__, 'keys'):
sqlite_keys = item.__class__.sqlite_keys
self._create_table(item_class_name, item.fields.iterkeys(), sqlite_keys)
self.created_tables.append(item_class_name) field_list = []
value_list = []
for field_name in item.iterkeys():
field_list.append('[%s]' % field_name)
field = item.fields[field_name]
value_list.append(self.serialize_field(field, field_name, item[field_name])) sql = 'insert or ignore into [%s] (%s) values (%s)' % (item_class_name, ', '.join(field_list), ', '.join(['?' for f in field_list]))
self.conn.execute(sql, value_list)
self.conn.commit() def _create_table(self, table_name, columns, keys = None):
sql = 'create table if not exists [%s] ' % table_name column_define = ['[%s] text' % column for column in columns]
print('type: %s' % type(keys))
if keys:
if len(keys) > 0:
primary_key = 'primary key (%s)' % ', '.join(keys[0])
column_define.append(primary_key) for key in keys[1:]:
column_define.append('unique (%s)' % ', '.join(key)) sql += '(%s)' % ', '.join(column_define) print('sql: %s' % sql)
self.conn.execute(sql)
self.conn.commit() def __del__(self):
self.conn.close()

2. 文件 settings.py

激活前面的 Sqlite3ItemExporter 类,需要

添加


FEED_EXPORTERS = {
'sqlite3': 'myproject.exporters.Sqlite3ItemExporter',
}

3. 运行爬虫

$ scrapy crawl example -o example.db -t sqlite3

说明

第二种方式未测试!

scrapy 保存到 sqlite3的更多相关文章

  1. Python scrapy爬虫数据保存到MySQL数据库

    除将爬取到的信息写入文件中之外,程序也可通过修改 Pipeline 文件将数据保存到数据库中.为了使用数据库来保存爬取到的信息,在 MySQL 的 python 数据库中执行如下 SQL 语句来创建 ...

  2. python scrapy实战糗事百科保存到json文件里

    编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...

  3. 1.scrapy爬取的数据保存到es中

    先建立es的mapping,也就是建立在es中建立一个空的Index,代码如下:执行后就会在es建lagou 这个index.     from datetime import datetime fr ...

  4. Scrapy——將數據保存到MySQL數據庫

    Scrapy--將數據保存到MySQL數據庫 1. 在MySQL中創建數據庫表job_inf: 1 Create table job_inf( 2 id int(11) not null auto_i ...

  5. 使用scrapy爬取的数据保存到CSV文件中,不使用命令

    pipelines.py文件中 import codecs import csv # 保存到CSV文件中 class CsvPipeline(object): def __init__(self): ...

  6. 爬取伯乐在线文章(四)将爬取结果保存到MySQL

    Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...

  7. 将爬取的数据保存到mysql中

    为了把数据保存到mysql费了很多周折,早上再来折腾,终于折腾好了 安装数据库 1.pip install pymysql(根据版本来装) 2.创建数据 打开终端 键入mysql -u root -p ...

  8. 使用官方组件下载图片,保存到MySQL数据库,保存到MongoDB数据库

    需要学习的地方,使用官方组件下载图片的用法,保存item到MySQL数据库 需要提前创建好MySQL数据库,根据item.py文件中的字段信息创建相应的数据表 1.items.py文件 from sc ...

  9. jQuery切换网页皮肤保存到Cookie实例

    效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/25.htm 以下是源代码: <!DOCTYPE html PUBLIC "-//W3C//D ...

随机推荐

  1. a标签加入单击事件 屏蔽href跳转页面

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题 ...

  2. JavaWeb 的学习一

    JavaWeb学习总结(一)——JavaWeb开发入门 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Inte ...

  3. activiti和SSH项目做整合

    最近因公司的业务需求,需要使用工作流来做我们业务中的流程审批工作,so 就安排我做了这个工作,发现整合的时候有一些问题,及时的记录下来分享给大家. 介绍: 一.如果你的web项目只是单纯的web项目那 ...

  4. Asp.net MVC验证那些事(4)-- 自定义验证特性

    在项目的实际使用中,MVC默认提供的Validation Attribute往往不够用,难以应付现实中复杂多变的验证需求.比如, 在注册用户的过程中,往往需要用户勾选”免责声明”,这个checkbox ...

  5. Opensource开源精神

    现在如火如荼的开源运动和互联网自由开放的精神是一致的,互联网上有无数非常优秀的像Linux一样的开源代码,我们千万不要高估自己写的代码真的有非常大的“商业价值”.那些大公司的代码不愿意开放的更重要的原 ...

  6. ios移动端切图及前端规范

    移动端IOS知识普及:IOS标准分辨率:1242px * 2208px 切片要求: 1.    设计稿是按标准分辨率1242X2208设计,图片资源尺寸则是3倍图尺寸,将整个设计图压缩成750X133 ...

  7. NOIP2009pj道路游戏[环形DP 转移优化 二维信息]

    题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编 ...

  8. [转] 如何设置Eclipse的上网代理

    from: http://blog.csdn.net/qq635785620/article/details/8191799 不同版本的eclipse有不同的设置方法 方式一:   默认的Eclips ...

  9. Github 安全类Repo收集整理

    作者:天谕链接:https://zhuanlan.zhihu.com/p/21380662来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.刚好这两天对之前github上关 ...

  10. poj 2892

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7725   Accepted: 3188 D ...