y294945022 发表于 2024-10-3 19:08

nodejs 爬取文章,文章中会随机出现个别的单个汉字 乱码 ???

本帖最后由 y294945022 于 2024-10-3 19:13 编辑

nodejs 爬取文章,文章中会随机出现 极个别的单个汉字 乱码:���
每次重新打印输出,乱码的汉字都会不同。这汉字也不敏感呀!

爬的网址是: 笔趣阁-热门的免费小说在线阅读网 (xzmncy.com)
网站编码是:utf-8
nodejs 默认的编码:utf-8 或 utf8


我测试过,再用其它 模块 重新再把utf-8转utf-8 ,或转gbk,或转gb2312 ,要么没有变化,要么是 更乱的乱码

下面是代码:

      
const http=require('https')
const fs=require('fs')
const JSDOM = require("jsdom").JSDOM
var iconv = require("iconv-lite") //内部模块,不用安装


let req=http.request({
'hostname':'www.xzmncy.com',
'path':'/list/48396/22308472.html'
},res=>{
    var arr=[]
    var str=''
    res.on('data',buf=>{
                        arr.push(buf)
                        str+=buf
                  });
    res.on('end',()=>{   
      console.log(111,typeof str)
      let DOM = new JSDOM(str)
      let document=DOM.window.document
   console.log(222)

   //测试能正常输出 小说正文 , 但有极个别的 乱码���
      console.log(document.querySelector('#htmlContent p').innerHTML.replace("<br>", "\n"))
      
      
//在fc里即便加上utf8编码 或 utf-8,依然如上面一样有极个别的 乱码。
// fs.writeFile(`${document.querySelector('h1').innerHTML}.txt`,sc,()=>{console.log(666) })

      
console.log(333)
});
})
req.end()
      

SVIP9大会员 发表于 2024-10-3 19:19

网页特意做了反爬,论坛有类似教程,你可以搜搜看,js进去看看网站有没有字库,分析分析。

y294945022 发表于 2024-10-3 19:47

SVIP9大会员 发表于 2024-10-3 19:19
网页特意做了反爬,论坛有类似教程,你可以搜搜看,js进去看看网站有没有字库,分析分析。

没有反爬吧.?几千个字,才有可能出现 2、3处乱码的。

Tianshan 发表于 2024-10-4 09:09

对比一下网页数据,就知道是不是网页有反爬

kittylang 发表于 2024-10-4 10:53

本帖最后由 kittylang 于 2024-10-4 14:19 编辑

你是对的,F12 可以看出来并没有反爬


iconv-lite 不是第三方吗,怎么是内部模块
不建议使用 https 模块请求,特别是在不清楚 https 请求后应该怎么做的情况下。你获取到的 data 是分块的 buffer,由于你的内容存在汉字,很有可能分块会截断这些汉字,你用 str 拼接就出错了,应该拼接 buffer。如下


```javascript
const https = require('https')
const fs = require('fs')
const JSDOM = require("jsdom").JSDOM

const req = https.request({
'hostname': 'www.xzmncy.com',
'path': '/list/48396/22308472.html'
}, res => {

const buffers = []

res.on('data', buf => buffers.push(buf));


res.on('end', () => {
    const htmlString = Buffer.concat(buffers).toString('utf-8')
    const document = new JSDOM(htmlString).window.document

    //测试能正常输出 小说正文 , 但有极个别的 乱码���
    console.log(document.querySelector('#htmlContent p')?.textContent)

    //在fc里即便加上utf8编码 或 utf-8,依然如上面一样有极个别的 乱码。
    // fs.writeFile(${document.querySelector('h1').innerHTML}.txt,sc,()=>{console.log(666) })

});
})

req.end()

```


这边推荐使用第三方库替代 https, ,例如基于http/https 的 axios,got 等

或者使用更加现代化的 fetch api

```javascript
const fs = require('fs')
const JSDOM = require("jsdom").JSDOM

fetch("https://www.xzmncy.com/list/48396/22308472.html")
.then(res => res.text())
.then(htmlStr => {
    const document = new JSDOM(htmlStr).window.document

    //测试能正常输出 小说正文 , 但有极个别的 乱码
    console.log(document.querySelector('#htmlContent p')?.textContent)

    //在fc里即便加上utf8编码 或 utf-8,依然如上面一样有极个别的 乱码。
    // fs.writeFile(${document.querySelector('h1').innerHTML}.txt,sc,()=>{console.log(666) })
})
```

涛之雨 发表于 2024-10-4 11:39

f12看一下错误汉字在浏览器控制台里显示的是不是也是这个字

漁滒 发表于 2024-10-4 12:07

标准的字体反爬

y294945022 发表于 2024-10-4 16:31

Tianshan 发表于 2024-10-4 09:09
对比一下网页数据,就知道是不是网页有反爬

在网页中 是正常显示,直接在F12的控制台中获取的,也显示正常

y294945022 发表于 2024-10-4 16:32

涛之雨 发表于 2024-10-4 11:39
f12看一下错误汉字在浏览器控制台里显示的是不是也是这个字

在网页中 是正常显示,直接在F12的控制台中获取的,也显示正常

y294945022 发表于 2024-10-4 17:19

kittylang 发表于 2024-10-4 10:53
你是对的,F12 可以看出来并没有反爬




谢谢了,高手{:1_893:}

问题已经解决了。

有两个小问题:

1、querySelector('#htmlContent p')?.textContent
问:中的 问号 是什么意思?我网上没查到


2、取到的 data 是分块的 buffer,由于你的内容存在汉字,很有可能分块会截断这些汉字,你用 str 拼接就出错了,应该拼接 buffer
问:关于 这一块,我想好好了解一下,我应该在网上如何搜索呢 ?
页: [1] 2
查看完整版本: nodejs 爬取文章,文章中会随机出现个别的单个汉字 乱码 ???