不使用数据库,直接存储爬虫爬到的数据到文件有什么最佳实践?

2020-10-16 15:06:18 +08:00
 Nillouise
由于爬虫使用的服务器内存很小,为了避免额外开一个数据库,现在希望能直接把爬取的数据放到文件里,之后把数据拖回本地再处理,这样消耗的内存比较小。

使用的框架是 scrapy,目前想到直接存文件的问题是:
文件里的数据不能保证数据格式(比如各种原因写文件到一半然后程序就崩溃)
需要自己管理文件锁,不能同时写到同一个文件。

为了避免程序跑一段时候后才出现问题,征求一下各位 v 友的意见
2748 次点击
所在节点    Python
17 条回复
virusdefender
2020-10-16 15:08:57 +08:00
sqlite3
clf
2020-10-16 15:12:29 +08:00
读写文件时的性能开销不一定比读写数据库来的小。

SQLite3 是一个很不错的选择。
当然,如果你已经有数据库服务在运行了,可以直接新建一个数据库用于存放数据。
selca
2020-10-16 15:22:32 +08:00
h2
XiaoxiaoPu
2020-10-16 15:29:19 +08:00
可以用基于本地文件的 KV 存储,单进程的话 RocksDB,多进程可以用 lmdb
shoaly
2020-10-16 15:30:35 +08:00
随便找一个 star 多点的 python 日志库就行了, 日志库应该天生就解决了并发大量写入文件的性能和锁问题, 然后把数据写入日志就行了
Nillouise
2020-10-16 15:46:21 +08:00
@shoaly 有过这个想法,感觉这事最靠谱的一条路
Nillouise
2020-10-16 16:05:23 +08:00
调查了一下,sqlite 的内存使用量似乎真的可以做到几 MB,RocksDB 和 Imdb 这类嵌入式数据库应该也能差不多,符合要求,看来是我小看了嵌入式数据库的轻量级了,但用起来还是麻烦,而且有些还是 jar 程序,pass 了。

用日志的话,似乎要找一下能压缩日志文件的方法,这条路应该比较好,先按这个做了吧。
misaka19000
2020-10-16 16:10:54 +08:00
Python 标准库支持 sqlite
Nillouise
2020-10-16 16:19:13 +08:00
@misaka19000 用数据库的话,拖到本地后需要处理删除旧数据的问题,而日志可以自动 rolling 、删除旧日志,登上机器查看也比较方便。看起来数据库并不怎么适合这种同步的场景。
fhsan
2020-10-16 16:21:46 +08:00
redis+celery
maocat
2020-10-16 16:23:02 +08:00
爬虫写的好,牢饭吃到饱
lastYoueven
2020-10-16 16:36:53 +08:00
数据玩的六,牢饭少不了
sapocaly
2020-10-16 17:35:40 +08:00
写日志,快,资源低
playniuniu
2020-10-16 20:35:21 +08:00
不用这么麻烦,爬到一条数据就存一条 CSV,爬之前先验证有没有这个 CSV,有就跳过,没有就爬。最后把所有的 CSV 文件合并一下就可以
ik
2020-10-16 20:39:53 +08:00
https://mp.weixin.qq.com/s/4V6XMxfxHE0IBThlZy1Wrw


用免费数据库,没研究过免费版使用额度哈,有需要就研究一下? 忘了是哪位 v 友分享的了。
dreasky
2020-10-16 20:41:25 +08:00
最简单的不是直接写.json 吗 后续还要进一步处理可以导入数据库
OldActorsSmile
2020-10-16 22:18:42 +08:00
mysqlite

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715636

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX