Ringkasan masalah data bercelaru yang ditangkap oleh nodejs crawler_node.js

WBOY
Lepaskan: 2016-05-16 15:51:42
asal
2268 orang telah melayarinya

1. Pemprosesan halaman bukan UTF-8.

1. Latar belakang

pengekodan windows-1251

Contohnya, tapak web Rusia: https://vk.com/cciinniikk

Memalukan untuk mencari pengekodan ini

Apa yang paling kami bincangkan di sini ialah isu pengekodan Windows-1251 (cp1251) dan pengekodan utf-8 Lain-lain seperti gbk tidak akan diambil kira~

2. Penyelesaian

1.

Gunakan penukaran pengekodan asli js

Tetapi saya belum jumpa jalan lagi..

Jika utf-8 ke window-1251 tidak mengapahttp://stackoverflow.com/questions/2696481/encoding-conversation-utf-8-to-1251-in-javascript

var DMap = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101, 102: 102, 103: 103, 104: 104, 105: 105, 106: 106, 107: 107, 108: 108, 109: 109, 110: 110, 111: 111, 112: 112, 113: 113, 114: 114, 115: 115, 116: 116, 117: 117, 118: 118, 119: 119, 120: 120, 121: 121, 122: 122, 123: 123, 124: 124, 125: 125, 126: 126, 127: 127, 1027: 129, 8225: 135, 1046: 198, 8222: 132, 1047: 199, 1168: 165, 1048: 200, 1113: 154, 1049: 201, 1045: 197, 1050: 202, 1028: 170, 160: 160, 1040: 192, 1051: 203, 164: 164, 166: 166, 167: 167, 169: 169, 171: 171, 172: 172, 173: 173, 174: 174, 1053: 205, 176: 176, 177: 177, 1114: 156, 181: 181, 182: 182, 183: 183, 8221: 148, 187: 187, 1029: 189, 1056: 208, 1057: 209, 1058: 210, 8364: 136, 1112: 188, 1115: 158, 1059: 211, 1060: 212, 1030: 178, 1061: 213, 1062: 214, 1063: 215, 1116: 157, 1064: 216, 1065: 217, 1031: 175, 1066: 218, 1067: 219, 1068: 220, 1069: 221, 1070: 222, 1032: 163, 8226: 149, 1071: 223, 1072: 224, 8482: 153, 1073: 225, 8240: 137, 1118: 162, 1074: 226, 1110: 179, 8230: 133, 1075: 227, 1033: 138, 1076: 228, 1077: 229, 8211: 150, 1078: 230, 1119: 159, 1079: 231, 1042: 194, 1080: 232, 1034: 140, 1025: 168, 1081: 233, 1082: 234, 8212: 151, 1083: 235, 1169: 180, 1084: 236, 1052: 204, 1085: 237, 1035: 142, 1086: 238, 1087: 239, 1088: 240, 1089: 241, 1090: 242, 1036: 141, 1041: 193, 1091: 243, 1092: 244, 8224: 134, 1093: 245, 8470: 185, 1094: 246, 1054: 206, 1095: 247, 1096: 248, 8249: 139, 1097: 249, 1098: 250, 1044: 196, 1099: 251, 1111: 191, 1055: 207, 1100: 252, 1038: 161, 8220: 147, 1101: 253, 8250: 155, 1102: 254, 8216: 145, 1103: 255, 1043: 195, 1105: 184, 1039: 143, 1026: 128, 1106: 144, 8218: 130, 1107: 131, 8217: 146, 1108: 186, 1109: 190}

function UnicodeToWin1251(s) {
  var L = []
  for (var i=0; i<s.length; i++) {
    var ord = s.charCodeAt(i)
    if (!(ord in DMap))
      throw "Character "+s.charAt(i)+" isn't supported by win1251!"
    L.push(String.fromCharCode(DMap[ord]))
  }
  return L.join('')
}
Salin selepas log masuk

Nah, ini idea yang bagus sebenarnya yang disimpan oleh Dmap ialah hubungan pemetaan antara pengekodan tetingkap-1251 dan unicode

Jadi saya hanya merancang untuk melakukannya sebaliknya

Tetapi sebaliknya, saya mendapati bahawa kaedah charCodeAt hanya sah untuk unicode. Bagaimana untuk mencungkil segmen kod pengekodan lain? Kerana saya menggunakan nodejs, saya mempertimbangkan untuk menggunakan modul yang sepadan

