爬虫数据存储--基于MonogoDB

"当然, 并不是所有数据都适合"

在学习爬虫的过程中, 遇到过不少坑.

今天这个坑可能以后你也会遇到, 随着爬取数据量的增加, 以及爬取的网站数据字段的变化, 以往在爬虫入门时使用的方法局限性可能会骤增.

怎么个骤增法?

Intro 引例

在爬虫入门的时候, 我们爬取豆瓣电影Top250这些数据量并不是很大的网页时(仅计算文本数据量), 通常无需考虑数据存储的效率问题, 使用MySQL这些关系型数据库, 或者用TXT, CSV等文本格式存储, 都可以很快地存储完毕, Spider也可以跟着快速关闭. 因此我们感觉不到上述方式的弊端.

起初, 我爬的数据量在几千条时, 我选择用MySQL作为数据存储的数据库,
爬取结束时, 存储的时间花了几秒, 我还没有太在意.

爬取数据

但是当我爬取的数据量到了200M左右时, 问题非常明显了. 此时用MySQL存储, 半小时都无法关闭Spider! 如果添加了查重, 时间将会指数增长.

而使用CSV存储, 虽然关闭花不了特别多时间, 但是打开关闭文件所需的时间同样不少! Excel直接无法打开, Sublime和VS Code则要花费十几秒的时间来打开.

数据打开缓慢

图 : 正在打开CSV的Sublime Text

在后续对CSV中的数据进行基本的格式化后发送到Django可视化时, 打开网页的处理时间接近1分30秒. 速度感人.

感人的速度让我意识到要换一种方式来存储和处理数据, 本文仅对数据存储部分做过相应测试.

我将眼光瞄准了NoSQL中的MongoDB.

What's NoSQL

关系型数据库一直是计算机相关专业的必修课, 在过去的很长时间, 占据了互联网数据量的很大一部分. 但是随着大数据时代到来, 关系型数据库已然满足不了某些大数据的处理要求.

数据量变化
image.png

NoSQL,指的是非关系型的数据库。NoSQL也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

What's MongoDB

  • MongoDB是一种非关系型数据库, 是一个面向文档存储的数据库,操作起来比较简单和容易.
  • 可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性.
  • MongoDB支持RUBY,Python,Java,C++,PHP,C#等多种语言
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组
  • 内建支持Map和Reduce函数, 可对数据进行批量和聚合操作.

Why MongoDB

将目光放在MongoDB这样的文档型NoSQL身上, 是因为爬取的数据

  • 对一致性要求不高
  • 读写的速度要求较高
  • 遇到数据字段发生变化时, 可以更方便的添加字段, 无需改变以前的数据结构.

How TO

1. Step 1 安装MongoDB

安装MongoDB, 参考文档https://docs.mongodb.com/manual/administration/install-community/

安装pymongo, 如果你使用pip安装方式, 直接在终端中键入
pip install pymongo

安装成功的检测, 在python的shell中import pymongo不报错即可.

2. Step 2 添加项目配置

添加配置信息
在Scrapy项目的settings.py中添加以下代码

MONGO_HOST = "127.0.0.1" #主机IP
MONGO_PORT = 27017       #端口号
MONGO_DB = "Spider"      #库名
MONGO_COLL = "jobinfo"   #collection名
# MONGO_USER = ""
# MONGO_PSW = ""

代码片中的端口号为默认端口号, 如果安装后进行了修改, 以修改后为准, 库名及Collection名同上.

MongoDB支持动态创建, 因此你并不需要提前创建数据库和下属的Collection

3. Step 3 启用MongoDB存储Pipeline

在你Scrapy项目的pipelines.py中添加以下的方法(注意函数要写在某个Pipeline类中, 并在settings.py中启用对应的Pipeline, 如果你已经启用, 直接添加即可):

# 在Python中使用mongoDB的所需的包
import pymongo

# 配置mongoDB所需的包
from scrapy.conf import settings

def __init__(self):
        # connect to db
        self.client = pymongo.MongoClient(host=settings['MONGO_HOST'], port=settings['MONGO_PORT'])
        # ADD if NEED account and password
        # 当需要使用数据库的用户名和密码, 取消以下的注释, MongoDB支持直接查询, 无需登录
        # self.client.admin.authenticate(host=settings['MONGO_USER'], settings['MONGO_PSW'])
        # 设置数据库客户端类型
        self.db = self.client[settings['MONGO_DB']]
        # 取得数据库句柄
        self.coll = self.db[settings['MONGO_COLL']]

然后在同个文件下处理item的函数末尾中添加以下代码:

def process_item(self, item, spider):
    # .....
    postItem = dict(item)
    self.coll.insert(postItem)
    # 在终端中显示你的爬取数据
    return item
4. Step 4 Enjoy

在终端中运行你的爬虫, 待数据爬取完毕, Spider迅速关闭, 而数据已经写入数据库!
在终端中键入

# 切换数据库
use Spider
# 查找所有数据, pretty()函数用于格式化数据显示
# jobinfo为collection名称
db.jobinfo.find().pretty()
image.png

QQ联系: 994342122(不闲聊)
邮箱: fesonx@foxmail.com
欢迎关注我的腾讯云

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容