请问最佳的爬虫语言是什么

2022-09-15 02:27:22 +08:00
 dfgddgf

如果需要多线程(多端口)下载网页,保证下载速度和网页解析速度和开发速度的在合理的范围之内,哪一款语言是最优的。

golang 并发使用最强的,在正则匹配速度,爬虫软件包的丰富程度上和 perl 、python 还有不小差距。

pyhon 的异步下载引擎貌似使用不是特别方便(个人对 pyhon 不熟,勿喷)

php 有 https://github.com/walkor/Workerman 这样的高性能网页服务器框架,有没有易用的爬虫框架?

node.js 异步下载貌似很强大,有没有大型爬虫项目使用 node.js 做爬虫,同时网页解析,文件处理,unicode 转码全部使用这个语言的爬虫案例?

perl 有一个 mojo::useragent 配合 libEV ,并发能力很强大。perl 在文本正则处理、文本编码转换,网页 dom 解析都有成熟的处理方案和软件包,这个是目前作者最喜欢的平台。

c# 据说是最强大爬虫平台,没接触多少。

java 平台性能很强劲,软件包也丰富,笔者知之甚少。

rust 貌似爬虫全套组件都有,而且比较新。貌似可以做出极致压榨硬件性能的方案。

11559 次点击
所在节点    程序员
67 条回复
shuimugan
2022-09-15 04:30:43 +08:00
不一定要 all in one ,任务调度、发送请求、解析内容、数据入库等可以用微服务的理念拆分开来,这样也方便扩展和重构,这玩意没有万金油的。
从事件驱动的玩法上看,在异步里面做 cpu 复杂度高的计算都会降低时间循环的效率,所以解析复杂度高的东西都是拆分出去的,避免阻塞发送请求的代码。

如果你观察过云服务商的 serverless ,你会发现它们那些通过队列事件触发的函数本质上也是一个 http 函数,因为可以和 api 网关 /k8s 结合,在更新版本时候可以把新流量导到新版本上,老版本等原有的 http 连接都关闭完就销毁。

我目前在用 Node.js 写的爬虫也是这么设计的,目前是基于 NestJS 这个 web 框架做爬虫,结合 nsq 做任务调度,每个外发请求都是用 http 接口来触发,用 traefik 做网关和灰度切换,再结合 k8s 和部署和健康检查做滚动更新。

目前用的到库:
jsonata:用来解析复杂 json ,降低代码复杂度
cheerio:服务端的 jquery ,在 python 有 BeautifulSoup ,在 java 有 jsoup ,也是类似的功能
cld:语言检测,在 python 里有 langdetect

不过也准备重构了,目前碰到的问题是任务堆积多了之后内存涨得快回落得慢,说白了就是 gc 回收不及时,打算先用 C# 把调度和发送请求的部分重构一下,再不行就换 rust ,解析和入库还是用回 nodejs 。
dfgddgf
2022-09-15 04:44:57 +08:00
@shuimugan 这个思路新奇,复杂的问题拆解为更为简单的基础问题。

这是 linux shell 编程的基本思路。

您的观点可以得到验证。在异步的环境里做网页解析,确实占用率比较高。大概异步使用高精度的时间作为时间的区分标准,不停地查询 io 状态,这个比较耗费资源。

按照这样的逻辑推断。应该把异步交给一个专门的组件(软件)来搞,而同步的工作、大量耗费 cpu 资源的用队伍列表的方式使用常规的软件来搞。

学习了。这种专业的问题,只有资深专家,做过大型项目的前辈才能了解其中的诀窍。
LeeReamond
2022-09-15 04:51:47 +08:00
爬虫没有什么特定一个阶段兴起快速抢占市场的问题,所以基本上市占率比较高的就是好用的。
另外 python 异步挺简单的,确实只是你不了解而已
laolaowang
2022-09-15 08:46:59 +08:00
golang
focuxin
2022-09-15 08:52:17 +08:00
Nodejs ,DOM 和 JavaScript 的优势
ciming
2022-09-15 08:53:40 +08:00
前几天好看到一个 nodejs 的爬虫框架
https://crawlee.dev/
bl4ckoooooH4t
2022-09-15 09:13:30 +08:00
我这的做法是把要抓取的 url 放 redis ,Python 多线程从 redis 取任务爬取,结果通过 kafka 给下游解析。 可以分布式部署。目前 3 台机器,带宽在 50MB~100MB/s 左右,每日爬 200w url 左右。
MEIerer
2022-09-15 09:14:32 +08:00
Python 爬虫大概是最简单的
xz410236056
2022-09-15 09:27:05 +08:00
虽然我是喜欢 golang 的。但是 Python 的库是真他妈强,你数据搞下来不得处理吗,Python 数据处理的库功能是真强。

“pyhon 的异步下载引擎貌似使用不是特别方便”
Python 的逻辑是有需要你开多个进程,同进程内用协程,多线程属于骗自己。
encro
2022-09-15 09:28:52 +08:00
encro
2022-09-15 09:38:15 +08:00
当然 Scrapy 也许仍然是最简单容易的分布式爬虫。

一般的爬虫需要异步吗?
答案是重点要考虑架构异步,而不是程序上的异步。
就是说要考虑分布式任务调度 /并发防重爬 /广度有限 OR 深度优先这样的问题,而不是爬虫代码里面多写几个 await 。
ragnaroks
2022-09-15 09:38:45 +08:00
任何可以调用 chromium 的语言都是最佳
lmshl
2022-09-15 09:41:28 +08:00
不考虑生态的话我觉得是 NodeJS ,7-8 年前我就开始用它写爬虫了
考虑生态的话应该是 Python
tulongtou
2022-09-15 09:45:27 +08:00
自己熟练的才是最佳的
shenjinpeng
2022-09-15 10:01:16 +08:00
十多年前网络小说最火那会, 满大街 PHP 盗版小说网站, 小说内容全是爬虫采集的,
sunwei0325
2022-09-15 10:02:59 +08:00
爬的好的都在里面踩缝纫机呢吧
zzzkkk
2022-09-15 10:06:09 +08:00
@ragnaroks
速度太慢了
一个 chromium 实例最多并发 10 个请求
zbatman
2022-09-15 10:10:30 +08:00
有请八方辩手入场
v2yllhwa
2022-09-15 10:13:29 +08:00
@xz410236056 python io 时释放 gil 锁,多线程爬虫也还好吧
kaiger
2022-09-15 10:14:04 +08:00
scrapy 我感觉挺简单的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/880119

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX