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 · 2020-10-16 15:06:18 +08:00 · 2732 次点击
    这是一个创建于 1279 天前的主题,其中的信息可能已经有所发展或是发生改变。
    由于爬虫使用的服务器内存很小,为了避免额外开一个数据库,现在希望能直接把爬取的数据放到文件里,之后把数据拖回本地再处理,这样消耗的内存比较小。

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

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

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

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


    用免费数据库,没研究过免费版使用额度哈,有需要就研究一下? 忘了是哪位 v 友分享的了。
    dreasky
        16
    dreasky  
       2020-10-16 20:41:25 +08:00
    最简单的不是直接写.json 吗 后续还要进一步处理可以导入数据库
    OldActorsSmile
        17
    OldActorsSmile  
       2020-10-16 22:18:42 +08:00
    mysqlite
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5955 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:35 · PVG 10:35 · LAX 19:35 · JFK 22:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.