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()
网页特意做了反爬,论坛有类似教程,你可以搜搜看,js进去看看网站有没有字库,分析分析。 SVIP9大会员 发表于 2024-10-3 19:19
网页特意做了反爬,论坛有类似教程,你可以搜搜看,js进去看看网站有没有字库,分析分析。
没有反爬吧.?几千个字,才有可能出现 2、3处乱码的。 对比一下网页数据,就知道是不是网页有反爬 本帖最后由 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) })
})
``` f12看一下错误汉字在浏览器控制台里显示的是不是也是这个字 标准的字体反爬 Tianshan 发表于 2024-10-4 09:09
对比一下网页数据,就知道是不是网页有反爬
在网页中 是正常显示,直接在F12的控制台中获取的,也显示正常 涛之雨 发表于 2024-10-4 11:39
f12看一下错误汉字在浏览器控制台里显示的是不是也是这个字
在网页中 是正常显示,直接在F12的控制台中获取的,也显示正常 kittylang 发表于 2024-10-4 10:53
你是对的,F12 可以看出来并没有反爬
谢谢了,高手{:1_893:}
问题已经解决了。
有两个小问题:
1、querySelector('#htmlContent p')?.textContent
问:中的 问号 是什么意思?我网上没查到
2、取到的 data 是分块的 buffer,由于你的内容存在汉字,很有可能分块会截断这些汉字,你用 str 拼接就出错了,应该拼接 buffer
问:关于 这一块,我想好好了解一下,我应该在网上如何搜索呢 ?
页:
[1]
2