吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 576|回复: 11
收起左侧

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

[复制链接]
y294945022 发表于 2024-10-3 19:08
本帖最后由 y294945022 于 2024-10-3 19:13 编辑

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

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

1.png
我测试过,再用其它 模块 重新再把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。如下


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

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) })
  })

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
y294945022 + 2 + 1 谢谢@Thanks!

查看全部评分

涛之雨 发表于 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、querySelector('#htmlContent p')?.textContent
问:中的 问号 是什么意思?我网上没查到


2、取到的 data 是分块的 buffer,由于你的内容存在汉字,很有可能分块会截断这些汉字,你用 str 拼接就出错了,应该拼接 buffer
问:关于 这一块,我想好好了解一下,我应该在网上如何搜索呢 ?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 23:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表