Python 爬虫改成 Go 语言,性能真的能提高 5 倍吗?
https://zhuanlan.zhihu.com/p/48254385
Python 爬虫改成 Go 语言,性能真的能提高 5 倍吗?
帖子回复:
从Python迁移到Go,性能提升5倍是可能的,但并非绝对。这主要取决于爬虫的具体场景。
核心差异: Python(如Scrapy)开发快,但作为解释型语言,其并发模型(多线程受GIL限制)在处理大量I/O密集型网络请求时,效率有天花板。Go是编译型语言,原生支持的goroutine并发模型(轻量级线程)在处理成千上万个并发网络请求时,资源开销极小,这是其最大优势。
关键场景分析:
- 高并发I/O密集型爬虫:如果你的爬虫需要同时维持数百甚至数千个网络连接(例如,抓取大量独立页面、API),Go的goroutine相比Python的asyncio或多线程方案,通常能带来数倍到数十倍的性能提升(更高的QPS)。这时,“提升5倍”很常见。
- 简单或低频爬取:如果只是定时抓取几个页面,Python完全够用,改用Go带来的性能收益微乎其微,开发效率反而降低。
- 复杂数据处理:如果爬虫包含大量下载后的文本解析、清洗、计算(CPU密集型任务),Go的静态编译执行速度更快,但提升比例可能不如I/O场景显著。
简单来说:Go在需要高并发的爬虫项目中优势巨大,提升5倍很现实;对于简单任务,则可能杀鸡用牛刀。
萌新不懂,我也看了这篇文章,我记得 python 好像也可以并行处理吧~
没加代理,无所谓性能
首先静态语言应该会好点,但是没专门对比过。
然后他这个有筛选的爬应该会用到正则或者字符串匹配。
正则这个对时间影响很大具体语言自带的都不一样。
爬虫瓶颈不是应该在网络这块么?
感觉预期应该是 go 和 python 差不多速度才对呀。。
python 代码质量不高,同步写数据库,能快就怪了
爬虫很大时候性能瓶颈在网络
就像如果不换固态硬盘,cpu 在一定范围内, 整体性能是差不多的。
别问,问就是人生苦短,我用 python
我曾经也以为爬虫的瓶颈在 io,直到我用了 scrapy,CPU 常年某个核心 100%。单核异步,没法优化。
python 单核异步一条道走到黑,gvr 老爷子们以为大家都只写 web 后端呢? python 要死在这条道上
他数据库存储是同步的呀…说实话 我还没见过 scrapy 存数据库 这个步骤是写在 spider 里的…
爬虫的性能…难道不是看代理速度么?
2008 年到现在,也就 asyncio 亮眼点,JIT、GIL 毫无改进,一点诚意都没有(不要跟我说 pypy,cffi 烦死人)。人家 ruby2.6 都有官方 jit 了。
在知乎的评论不堪入目
瓶颈在被爬取网站的反扒机制,你爬虫性能再好都没屌用,甚至适得其反。
适得其反 精髓了
网络 io 觉得 python 并不虚
爬的越快,封的越快
go 抓取内容,python 解析入库。
别问问就是 python 不行,跟人是不是彩笔,是不是用的不对没有关系
各位还是看了代码再发表评论吧,Python 爬虫竟然是一条一条数据同步保存到 MySQL。
https://github.com/lidingke/go_python_crawler_benchmark/blob/master/py_get.py#L20-L31
另外,把 mysql 换成 mysqlclient 速度又能快不少。
现在有些人会写个 print("hello world") 就觉得自己掌握了 Python,自己不会用还怪语言慢,怪就算了,还到处张扬自己的愚蠢,写这文章的人是天生缺关注想要博关注?这不是在搞笑吗…代码都经不起人 review 说个 jb。
这个对比,我也是服气的。
一个框架, 一个手写调度,起码得保证代码的基本逻辑一致才有比较的意义吧?
看前面,居然还有 Python 同步保存到数据库这种操作。
多说一句,Python 是性能差,那也得看场景啊,像(大多数)爬虫都是 I/O 密集型的任务,Python 毫无疑问可以胜任。
这对比好蛋疼…玛莎拉蒂能跑三百,我有必要买吗?
单核带锁用 MySQL 确实是巨大黑点。
但是话说回来,如果你用很 advanced 的技术优化了 Python 程序(我倒也是想到了很多方案,不过没做过),那么 Python 唯一一条远好于 Go 的优势、写起来容易,不是不成立了吗?就算你作为资深 Python 程序员能够优化到这种程度,但是那也只是和 Go 平起平坐而已吧。。。
利益相关:不会 Go,Python 老手吧。。
… 不知道说啥好 这种 io 任务 时间大多浪费在 io 等待上 谈什么语言性能 在搞笑吧
难道你们都没看到源码里 爬一条就对数据库进行 IO 的神操作吗?
最重要的问题是:
爬虫的最大痛点不是速度,而是突破反爬。
其次的痛点,50%以上的爬虫任务是一次性的。
另外不断尝试方案和调试是爬虫开发花费的主要精力。
最后是爬虫相关的库和生态丰富程度是必然要考虑的。
从这些点上来说作为不单是 Go,所有静态语言的来写爬虫是相对比较难受的。动态语言 Python 几乎就是爬虫的同义词,这不是偶然的。
把 scrapy 按在地上揍了一顿。不过瘾,怎么办?把 python 放进标题里。
6666666
才快 5 倍,算不上吊打。。。也不够唬人,至少提高个几十倍的吧。
说实在的,感觉这种评价参考意义并不大,scrapy 是一个大的爬虫框架,文中的 go 应用算是一个定向爬虫,功能复杂性没法比。如果不基于 scrapy,和 go 一样重写一个定向抓取的应用,相互比对,才有意义吧。
#27 过早的优化是万恶之源。如果项目一开始就对性能(实时性)有非常高的要求,那么 Python 确实不是首选。如果一开始对性能没有很高的要求,选择 Python 无疑可以提高开发速度,后期遇到性能问题,也是可以通过 C 扩展等其它手段去优化。
文章作者看到 11 分 和 45 秒 这种级别的差异就没有怀疑一下自己的代码写法吗?
何况这又不是 CPU 密集型的
IO 密集型 你用 c 写 提高幅度也不大
不存在的,真的写起来的时候这种简单网站的简单需求根本不需要用框架,requests+多进程或者 asyncio+aiohttp 怼就完事了,整个代码写下来最多就十几行。
跑起来之后大部分时间都在等待网络 io,这需求又没有要对数据做预处理,速度根本差不了多少,所以开发时间和爬的时间加起来还是 Python 比较快😂😂
当年有个人对比了 C 和 Python 写的空循环性能,得到了比这个厉害的结论。
打个比喻,约等于用 py 写睡眠排序,跟用 go 写快排,然后说吊打…
这种人也算程序员系列?
CPU 密集型的,要吊打 MKL 还得颇费一番功夫
( C++ 巨牛除外)
一天到晚研究鄙视链的人,水平真的。。
话说爬虫主要看对方的性能吧,你性能再高,对方一爬就挂,哈哈哈
python 确实慢这是客观存在的,执行效率上与 golang 存在明显的差距。
只将爬虫当成是 IO 密集型的,也多半是小白
我都直接调用 MKL
刚开始用写爬虫不懂事儿,挂过几个小网站。后来有人性了
IO 密集型的,扯再多也没鬼用;
scrapy 每分钟单机单核超过 3000 请求 /分钟,这速度平时做定向爬虫根本都用不上。分分钟被服务器拉黑,不拉黑也抓挂了。
如果还有杠精在这扯,说明平时接触爬虫不够深入。
文章看不了了?没有知识的荒原
https://github.com/lidingke/go_python_crawler_benchmark/blob/master/py_get.py ,看到了熟悉的 lock,也不知道这个该怎么说了。
#49 你们不要这样,作者估计受不了删文章了吧。
我刚发一条打脸评论,结果。。。
结果来到了荒原 23333
一个编译型静态类型的语言 每天 就知道同一个解释型动态语言 比性能
脸都放哪里去了
是的,go 是最吊的,吊打 Python
这不算啥,我写一个代理工具,在垃圾小鸡上跑,cpu 负载 60%左右,加密模块用 c “翻译”下,cpu 负载降到 2-3%,算下来效率提高了 20-30 倍
做爬虫,python 足够了,换再快的语言也没用,懂的人自然懂。
原文 404 了
当年,说 php 是世界最好的论坛炸开了锅。如今,说 Go 爬虫性能吊打 Python,论坛炸开了锅。
文章的作者应该已经在和妹子约会了吧?😂😂😂
实习的时候写了将近一年的爬虫,大概有这么一点感悟。
在做定向爬虫到时候,比如说抓一抓机票网站的价格,需要突破一些反爬虫机制,或者需要使用无头浏览器做渲染。这种场景下语言不存在性能瓶颈,瓶颈在于对方的服务器压力和反爬虫机制。这种场景适合使用 Python。
但是在做广度爬虫的时候,Python 就不适用了,就像楼上讲的 scrapy 单核跑满的问题。在这个场景下使用 Python 会带来很多的问题,比如说为了解决只有单核跑完的问题就需要起多个 scrapy 实例,为了让这多个 scrapy 实例协同工作就需要引入一个消息队列,整个系统的耦合度就复杂了不少。用 golang 来做的话就方便很多。几个爬行时的 goroutine 和几个 pipeline 的 goroutine,整个系统就能稳定地运转起来。这是 Python 所不能达到的。
抓的快了不是等反么。。
老板不涨工资的话,能用 py 就用 py
不用 scrapy 就好了,python 写的 event loop 也能轻松做到 1w/s 请求。
觉得 python I/O 不行是水平问题。
爬虫最困难的不是研究反爬机制吗,io 我觉得不是最重要的因素
并发有什么了不起的 Python 不支持?
爬虫玩过一段时间,也在有几个稳定爬取的地方。
也用 scrapy,用 python 写。python 性能好不好不好讲,主要是每次启动 scrapy 太慢了(要生成 pyd 缓存),另外熟悉了 scrapy 后,做一下简单爬虫还是可以的,做复杂的(比如怕动态页面)就很难受了,需要引入其他解析库( scrapy 自带那几个基本不够用),因为是 python 菜鸡,感觉调起爬虫代码来,很是难受。
用过 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.和人肉服务的对接。至于单点性能,基本不算问题。
要是趴下来直接扔到缓存里,或者扔到流里, 用 Python 是没问题.
关键是, 你的业务就那么简单吗, 不需要解析吗? 单单一个解析是可以把 CPU 跑到 100%的好不好
密集计算的部分当然用 C 扩展啊,xpath,beautifulsoup 之类的。反正绝对不会比 go 慢
别问,问就是 404
404 了,一般爬虫用 Python 肯定够了,Python 性能差你多开几个进程啊…
才五倍,应该分分钟五十倍啊
点赞有人性
python 天下第一
数据分析有 numpy、pandas,matplotlib,sklearn 底层都是 C 写的,效率很高
#80 原评论 -> 原文评论
人生苦短,我用 python。说的就是你们天天优化优化,老子自己写得爽就行了,性能不好多加几台机器就是。
性能瓶颈不是应该在数据库吗?
我不是很懂 python,但是 python 很火是毋庸置疑的,但是有件事我不明白,希望有大佬解答。
既然 python 是单核,性能有瓶颈,为什么还这么火?尤其是云计算方面,这个单核的问题不是问题吗?
网上看到的描述
贴一下 18 年 12 月的排行
python 可以多进程,多核也能利用起来。只是比 java、go 这些比起来写起来有点蠢。
cpu 密集型,numpy 和 c++不相上下,都是调 mkl 的库,没什么区别。
那些老说 python 性能渣的,你倒是用 go 写个比 python 的 numpy 性能更高的库出来呀?
🐶🐶🐶
十分同意
来,握个爪
……反正用到的地方有限,管你是什么语言,会什么我就用什么。
#84 首先,任何语言的性能都是有瓶颈的,得看具体的数值,不存在有一门语言能在单机状态下抗下天猫双 11 的流量。
其次,python 止于大部分静态语言( C、GO ),确实性能没有他们的单机性能高,这是所有动态语言的劣势,先天的,为了 code 的易用性和效率,牺牲了部分性能。
python 之所以能在这么多领域开枝散叶,很大程序上利益于他的易用性,随便敲几行代码,一个爬虫就写好了,不管管类型这些静态语言语法的束缚,简直太舒服了。
再次超越 C++,话说今年年度编程语言不会是 Python 吧?😂😂
性能够用就好,经常看到建博客的,日均 IP 不到 200,却在发愁以后怎么面对千万级的并发,到底该选哪门语言
就好比从来没出过城的人考虑买车承载式底盘 4wd 越野好不好的问题。。。
没毛病 哈哈
怎么 404 了
看了楼上的评论,python 爬虫同时写入 mongo 的瑟瑟发抖……
神 api。。。
> 为了 code 的易用性和效率,牺牲了部分性能。
也不能完全这样说。主要是几个 core dev 不接受 给 CPython 提速的补丁。。。
php7 你看那速度。。ruby3x3 你看那速度。。。就连 perl6 也提速了。
p 家的,就剩 py 没把提速放到第一核心重点了。
首先 Python 性能不如 go 是事实你得要承认… 才能继续这个对话

