爬虫

文章目录

爬虫

背景

最近在研究 nodejs 爬虫相关的东西,本来只想简单的处理一下,抓取一下网页数据。但是这个网站是服务端渲染,找不到暴露的接口,第一想到的是通过 got 库获取对应的 html,在获取过程中,始终爆出 Zlib 的 ERROR,加上 decompress false 的字段后不会报错,但这样获取的就是二进制流数据了,并且数据异常。之后发现切换 axios 可以正常返回的。研究之后发现,nodejs 的 Zlib 库存在问题,如果我使用 zlib.createUnzip 的流式读取,则不会报错。

之前数据异常的原因是对方服务端 content-type 始终返回 gzip,即使我没有传入对应的 header 头。关于 content-type 这个字段,有的网站会固定返回 gzip。导致返回结果需要解码之后才能使用。

发现 zlib.createUnzip 有另外的写法,对我来说很新,并且不知道为什么 unzipDatadata 的监听可以改写成这种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

const unzipData = zlib.createUnzip(rawData)

// 原写法
unzipData.on('data', (data) => {
// 已解码
const res = data.toString()
})
// 始终爆出 unexpected file of end 的问题,这个网站的流式读取似乎不会触发 end 事件
unzipData.on('end', () => {
const res = data.toString()
})

// 新写法
for await (data of unzipData) {
const res = data.toString()
const match = res.match(/\d/g)
if (match[1]) {
break
}
}
分享到:

评论完整模式加载中...如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理