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
sagaxu
V2EX  ›  Python

Python 爬虫改成 go,性能提高 5 倍?

  •  
  •   sagaxu · 2018-12-03 09:28:17 +08:00 via Android · 17850 次点击
    这是一个创建于 2182 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2018-12-03 12:50:37 +08:00
    原作被你们评论到 404 了,神马情况😳
    107 条回复    2018-12-04 11:02:50 +08:00
    1  2  
    chanchan
        1
    chanchan  
       2018-12-03 09:34:00 +08:00
    别问问就是 python 牛逼
    aa514758835
        2
    aa514758835  
       2018-12-03 09:34:32 +08:00
    萌新不懂,我也看了这篇文章,我记得 python 好像也可以并行处理吧~
    notreami
        3
    notreami  
       2018-12-03 09:38:26 +08:00
    没加代理,无所谓性能
    zarte
        4
    zarte  
       2018-12-03 09:40:18 +08:00
    首先静态语言应该会好点,但是没专门对比过。
    然后他这个有筛选的爬应该会用到正则或者字符串匹配。
    正则这个对时间影响很大具体语言自带的都不一样。
    lekai63
        5
    lekai63  
       2018-12-03 09:40:26 +08:00
    爬虫瓶颈不是应该在网络这块么?
    感觉预期应该是 go 和 python 差不多速度才对呀。。
    windfarer
        6
    windfarer  
       2018-12-03 09:42:12 +08:00
    python 代码质量不高,同步写数据库,能快就怪了
    gesse
        7
    gesse  
       2018-12-03 09:42:29 +08:00
    爬虫很大时候性能瓶颈在网络

    就像如果不换固态硬盘,cpu 在一定范围内, 整体性能是差不多的。
    x7395759
        8
    x7395759  
       2018-12-03 09:45:47 +08:00
    别问,问就是人生苦短,我用 python
    congeec
        9
    congeec  
       2018-12-03 09:48:42 +08:00 via iPhone   ❤️ 2
    我曾经也以为爬虫的瓶颈在 io,直到我用了 scrapy,CPU 常年某个核心 100%。单核异步,没法优化。

    python 单核异步一条道走到黑,gvr 老爷子们以为大家都只写 web 后端呢? python 要死在这条道上
    kidlfy
        10
    kidlfy  
       2018-12-03 09:48:45 +08:00
    他数据库存储是同步的呀...说实话 我还没见过 scrapy 存数据库 这个步骤是写在 spider 里的....
    chengxiao
        11
    chengxiao  
       2018-12-03 09:48:54 +08:00
    爬虫的性能.....难道不是看代理速度么?
    cuixiao603
        12
    cuixiao603  
       2018-12-03 09:50:19 +08:00 via Android
    别问 问就是你这个 python 水平不行
    congeec
        13
    congeec  
       2018-12-03 09:51:54 +08:00 via iPhone
    2008 年到现在,也就 asyncio 亮眼点,JIT、GIL 毫无改进,一点诚意都没有(不要跟我说 pypy,cffi 烦死人)。人家 ruby2.6 都有官方 jit 了。
    so1n
        14
    so1n  
       2018-12-03 09:52:56 +08:00
    在知乎的评论不堪入目
    memorycancel
        15
    memorycancel  
       2018-12-03 09:53:14 +08:00
    瓶颈在被爬取网站的反扒机制,你爬虫性能再好都没屌用,甚至适得其反。
    bonfy
        16
    bonfy  
       2018-12-03 09:54:38 +08:00
    @memorycancel 适得其反 精髓了
    gamecreating
        17
    gamecreating  
       2018-12-03 09:56:00 +08:00
    是的,用 C 多线程写 速度更快.
    但是你们追求的采集快 还是开发快呢?
    场景不同 不能一概而论
    poplar50
        18
    poplar50  
       2018-12-03 09:57:36 +08:00 via Android
    网络 io 觉得 python 并不虚
    agdhole
        19
    agdhole  
       2018-12-03 10:06:53 +08:00
    知乎核心业务 python 转 go: https://zhuanlan.zhihu.com/p/48039838
    qwertty01
        20
    qwertty01  
       2018-12-03 10:10:32 +08:00
    @memorycancel 爬的越快,封的越快
    keysona
        21
    keysona  
       2018-12-03 10:16:50 +08:00
    go 抓取内容,python 解析入库。
    myyou
        22
    myyou  
       2018-12-03 10:17:05 +08:00
    别问问就是 python 不行,跟人是不是彩笔,是不是用的不对没有关系
    lxy42
        23
    lxy42  
       2018-12-03 10:17:47 +08:00   ❤️ 3
    各位还是看了代码再发表评论吧,Python 爬虫竟然是一条一条数据同步保存到 MySQL。
    https://github.com/lidingke/go_python_crawler_benchmark/blob/master/py_get.py#L20-L31

    另外,把 mysql 换成 mysqlclient 速度又能快不少。
    GoLand
        24
    GoLand  
       2018-12-03 10:25:54 +08:00   ❤️ 7
    现在有些人会写个 `print("hello world")` 就觉得自己掌握了 Python,自己不会用还怪语言慢,怪就算了,还到处张扬自己的愚蠢,写这文章的人是天生缺关注想要博关注?这不是在搞笑吗.........代码都经不起人 review 说个 jb。
    ivechan
        25
    ivechan  
       2018-12-03 10:28:16 +08:00
    这个对比,我也是服气的。
    一个框架, 一个手写调度,起码得保证代码的基本逻辑一致才有比较的意义吧?
    看前面,居然还有 Python 同步保存到数据库这种操作。

    多说一句,Python 是性能差,那也得看场景啊,像(大多数)爬虫都是 I/O 密集型的任务,Python 毫无疑问可以胜任。
    Vegetable
        26
    Vegetable  
       2018-12-03 10:31:38 +08:00
    这对比好蛋疼...玛莎拉蒂能跑三百,我有必要买吗?
    ipwx
        27
    ipwx  
       2018-12-03 10:32:03 +08:00
    @lxy42 单核带锁用 MySQL 确实是巨大黑点。

    但是话说回来,如果你用很 advanced 的技术优化了 Python 程序(我倒也是想到了很多方案,不过没做过),那么 Python 唯一一条远好于 Go 的优势、写起来容易,不是不成立了吗?就算你作为资深 Python 程序员能够优化到这种程度,但是那也只是和 Go 平起平坐而已吧。。。

    利益相关:不会 Go,Python 老手吧。。
    www5070504
        28
    www5070504  
       2018-12-03 10:33:32 +08:00   ❤️ 2
    ... 不知道说啥好 这种 io 任务 时间大多浪费在 io 等待上 谈什么语言性能 在搞笑吧
    NaVient
        29
    NaVient  
       2018-12-03 10:34:57 +08:00
    难道你们都没看到源码里 爬一条就对数据库进行 IO 的神操作吗?
    xpresslink
        30
    xpresslink  
       2018-12-03 10:35:18 +08:00   ❤️ 1
    最重要的问题是:
    爬虫的最大痛点不是速度,而是突破反爬。
    其次的痛点,50%以上的爬虫任务是一次性的。
    另外不断尝试方案和调试是爬虫开发花费的主要精力。
    最后是爬虫相关的库和生态丰富程度是必然要考虑的。


    从这些点上来说作为不单是 Go,所有静态语言的来写爬虫是相对比较难受的。动态语言 Python 几乎就是爬虫的同义词,这不是偶然的。
    est
        31
    est  
       2018-12-03 10:41:23 +08:00   ❤️ 1
    把 scrapy 按在地上揍了一顿。不过瘾,怎么办?把 python 放进标题里。
    wwg1994
        32
    wwg1994  
       2018-12-03 10:45:12 +08:00
    @est 6666666
    nuansediao
        33
    nuansediao  
       2018-12-03 10:46:41 +08:00
    才快 5 倍,算不上吊打。。。也不够唬人,至少提高个几十倍的吧。
    wangxiaoaer
        34
    wangxiaoaer  
       2018-12-03 10:46:58 +08:00
    说实在的,感觉这种评价参考意义并不大,scrapy 是一个大的爬虫框架,文中的 go 应用算是一个定向爬虫,功能复杂性没法比。如果不基于 scrapy,和 go 一样重写一个定向抓取的应用,相互比对,才有意义吧。
    lxy42
        35
    lxy42  
       2018-12-03 10:47:02 +08:00
    @ipwx #27 过早的优化是万恶之源。如果项目一开始就对性能(实时性)有非常高的要求,那么 Python 确实不是首选。如果一开始对性能没有很高的要求,选择 Python 无疑可以提高开发速度,后期遇到性能问题,也是可以通过 C 扩展等其它手段去优化。
    clino
        36
    clino  
       2018-12-03 10:47:21 +08:00
    文章作者看到 11 分 和 45 秒 这种级别的差异就没有怀疑一下自己的代码写法吗?
    何况这又不是 CPU 密集型的
    kaohaonan6666
        37
    kaohaonan6666  
       2018-12-03 10:55:28 +08:00
    IO 密集型 你用 c 写 提高幅度也不大
    locoz
        38
    locoz  
       2018-12-03 10:57:21 +08:00 via Android
    不存在的,真的写起来的时候这种简单网站的简单需求根本不需要用框架,requests+多进程或者 asyncio+aiohttp 怼就完事了,整个代码写下来最多就十几行。
    跑起来之后大部分时间都在等待网络 io,这需求又没有要对数据做预处理,速度根本差不了多少,所以开发时间和爬的时间加起来还是 Python 比较快😂😂
    xpresslink
        39
    xpresslink  
       2018-12-03 11:04:32 +08:00
    @nuansediao 当年有个人对比了 C 和 Python 写的空循环性能,得到了比这个厉害的结论。
    hpeng
        40
    hpeng  
       2018-12-03 11:10:26 +08:00 via iPhone
    打个比喻,约等于用 py 写睡眠排序,跟用 go 写快排,然后说吊打…
    tt67wq
        41
    tt67wq  
       2018-12-03 11:13:23 +08:00
    这种人也算程序员系列?
    est
        42
    est  
       2018-12-03 11:17:41 +08:00
    @clino CPU 密集型的,要吊打 MKL 还得颇费一番功夫


    ( C++ 巨牛除外)
    stackexplode
        43
    stackexplode  
       2018-12-03 11:18:12 +08:00
    一天到晚研究鄙视链的人,水平真的。。
    zhongyiio
        44
    zhongyiio  
       2018-12-03 11:21:27 +08:00 via Android
    话说爬虫主要看对方的性能吧,你性能再高,对方一爬就挂,哈哈哈
    2225377fjs
        45
    2225377fjs  
       2018-12-03 11:24:08 +08:00
    python 确实慢这是客观存在的,执行效率上与 golang 存在明显的差距。
    只将爬虫当成是 IO 密集型的,也多半是小白
    congeec
        46
    congeec  
       2018-12-03 11:25:23 +08:00
    @est 我都直接调用 MKL
    @zhongyiio 刚开始用写爬虫不懂事儿,挂过几个小网站。后来有人性了
    hujianxin
        47
    hujianxin  
       2018-12-03 11:26:33 +08:00
    @GoLand 哈哈哈,没错
    qsnow6
        48
    qsnow6  
       2018-12-03 11:34:58 +08:00
    IO 密集型的,扯再多也没鬼用;
    scrapy 每分钟单机单核超过 3000 请求 /分钟,这速度平时做定向爬虫根本都用不上。分分钟被服务器拉黑,不拉黑也抓挂了。

    如果还有杠精在这扯,说明平时接触爬虫不够深入。
    janus77
        49
    janus77  
       2018-12-03 11:37:30 +08:00
    文章看不了了?没有知识的荒原
    brucedone
        50
    brucedone  
       2018-12-03 11:41:16 +08:00
    https://github.com/lidingke/go_python_crawler_benchmark/blob/master/py_get.py ,看到了熟悉的 lock,也不知道这个该怎么说了。
    wangxiaoaer
        51
    wangxiaoaer  
       2018-12-03 11:43:07 +08:00
    @janus77 #49 你们不要这样,作者估计受不了删文章了吧。
    xpresslink
        52
    xpresslink  
       2018-12-03 11:44:22 +08:00
    @janus77 我刚发一条打脸评论,结果。。。
    Keyes
        53
    Keyes  
       2018-12-03 11:47:19 +08:00
    @xpresslink 结果来到了荒原 23333
    jjx
        54
    jjx  
       2018-12-03 11:52:12 +08:00
    一个编译型静态类型的语言 每天 就知道同一个解释型动态语言 比性能

    脸都放哪里去了
    tnt666666
        55
    tnt666666  
       2018-12-03 11:56:41 +08:00 via Android
    是的,go 是最吊的,吊打 Python
    wdv2ly
        56
    wdv2ly  
       2018-12-03 12:17:47 +08:00
    这不算啥,我写一个代理工具,在垃圾小鸡上跑,cpu 负载 60%左右,加密模块用 c “翻译”下,cpu 负载降到 2-3%,算下来效率提高了 20-30 倍
    Leigg
        57
    Leigg  
       2018-12-03 12:22:56 +08:00 via iPhone
    做爬虫,python 足够了,换再快的语言也没用,懂的人自然懂。
    labulaka
        58
    labulaka  
       2018-12-03 12:31:32 +08:00 via Android
    404 了🌚
    qdzzyb
        59
    qdzzyb  
       2018-12-03 12:34:30 +08:00
    原文 404 了
    xiaqi
        60
    xiaqi  
       2018-12-03 12:37:31 +08:00 via Android
    当年,说 php 是世界最好的论坛炸开了锅。如今,说 Go 爬虫性能吊打 Python,论坛炸开了锅。

    文章的作者应该已经在和妹子约会了吧?😂😂😂
    fiht
        61
    fiht  
       2018-12-03 12:41:27 +08:00   ❤️ 4
    实习的时候写了将近一年的爬虫,大概有这么一点感悟。
    在做定向爬虫到时候,比如说抓一抓机票网站的价格,需要突破一些反爬虫机制,或者需要使用无头浏览器做渲染。这种场景下语言不存在性能瓶颈,瓶颈在于对方的服务器压力和反爬虫机制。这种场景适合使用 Python。
    但是在做广度爬虫的时候,Python 就不适用了,就像楼上讲的 scrapy 单核跑满的问题。在这个场景下使用 Python 会带来很多的问题,比如说为了解决只有单核跑完的问题就需要起多个 scrapy 实例,为了让这多个 scrapy 实例协同工作就需要引入一个消息队列,整个系统的耦合度就复杂了不少。用 golang 来做的话就方便很多。几个爬行时的 goroutine 和几个 pipeline 的 goroutine,整个系统就能稳定地运转起来。这是 Python 所不能达到的。
    DeWhite
        62
    DeWhite  
       2018-12-03 12:48:12 +08:00
    抓的快了不是等反么。。
    vdo
        63
    vdo  
       2018-12-03 12:51:40 +08:00
    老板不涨工资的话,能用 py 就用 py
    dbow
        64
    dbow  
       2018-12-03 12:51:40 +08:00
    不用 scrapy 就好了,python 写的 event loop 也能轻松做到 1w/s 请求。
    觉得 python I/O 不行是水平问题。
    xhp281
        65
    xhp281  
       2018-12-03 13:06:58 +08:00
    RqPS6rhmP3Nyn3Tm
        66
    RqPS6rhmP3Nyn3Tm  
       2018-12-03 13:13:37 +08:00 via iPhone
    爬虫最困难的不是研究反爬机制吗,io 我觉得不是最重要的因素
    Linxing
        67
    Linxing  
       2018-12-03 13:41:11 +08:00
    并发有什么了不起的 Python 不支持?
    sgissb1
        68
    sgissb1  
       2018-12-03 14:10:38 +08:00
    爬虫玩过一段时间,也在有几个稳定爬取的地方。

    也用 scrapy,用 python 写。python 性能好不好不好讲,主要是每次启动 scrapy 太慢了(要生成 pyd 缓存),另外熟悉了 scrapy 后,做一下简单爬虫还是可以的,做复杂的(比如怕动态页面)就很难受了,需要引入其他解析库( scrapy 自带那几个基本不够用),因为是 python 菜鸡,感觉调起爬虫代码来,很是难受。
    marcushbs
        69
    marcushbs  
       2018-12-03 14:18:22 +08:00
    用过 scrapy/portia/puppeteer,遇到的有效反爬机制有两种:
    1. 封 IP
    2. captcha
    第一个只能用大规模部署的有独立 ip 的爬虫网络来解决,interval 的设置和数据存储 /合并需要有效调度;
    第二个颇为复杂,取决于 captcha 的设计:简单的识图可以通过一些库甚至 ml 来解决(比如 V2EX 的登录认证码ε=ε=ε=┏(゜ロ゜;)┛); 12306 或者 google captcha 那种需要让人点选 9 张里 N 张甚至让人算个微积分的,可以用 headless chrome 的截图机制(甚至 copy/paste DOM 重现),另一头连通到类似 Amazon Mechanical Turk 人肉智能服务上,还要对正确率和审核手段做调整。

    随着爬与反爬的不断斗争,针对 captcha 的工具库会不断增大和复杂,但新反爬模式总可以通过连接人肉服务解决
    ——综上,爬虫主要就是解决 1.分布式调度 2.和人肉服务的对接。至于单点性能,基本不算问题。
    petelin
        70
    petelin  
       2018-12-03 14:33:47 +08:00
    要是趴下来直接扔到缓存里,或者扔到流里, 用 Python 是没问题.
    关键是, 你的业务就那么简单吗, 不需要解析吗? 单单一个解析是可以把 CPU 跑到 100%的好不好
    revol
        71
    revol  
       2018-12-03 14:38:00 +08:00
    @petelin 密集计算的部分当然用 C 扩展啊,xpath,beautifulsoup 之类的。反正绝对不会比 go 慢
    kakudesu
        72
    kakudesu  
       2018-12-03 14:59:53 +08:00
    别问,问就是 404
    karllynn
        73
    karllynn  
       2018-12-03 15:13:36 +08:00
    404 了,一般爬虫用 Python 肯定够了,Python 性能差你多开几个进程啊…
    tailf
        74
    tailf  
       2018-12-03 15:16:34 +08:00
    才五倍,应该分分钟五十倍啊
    geying
        75
    geying  
       2018-12-03 15:22:40 +08:00
    来看评论
    zhongyiio
        77
    zhongyiio  
       2018-12-03 15:25:33 +08:00 via Android
    @congeec 点赞有人性
    petelin
        78
    petelin  
       2018-12-03 16:21:26 +08:00 via iPhone
    @revol python 天下第一
    XIVN1987
        79
    XIVN1987  
       2018-12-03 16:25:49 +08:00
    @petelin
    数据分析有 numpy、pandas,matplotlib,sklearn 底层都是 C 写的,效率很高
    locoz
        80
    locoz  
       2018-12-03 16:31:37 +08:00   ❤️ 1
    locoz
        81
    locoz  
       2018-12-03 16:31:59 +08:00
    @locoz #80 原评论 -> 原文评论
    quqiuzhu
        82
    quqiuzhu  
       2018-12-03 16:41:29 +08:00 via Android
    人生苦短,我用 python。说的就是你们天天优化优化,老子自己写得爽就行了,性能不好多加几台机器就是。
    yc8332
        83
    yc8332  
       2018-12-03 16:58:18 +08:00
    性能瓶颈不是应该在数据库吗?
    rizon
        84
    rizon  
       2018-12-03 17:06:54 +08:00
    我不是很懂 python,但是 python 很火是毋庸置疑的,但是有件事我不明白,希望有大佬解答。
    既然 python 是单核,性能有瓶颈,为什么还这么火?尤其是云计算方面,这个单核的问题不是问题吗?

    网上看到的描述


    贴一下 18 年 12 月的排行

    rockyou12
        85
    rockyou12  
       2018-12-03 17:09:02 +08:00
    @rizon python 可以多进程,多核也能利用起来。只是比 java、go 这些比起来写起来有点蠢。
    troywinter
        86
    troywinter  
       2018-12-03 17:11:34 +08:00
    @est cpu 密集型,numpy 和 c++不相上下,都是调 mkl 的库,没什么区别。
    xiaqi
        87
    xiaqi  
       2018-12-03 17:12:55 +08:00 via Android
    那些老说 python 性能渣的,你倒是用 go 写个比 python 的 numpy 性能更高的库出来呀?
    🐶🐶🐶
    beforeuwait
        88
    beforeuwait  
       2018-12-03 17:13:56 +08:00
    @memorycancel 十分同意
    beforeuwait
        89
    beforeuwait  
       2018-12-03 17:16:34 +08:00
    @Leigg 来,握个爪
    qilishasha
        90
    qilishasha  
       2018-12-03 17:18:22 +08:00
    ……反正用到的地方有限,管你是什么语言,会什么我就用什么。
    qsnow6
        91
    qsnow6  
       2018-12-03 17:22:26 +08:00
    @rizon #84 首先,任何语言的性能都是有瓶颈的,得看具体的数值,不存在有一门语言能在单机状态下抗下天猫双 11 的流量。

    其次,python 止于大部分静态语言( C、GO ),确实性能没有他们的单机性能高,这是所有动态语言的劣势,先天的,为了 code 的易用性和效率,牺牲了部分性能。

    python 之所以能在这么多领域开枝散叶,很大程序上利益于他的易用性,随便敲几行代码,一个爬虫就写好了,不管管类型这些静态语言语法的束缚,简直太舒服了。
    xiaqi
        92
    xiaqi  
       2018-12-03 17:25:42 +08:00 via Android
    @rizon 再次超越 C++,话说今年年度编程语言不会是 Python 吧?😂😂
    qsnow6
        93
    qsnow6  
       2018-12-03 17:29:44 +08:00
    性能够用就好,经常看到建博客的,日均 IP 不到 200,却在发愁以后怎么面对千万级的并发,到底该选哪门语言
    est
        94
    est  
       2018-12-03 17:49:07 +08:00
    @rizon 就好比从来没出过城的人考虑买车承载式底盘 4wd 越野好不好的问题。。。
    lazyfighter
        95
    lazyfighter  
       2018-12-03 17:53:48 +08:00
    @qsnow6 没毛病 哈哈
    LawlietZ
        96
    LawlietZ  
       2018-12-03 18:06:48 +08:00
    怎么 404 了
    JCZ2MkKb5S8ZX9pq
        97
    JCZ2MkKb5S8ZX9pq  
       2018-12-03 18:07:28 +08:00
    看了楼上的评论,python 爬虫同时写入 mongo 的瑟瑟发抖……
    est
        98
    est  
       2018-12-03 18:08:08 +08:00
    @locoz 神 api。。。
    est
        99
    est  
       2018-12-03 18:09:29 +08:00
    @qilishasha

    > 为了 code 的易用性和效率,牺牲了部分性能。

    也不能完全这样说。主要是几个 core dev 不接受 给 CPython 提速的补丁。。。

    php7 你看那速度。。ruby3x3 你看那速度。。。就连 perl6 也提速了。


    p 家的,就剩 py 没把提速放到第一核心重点了。
    fiht
        100
    fiht  
       2018-12-03 18:35:23 +08:00
    @xiaqi 首先 Python 性能不如 go 是事实你得要承认... 才能继续这个对话
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1661 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 16:50 · PVG 00:50 · LAX 08:50 · JFK 11:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.