V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Nillouise
V2EX  ›  Python

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

  •  
  •   Nillouise · 98 天前 · 1775 次点击
    这是一个创建于 98 天前的主题,其中的信息可能已经有所发展或是发生改变。
    由于爬虫使用的服务器内存很小,为了避免额外开一个数据库,现在希望能直接把爬取的数据放到文件里,之后把数据拖回本地再处理,这样消耗的内存比较小。

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

    为了避免程序跑一段时候后才出现问题,征求一下各位 v 友的意见
    17 条回复    2020-10-16 22:18:42 +08:00
    virusdefender
        1
    virusdefender   98 天前   ❤️ 2
    sqlite3
    lychs1998
        2
    lychs1998   98 天前
    读写文件时的性能开销不一定比读写数据库来的小。

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

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


    用免费数据库,没研究过免费版使用额度哈,有需要就研究一下? 忘了是哪位 v 友分享的了。
    dreasky
        16
    dreasky   97 天前
    最简单的不是直接写.json 吗 后续还要进一步处理可以导入数据库
    OldActorsSmile
        17
    OldActorsSmile   97 天前
    mysqlite
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3308 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:47 · PVG 18:47 · LAX 02:47 · JFK 05:47
    ♥ Do have faith in what you're doing.