推荐学习书目
› 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 · Dec 3, 2018 via Android · 20774 views
    This topic created in 2892 days ago, the information mentioned may be changed or developed.
    Supplement 1  ·  Dec 3, 2018
    原作被你们评论到 404 了,神马情况😳
    107 replies  •  2018-12-04 11:02:50 +08:00
    1  2  
    ❮ ❯
    chanchan
    chanchan
    Dec 3, 2018
    1
    别问问就是 python 牛逼
    aa514758835
    aa514758835
    Dec 3, 2018
    2
    萌新不懂,我也看了这篇文章,我记得 python 好像也可以并行处理吧~
    notreami
    notreami
    Dec 3, 2018
    3
    没加代理,无所谓性能
    zarte
    zarte
    Dec 3, 2018
    4
    首先静态语言应该会好点,但是没专门对比过。
    然后他这个有筛选的爬应该会用到正则或者字符串匹配。
    正则这个对时间影响很大具体语言自带的都不一样。
    lekai63
    lekai63
    Dec 3, 2018
    5
    爬虫瓶颈不是应该在网络这块么?
    感觉预期应该是 go 和 python 差不多速度才对呀。。
    windfarer
    windfarer
    Dec 3, 2018
    6
    python 代码质量不高,同步写数据库,能快就怪了
    gesse
    gesse
    Dec 3, 2018
    7
    爬虫很大时候性能瓶颈在网络

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

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

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

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

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

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


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


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

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

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

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

    也用 scrapy,用 python 写。python 性能好不好不好讲,主要是每次启动 scrapy 太慢了(要生成 pyd 缓存),另外熟悉了 scrapy 后,做一下简单爬虫还是可以的,做复杂的(比如怕动态页面)就很难受了,需要引入其他解析库( scrapy 自带那几个基本不够用),因为是 python 菜鸡,感觉调起爬虫代码来,很是难受。
    marcushbs
    marcushbs
    Dec 3, 2018
    69
    用过 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
    petelin
    Dec 3, 2018
    70
    要是趴下来直接扔到缓存里,或者扔到流里, 用 Python 是没问题.
    关键是, 你的业务就那么简单吗, 不需要解析吗? 单单一个解析是可以把 CPU 跑到 100%的好不好
    revol
    revol
    Dec 3, 2018
    71
    @petelin 密集计算的部分当然用 C 扩展啊,xpath,beautifulsoup 之类的。反正绝对不会比 go 慢
    kakudesu
    kakudesu
    Dec 3, 2018
    72
    别问,问就是 404
    karllynn
    karllynn
    Dec 3, 2018
    73
    404 了,一般爬虫用 Python 肯定够了,Python 性能差你多开几个进程啊…
    tailf
    tailf
    Dec 3, 2018
    74
    才五倍,应该分分钟五十倍啊
    geying
    geying
    Dec 3, 2018
    75
    来看评论
    zhongyiio
    zhongyiio
    Dec 3, 2018 via Android
    77
    @congeec 点赞有人性
    petelin
    petelin
    Dec 3, 2018 via iPhone
    78
    @revol python 天下第一
    XIVN1987
    XIVN1987
    Dec 3, 2018
    79
    @petelin
    数据分析有 numpy、pandas,matplotlib,sklearn 底层都是 C 写的,效率很高
    locoz
    locoz
    Dec 3, 2018
    81
    @locoz #80 原评论 -> 原文评论
    quqiuzhu
    quqiuzhu
    Dec 3, 2018 via Android
    82
    人生苦短,我用 python。说的就是你们天天优化优化,老子自己写得爽就行了,性能不好多加几台机器就是。
    yc8332
    yc8332
    Dec 3, 2018
    83
    性能瓶颈不是应该在数据库吗?
    rizon
    rizon
    Dec 3, 2018
    84
    我不是很懂 python,但是 python 很火是毋庸置疑的,但是有件事我不明白,希望有大佬解答。
    既然 python 是单核,性能有瓶颈,为什么还这么火?尤其是云计算方面,这个单核的问题不是问题吗?

    网上看到的描述


    贴一下 18 年 12 月的排行

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

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

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

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

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

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


    p 家的,就剩 py 没把提速放到第一核心重点了。
    fiht
    fiht
    Dec 3, 2018
    100
    @xiaqi 首先 Python 性能不如 go 是事实你得要承认... 才能继续这个对话
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1356 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 154ms · UTC 22:22 · PVG 06:22 · LAX 14:22 · JFK 17:22
    ♥ Do have faith in what you're doing.