scrapy 如何解决写数据库性能问题 - V2EX
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
360safe
V2EX    Python

scrapy 如何解决写数据库性能问题

  •  
  •   360safe 2017-06-17 14:43:55 +08:00 6990 次点击
    这是一个创建于 3095 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,请问:
    目前一个项目,scrapy 目前一分钟抓取 7000 条。需要把数据写入数据库。

    而 Pipelines 好像是分析一条 insert into 一条,性能很低。
    INSERT INTO table_name (列 1, 列 2,...) VALUES (值 1, 值 2,....)

    请问是我的操作方法有问题,还是说可以把数据一批批写入提高效率,如:
    INSERT INTO table_name (列 1, 列 2,...) VALUES (值 1, 值 2,....), (值 1, 值 2,....), (值 1, 值 2,....), (值 1, 值 2,....)
    20 条回复    2017-06-19 14:07:01 +08:00
    misaka19000
        1
    misaka19000  
       2017-06-17 14:50:01 +08:00 via Android
    要是我就换 Redis
    panda0
        2
    panda0  
       2017-06-17 15:05:15 +08:00
    m
    bazingaterry
        3
    bazingaterry  
       2017-06-17 15:15:28 +08:00 via iPhone   1
    先丢进 Redis,再写个中间件处理后再入库吧……
    360safe
        4
    360safe  
    OP
       2017-06-17 15:47:23 +08:00
    scrapy 批量化 写入方案 怎么样呢?如果想实现的话如何实现呢?
    iyaozhen
        5
    iyaozhen  
       2017-06-17 15:48:44 +08:00 via Android
    你这数据量算少了。insert 批量插入就行
    360safe
        6
    360safe  
    OP
       2017-06-17 15:50:40 +08:00
    @iyaozhen 请问在 scrapy 里批量 的思路是什么?
    iyaozhen
        7
    iyaozhen  
       2017-06-17 15:59:51 +08:00 via Android
    @360safe 简单的话就是把每个 value 存着,然后搞个全局计数器,到了一定数量后拼成一个大 SQL,执行就行
    zts1993
        8
    zts1993  
       2017-06-17 16:00:52 +08:00
    异步 mysql 驱动。或者用发队列,避免阻塞
    Allianzcortex
        9
    Allianzcortex  
       2017-06-17 16:12:51 +08:00 via iPhone
    executemany
    360safe
        10
    360safe  
    OP
       2017-06-17 16:40:02 +08:00
    @Allianzcortex executemany 看上去与 NSERT INTO table_name (列 1, 列 2,...) VALUES (值 1, 值 2,....), (值 1, 值 2,....), (值 1, 值 2,....), (值 1, 值 2,....) 类似,只是更清晰。
    360safe
        11
    360safe  
    OP
       2017-06-17 16:45:24 +08:00
    @iyaozhen 请问如何将 每个 value 存着 ,是通过一个全局变量吗?还是在 Pipelines 中实现?
    ming2050
        12
    ming2050  
       2017-06-17 16:48:52 +08:00
    先往队列里写,然后再写 consumer 消费掉,这样就不影响采集速度了
    360safe
        13
    360safe  
    OP
       2017-06-17 17:19:27 +08:00
    问题应该解决了:

    MySQLStorePipeline 定义了一个 article_items 集合用于存储 spider 爬到的 item,当 items 数量达到 1000 时,批量写入数据库。如果接受到 item 就单条写入数据库,会比批量写入慢很对,爬虫的效率会慢一个数量级。

    http://kekefund.com/2016/03/31/scrapy-learn/
    slixurd
        14
    slixurd  
       2017-06-17 17:21:50 +08:00   1
    7000 条一分钟,数据库写压力 117QPS
    这么低的压力都嫌慢,说明配置超级垃圾
    用这么低配的 MySQL,上 Redis 的意义在哪,浪费资源么,23333
    360safe
        15
    360safe  
    OP
       2017-06-17 17:28:05 +08:00
    不是啊,用的阿里云 RDS,远程的。你这样提醒了我,一会弄一个本地的中转一下。
    misaka19000
        16
    misaka19000  
       2017-06-17 18:55:23 +08:00 via Android
    @slixurd 哈哈,没有想到这种情况
    360safe
        17
    360safe  
    OP
       2017-06-17 19:07:31 +08:00
    @slixurd 也有阿里云的 Redis,不过远程的估计。。。。我试试本地的 MySQL。
    owenliang
        18
    owenliang  
       2017-06-18 16:06:35 +08:00
    你先试试批量提交能到多少。。
    NaVient
        19
    NaVient  
       2017-06-19 09:37:03 +08:00
    扔到MQ这种异步队列里,再异步插入不就行了
    360safe
        20
    360safe  
    OP
       2017-06-19 14:07:01 +08:00
    嗯嗯,谢谢大家。最终解决方法是:
    因为每次一条 insert into 插入速度很慢,用了一个全局变量存着值,5000 条 executemany 写入一次远程阿里云数据库。

    批量后完全满足一分钟过滤 7000 条的需求。(本地数据库也受不了一条条插入。)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5943 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 02:13 PVG 10:13 LAX 18:13 JFK 21:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86