Node.js가 utf-8이 아닌 중국어 웹 페이지를 크롤링하면 잘못된 문자가 나타납니다. 예를 들어 NetEase의 홈페이지 인코딩은 gb2312이고 크롤링할 때 잘못된 문자가 나타납니다.
var 요청 = require('요청')
var url = 'http://www.163.com'
request(url, function (err, res, body) {
console.log(본문)
})
iconv-lite를 사용하여 을 해결할 수 있습니다.
설치
npm 설치 iconv-lite
동시에 웹사이트가 차단되는 것을 방지하기 위해 사용자 에이전트를 수정해 보겠습니다.
var OriginRequest = require('요청')
var iconv = require('iconv-lite')
var 헤더 = {
'사용자 에이전트': 'Mozilla/5.0(Macintosh, Intel Mac OS)
}
함수 요청(url, 콜백) {
var 옵션 = {
url: url,
인코딩: null,
헤더:헤더
}
OriginRequest(옵션, 콜백)
}
request(url, function (err, res, body) {
var html = iconv.decode(body, 'gb2312')
console.log(html)
})
깨진 코드 문제 해결
cherio를 사용하여 HTML 구문 분석
cheerio 는 간단하고 대략적으로 서버 측 jQuery 선택기로 이해될 수 있으며 이를 사용하면 정규 표현식보다 훨씬 직관적입니다
설치
npm install Cherio
request(url, function (err, res, body) {
var html = iconv.decode(body, 'gb2312')
var $ =cherio.load(html)
console.log($('h1').text())
console.log($('h1').html())
})
출력은 다음과 같습니다
넷이즈
넷이즈
그러면 $('h1').html()의 코드 출력이 유니코드로 인코딩되어 NetEase가 되어 문자 처리에 문제가 발생합니다.
cherio .html()의 "깨진" 문제 해결
엔터티 인코딩 변환 기능을 끌 수 있는지 문서를 확인하세요
var $ =cherio.load(html)
로 변경
var $ = cheatio.load(html, {decodeEntities: false})
이상, 전체 코드는 다음과 같습니다.
코드 복사 코드는 다음과 같습니다.
var OriginRequest = require('request')
var Cherio = require('cheerio')
var iconv = require('iconv-lite')
var 헤더 = {
'사용자 에이전트': 'Mozilla/5.0(Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36(KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36'
}
함수 요청(URL, 콜백) {
var 옵션 = {
url: url,
인코딩: null,
헤더:헤더
}
OriginRequest(옵션, 콜백)
}
var url = 'http://www.163.com'
request(url, function (err, res, body) {
var html = iconv.decode(body, 'gb2312')
var $ = cheatio.load(html, {decodeEntities: false})
console.log($('h1').text())
console.log($('h1').html())
})