Rumah >hujung hadapan web >tutorial js >Ringkasan masalah data bercelaru yang ditangkap oleh nodejs crawler_node.js
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('') }
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);
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(); } });
--> 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 20102. 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 memintagzip:true
Di atas adalah keseluruhan kandungan artikel ini, saya harap anda semua menyukainya.