2.

Untuk arahan tentang memasang dan menggunakan modul nodejs iconv-lite, lihat https://www.npmjs.com/package/iconv-lite

Mengikut kaedah penggunaan, ia harus digunakan dengan cara yang sama

var iconv = require('iconv-lite');
var Buffer = require('buffer').Buffer;
// Convert from an encoded windows-1251 to utf-8
//这个str1应该是http.get 或request等请求返回的数据
//请求的时候要带参数,不然就会出错
//除了基本的参数之外 要注意记得使用 encoding: 'binary'这个参数
//比如
str1 = 'ценности ни в ';
//把获取到的数据 转换成Buffer,记得格式使用 binary
//binary在各编码直接穿梭无阻~
var buf = new Buffer(str1,'binary');
var str2 = iconv.decode(buf, 'win1251');
//str2就被转换出来了,默认是转成 Unicode格式,估计这也是iconv-lite的初衷吧
console.log(str2);
Salin selepas log masuk

3.

Arahan untuk memasang dan menggunakan iconv modul nodejs tersedia di https://github.com/bnoordhuis/node-iconv

(Malah, intipatinya ialah memasang nod-gyp. Saya tidak membaca arahan rasmi dengan teliti sebelum ini)

Secara amnya, selepas penggunaan mudah, kod itu masih bercelaru Formatnya ialah: пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїпїЗЗпїЗ Ѕ

http://stackoverflow.com/questions/8693400/nodejs-convertinf-from-windows-1251-to-utf-8

Penyelesaian adalah untuk menukar data baca kepada pengekodan binari: binari (pengekodan lalai ialah utf-8)

request({ 
  uri: website_url,
  method: 'GET',
  encoding: 'binary'
}, function (error, response, body) {
    body = new Buffer(body, 'binary');
    conv = new iconv.Iconv('WINDOWS-1251', 'utf8');
    body = conv.convert(body).toString();
  }
});
Salin selepas log masuk

--> Selain itu, penggunaan iconv memerlukan beberapa kebergantungan alam sekitar Lihat arahan rasmi: https://github.com/TooTallNate/node-gyp

Jadi:

Pertama, anda memerlukan sokongan python versi yang sepadan (seperti 2.7);

Kedua, ia memerlukan sokongan alat penyusunan (kebanyakan ralat berlaku di bawah Windows)

Ralat serupa dengan ini

Nod, jika tiada versi khusus atau lebih tinggi, alat penyusunan vs2005 digunakan secara lalai (jadi penyelesaian kepada mesej ralat secara amnya adalah mengikuti vs2005 dan rangka kerja sdk2.0)

Penyelesaian masalah:

1. Pasang visual studio 2010

2. Tentukan versi alat kompilasi (jika ia vs2012, ia adalah 2012)

(Kadangkala ia akan ditentukan secara automatik, jadi arahan ini tidak semestinya diperlukan set konfigurasi npm msvs_version 2010 --global)

3 Jika ia masih menggesa bahawa sdk rangka kerja tidak ditemui, anda boleh menambah laluan pemasangannya pada laluan pembolehubah persekitaran sistem

(2010 sepadan dengan versi sdk4.0, serupa dengan 2008 sdj3.5 2012 sdk4.5?)

Perkara lain yang perlu diingat ialah pembolehubah persekitaran hanya akan membaca yang pertama!

Sebagai contoh, jika anda telah menetapkan laluan SDK2.0 kepada pembolehubah persekitaran sistem sebelum ini, maka apabila anda menambah dan menetapkan laluan SDK4.0 sekarang, hanya yang pertama akan berfungsi

Jadi:

Atau padamkan yang sebelumnya

Atau letakkan laluan yang anda mahu tambahkan di hadapannya

2. Pemprosesan halaman Gzip

Kadang-kadang kami mendapati bahawa penyemak imbas adalah perkara biasa untuk mengakses halaman, tetapi permintaan yang disimulasikan menjadi kacau apabila ia kembali. Anda boleh menyemak maklumat Respons yang diminta oleh penyemak imbas Jika terdapat Pengekodan Kandungan: gzip berkemungkinan besar kerana halaman dimampatkan oleh gzip , maka anda perlu menambah parameter berikut apabila meminta

gzip:true

Di atas adalah keseluruhan kandungan artikel ini, saya harap anda semua menyukainya.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!