終本案件:http://zxgk.court.gov.cn/zhongben/new_index.html 綜合執行人:http://zxgk.court.gov.cn/zhixing/new_index.html 裁判文書:http://wenshu.court.gov.cn 終本案件和執行人爬取 ...
終本案件:http://zxgk.court.gov.cn/zhongben/new_index.html
綜合執行人:http://zxgk.court.gov.cn/zhixing/new_index.html
裁判文書:http://wenshu.court.gov.cn
終本案件和執行人爬取還是挺簡單的,沒有涉及到加密,驗證碼也可以直接識別過掉,主要是網站不是很穩定,經常出現502,504,500錯誤,涉及到一些失敗重連機制。IP限制我們用的是撥號來解決的,客戶對於速度的要求不是很
高,考慮到客戶預算有限沒有上優質HTTP代理。
本來開始是用的.net4.5的httpclient,但是在實際的抓取過程當中發現這個類庫有BUG,釋放SOCKET的時間需要很長。後改用從4.0開始就一直在使用的RestSharp來做訪問,問題得到解決,網頁解析類庫採用的是anglesharp,解
析速度還是不錯的。由於網站經常出現訪問錯誤,已經有些數據查詢會直接讓網站報500,所以採用了Polly來做超時和重試。
外包項目,直接做的類庫給他們調用沒有寫界面,前兩個沒什麼好說的,主要來說說文書爬蟲。
文書獲取列表頁的時候需要提交三個參數:GUID\Code\VL5X ,GUID是隨機數生成的,我們可以直接使用
Guid.NewGuid().ToString("D");
生成GUID就可以了,Code是訪問網頁返回的,帶上GUID訪問返回明文的Code,訪問網址:/ValiCode/GetCode
private string GetCode(RestClient client) { cc: PageId = Guid.NewGuid().ToString("D"); var rsp = "/ValiCode/GetCode".PostAsResponse(client, "guid=" + PageId); if (!ProcessResponse(rsp, client)) { goto cc; } return rsp.Content; }
ProcessResponse是做的訪問結果判斷是否需要過驗證碼或者撥號
private bool ProcessResponse(IRestResponse rsp, RestClient client) { if (rsp.StatusCode == HttpStatusCode.BadGateway || rsp.StatusCode == HttpStatusCode.GatewayTimeout) { Reconnection(DialerInfo); return false; } if (rsp.Content.Contains("網站當前訪問量較大,請輸入驗證碼後繼續訪問")) { Reconnection(DialerInfo); var buffer = client.Execute(new RestRequest(string.Format("waf_captcha/?{0}", DateTime.Now.Ticks))).RawBytes; var captcha = Helpers.ProcessImage(buffer, buffer.Length); rsp.Content = client.Execute(new RestRequest("waf_verify.htm?captcha=" + captcha)).Content; return false; } foreach (var s in ProhibitKey) { if (rsp.Content.Contains(s)) { Reconnection(DialerInfo); return false; } } return true; }
目前發現的幾個關鍵字:
//被封IP時候出現的關鍵詞 public static string[] ProhibitKey = new[] { "網站當前訪問量較大,請輸入驗證碼後繼續訪問", "請開啟JavaScript並刷新該頁", "源站出現問題,暫時無法訪問", };
VL5X是根據Cookie來計算的值,Cookie是帶上guid\code訪問得到的:
private string GetCookie(string name, string code, RestClient client) { cc: var rsp = string.Format("/list/list/?sorttype=1&number={0}&guid={1}&conditions=searchWord+QWJS+++{2}", code, PageId, "全文檢索:" + name) .GetAsResponse(client); if (!ProcessResponse(rsp, client)) { goto cc; } var cookie = rsp.Cookies.FirstOrDefault(x => x.Name == "vjkl5"); if (cookie == null) { Reconnection(DialerInfo); goto cc; } return cookie.Value; }
拿到cookie後,根據js加密出vl5x的值,加密的JS:(JS我改寫了,調用getValue這個方法,傳入cookie就可以返回vl5x的值)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 function strToLong(str) { 2 var long = 0; 3 for (var i = 0; i < str.length; i++) { 4 long += (str.charCodeAt(i) << (i % 16)) 5 } 6 return long 7 } 8 function strToLongEn(str) { 9 var long = 0; 10 for (var i = 0; i < str.length; i++) { 11 long += (str.charCodeAt(i) << (i % 16)) + i 12 } 13 return long 14 } 15 function strToLongEn2(str, step) { 16 var long = 0; 17 for (var i = 0; i < str.length; i++) { 18 long += (str.charCodeAt(i) << (i % 16)) + (i * step) 19 } 20 return long 21 } 22 function strToLongEn3(str, step) { 23 var long = 0; 24 for (var i = 0; i < str.length; i++) { 25 long += (str.charCodeAt(i) << (i % 16)) + (i + step - str.charCodeAt(i)) 26 } 27 return long 28 } 29 function makeKey_0(str) { 30 var str = str.substr(5, 5 * 5) + str.substr((5 + 1) * (5 + 1), 3); 31 var a = str.substr(5) + str.substr( - 4); 32 var b = str.substr(4) + a.substr( - 6); 33 return hex_md5(str).substr(4, 24) 34 } 35 function makeKey_1(str) { 36 var str = str.substr(5, 5 * 5) + "5" + str.substr(1, 2) + "1" + str.substr((5 + 1) * (5 + 1), 3); 37 var a = str.substr(5) + str.substr(4); 38 var b = str.substr(12) + a.substr( - 6); 39 var c = str.substr(4) + a.substr(6); 40 return hex_md5(c).substr(4, 24) 41 } 42 function makeKey_2(str) { 43 var str = str.substr(5, 5 * 5) + "15" + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3); 44 var a = strToLong(str.substr(5)) + str.substr(4); 45 var b = strToLong(str.substr(5)) + str.substr(4); 46 var c = str.substr(4) + b.substr(5); 47 return hex_md5(c).substr(1, 24) 48 } 49 function makeKey_3(str) { 50 var str = str.substr(5, 5 * 5) + "15" + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3); 51 var a = strToLongEn(str.substr(5)) + str.substr(4); 52 var b = str.substr(4) + a.substr(5); 53 var c = strToLong(str.substr(5)) + str.substr(4); 54 return hex_md5(b).substr(3, 24) 55 } 56 function makeKey_4(str) { 57 var str = str.substr(5, 5 * 5) + "2" + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3); 58 var long = 0; 59 for (var i = 0; i < str.substr(1).length; i++) { 60 long += (str.charCodeAt(i) << (i % 16)) 61 } 62 var aa = long + str.substr(4); 63 var long = 0; 64 var a = str.substr(5); 65 for (var i = 0; i < a.length; i++) { 66 long += (a.charCodeAt(i) << (i % 16)) + i 67 } 68 a = long + "" + str.substr(4); 69 var b = hex_md5(str.substr(1)) + strToLong(a.substr(5)); 70 return hex_md5(b).substr(3, 24) 71 } 72 function makeKey_5(str) { 73 var base = new Base64(); 74 var str = base.encode(str.substr(5, 5 * 5) + str.substr(1, 2) + "1") + str.substr((5 + 1) * (5 + 1), 3); 75 var a = strToLongEn(str.substr(4, 10)) + str.substr( - 4); 76 var b = hex_md5(str.substr(4)) + a.substr(2); 77 var a = str.substr(3); 78 var c = strToLong(str.substr(5)) + str.substr(4); 79 var aa = long + str.substr(4); 80 var long = 0; 81 for (var i = 0; i < a.length; i++) { 82 long += (a.charCodeAt(i) << (i % 12)) + i 83 } 84 a = long + "" + str.substr(4); 85 return hex_md5(str).substr(4, 24) 86 } 87 function makeKey_6(str) { 88 var base = new Base64(); 89 var str = str.substr(5, 5 * 5) + str.substr((5 + 1) * (5 + 1), 3); 90 var a = base.encode(str.substr(4, 10)) + str.substr(2); 91 var b = str.substr(6) + a.substr(2); 92 var c = strToLong(str.substr(5)) + str.substr(4); 93 var aa = long + str.substr(4); 94 var long = 0; 95 var a = str.substr(5); 96 for (var i = 0; i < a.length; i++) { 97 long += (a.charCodeAt(i) << (i % 16)) + i 98 } 99 a = long + "" + str.substr(4); 100 return hex_md5(b).substr(2, 24) 101 } 102 function makeKey_7(str) { 103 var base = new Base64(); 104 var str = base.encode(str.substr(5, 5 * 4) + "55" + str.substr(1, 2)) + str.substr((5 + 1) * (5 + 1), 3); 105 var long = 0; 106 for (var i = 0; i < str.substr(1).length; i++) { 107 long += (str.charCodeAt(i) << (i % 16 + 5)) + 3 + 5 108 } 109 var aa = long + str.substr(4); 110 var long = 0; 111 var a = str.substr(5); 112 for (var i = 0; i < a.length; i++) { 113 long += (a.charCodeAt(i) << (i % 16)) 114 } 115 a = long + "" + str.substr(4); 116 var b = hex_md5(str.substr(1)) + strToLong(a.substr(5)); 117 return hex_md5(b).substr(3, 24) 118 } 119 function makeKey_8(str) { 120 var base = new Base64(); 121 var str = base.encode(str.substr(5, 5 * 5 - 1) + "5" + "-" + "5") + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3); 122 var long = 0; 123 for (var i = 0; i < str.substr(1).length; i++) { 124 long += (str.charCodeAt(i) << (i % 16)) 125 } 126 var aa = long + str.substr(4); 127 var long = 0; 128 var a = str.substr(5); 129 for (var i = 0; i < a.length; i++) { 130 long += (a.charCodeAt(i) << (i % 16)) 131 } 132 a = long + "" + str.substr(4); 133 var b = hex_md5(str.substr(1)) + strToLongEn(a.substr(5)); 134 return hex_md5(b).substr(4, 24) 135 } 136 function makeKey_9(str) { 137 var str = str.substr(5, 5 * 5) + "5" + str.substr(1, 2) + "1" + str.substr((5 + 1) * (5 + 1), 3); 138 var a = str.substr(5) + str.substr(4); 139 var b = str.substr(12) + a.substr( - 6); 140 var c = hex_sha1(str.substr(4)) + a.substr(6); 141 return hex_md5(c).substr(4, 24) 142 } 143 function makeKey_10(str) { 144 var base = new Base64(); 145 var str = base.encode(str.substr(5, 5 * 5 - 1) + "5") + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3); 146 var long = 0; 147 for (var i = 0; i < str.substr(1).length; i++) { 148 long += (str.charCodeAt(i) << (i % 16)) 149 } 150 var aa = long + str.substr(4); 151 var long = 0; 152 var a = str.substr(5); 153 for (var i = 0; i < a.length; i++) { 154 long += (a.charCodeAt(i) << (i % 16)) 155 } 156 a = long + "" + str.substr(4); 157 var b = hex_md5(str.substr(1)) + hex_sha1(a.substr(5)); 158 return hex_md5(b).substr(4, 24) 159 } 160 function makeKey_11(str) { 161 var base = new Base64(); 162 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2) + str.substr((5 + 1) * (5 + 1), 3); 163 var long = 0; 164 for (var i = 0; i < str.substr(1).length; i++) { 165 long += (str.charCodeAt(i) << (i % 16)) 166 } 167 var aa = long + str.substr(4); 168 var long = 0; 169 var a = str.substr(5); 170 for (var i = 0; i < a.length; i++) { 171 long += (a.charCodeAt(i) << (i % 16)) 172 } 173 a = long + "" + str.substr(2); 174 var b = str.substr(1) + hex_sha1(a.substr(5)); 175 return hex_md5(b).substr(2, 24) 176 } 177 function makeKey_12(str) { 178 var base = new Base64(); 179 var str = str.substr(5, 5 * 5 - 1) + str.substr((5 + 1) * (5 + 1), 3) + "2" + str.substr(1, 2); 180 var long = 0; 181 for (var i = 0; i < str.substr(1).length; i++) { 182 long += (str.charCodeAt(i) << (i % 16)) 183 } 184 var aa = long + str.substr(4); 185 var long = 0; 186 var a = str.substr(5); 187 for (var i = 0; i < a.length; i++) { 188 long += (a.charCodeAt(i) << (i % 16)) 189 } 190 a = long + "" + str.substr(2); 191 var b = str.substr(1) + hex_sha1(str.substr(5)); 192 return hex_md5(b).substr(1, 24) 193 } 194 function makeKey_13(str) { 195 var base = new Base64(); 196 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2); 197 var long = 0; 198 for (var i = 0; i < str.substr(1).length; i++) { 199 long += (str.charCodeAt(i) << (i % 16)) 200 } 201 var aa = long + str.substr(4); 202 var long = 0; 203 var a = str.substr(5); 204 for (var i = 0; i < a.length; i++) { 205 long += (a.charCodeAt(i) << (i % 16)) 206 } 207 a = long + "" + str.substr(2); 208 var b = base.encode(str.substr(1) + hex_sha1(str.substr(5))); 209 return hex_md5(b).substr(1, 24) 210 } 211 function makeKey_14(str) { 212 var base = new Base64(); 213 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2); 214 var long = 0; 215 for (var i = 0; i < str.substr(1).length; i++) { 216 long += (str.charCodeAt(i) << (i % 16)) 217 } 218 var aa = long + str.substr(4); 219 var long = 0; 220 var a = str.substr(5); 221 for (var i = 0; i < a.length; i++) { 222 long += (a.charCodeAt(i) << (i % 16)) 223 } 224 a = long + "" + str.substr(2); 225 var b = base.encode(str.substr(1) + str.substr(5) + str.substr(1, 3)); 226 return hex_sha1(b).substr(1, 24) 227 } 228 function makeKey_15(str) { 229 var base = new Base64(); 230 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2); 231 var long = 0; 232 for (var i = 0; i < str.substr(1).length; i++) { 233 long += (str.charCodeAt(i) << (i % 16)) 234 } 235 var aa = long + str.substr(4); 236 var long = 0; 237 var a = str.substr(5); 238 for (var i = 0; i < a.length; i++) { 239 long += (a.charCodeAt(i) << (i % 16)) 240 } 241 a = long + "" + str.substr(2); 242 var b = base.encode(a.substr(1) + str.substr(5) + str.substr(2, 3)); 243 return hex_sha1(b).substr(1, 24) 244 } 245 function makeKey_16(str) { 246 var base = new Base64(); 247 var str = str.substr(5, 5 * 5 - 1) + "2" + str.substr(1, 2) + "-" + "5"; 248 var long = 0; 249 for (var i = 0; i < str.substr(1).length; i++) { 250 long += (str.charCodeAt(i) << (i % 11)) 251 } 252 var aa = long + str.substr(4); 253 var long = 0; 254 var a = str.substr(5); 255 for (var i = 0; i < a.length; i++) { 256 long += (a.charCodeAt(i) << (i % 16)) + i 257 } 258 a = long + "" + str.substr(2); 259 var b = base.encode(a.substr(1)) + strToLongEn2(str.substr(5), 5) + str.substr(2, 3); 260 return hex_md5(b).substr(2, 24) 261 } 262 function makeKey_17(str) { 263 var base = new Base64(); 264 var str = str.substr(5, 5 * 5 - 1) + "7" + str.substr(1, 2) + "-" + "5"; 265 var long = 0; 266 for (var i = 0; i < str.substr(1).length; i++) { 267 long += (str.charCodeAt(i) << (i % 11)) 268 } 269 var aa = long + str.substr(4); 270 var long = 0; 271 var a = str.substr(5); 272 for (var i = 0; i < a.length; i++) { 273 long += (a.charCodeAt(i) << (i % 16)) + i 274 } 275 a = long + "" + str.substr(2); 276 var b = base.encode(a.substr(1)) + strToLongEn2(str.substr(5), 5 + 1) + str.substr(2 + 5, 3); 277 return hex_md5(b).substr(0, 24) 278 } 279 function makeKey_18(str) { 280 var base = new Base64(); 281 var str = str.substr(5, 5 * 5 - 1) + "7" + str.substr(1, 2) + "5" + str.substr(2 + 5, 3); 282 var long = 0; 283 for (var i = 0; i < str.substr(1).length; i++) { 284 long += (str.charCodeAt(i) << (i % 11)) 285 } 286 var aa = long + str.substr(4); 287 var long = 0; 288 var a = str.substr(5); 289 for (var i = 0; i < a.length; i++) { 290 long += (a.charCodeAt(i) << (i % 16)) + i 291 } 292 a = long + "" + str.substr(2); 293 var b = a.substr(1) + strToLongEn2(str.substr(5), 5 + 1) + str.substr(2 + 5, 3); 294 return hex_md5(b).substr(0, 24) 295 } 296 function makeKey_19(str) { 297 var base = new Base64(); 298 var str = str.substr(5, 5 * 5 - 1) + "7" + str.substr(5, 2) + "5" + str.substr(2 + 5, 3); 299 var long = 0; 300 for (var i = 0; i < str.substr(1).length; i++) { 301 long += (str.charCodeAt(i) << (i % 11)) 302 } 303 var aa = long + str.substr(4); 304 var long = 0; 305 var a = str.substr(5); 306 for (var i = 0; i < a.length; i++) { 307 long += (a.charCodeAt(i) << (i % 16)) + i 308 } 309 a = long + "" + str.substr(2); 310 var b = a.substr(1) + strToLongEn3(str.substr(5), 5 - 1) + str.substr(2 + 5, 3); 311 return hex_md5(b).substr(0, 24) 312 } 313 function makeKey_20(str) { 314 return hex_md5(makeKey_10(str) + makeKey_5(str)).substr(1, 24) 315 } 316 function makeKey_21(str) { 317 return hex_md5(makeKey_11(str) + makeKey_3(str)).substr(2, 24) 318 } 319 function makeKey_22(str) { 320 return hex_md5(makeKey_14(str) + makeKey_19(str)).substr(3, 24) 321 } 322 function makeKey_23(str) { 323 return hex_md5(makeKey_15(str) + makeKey_0(str)).substr(4, 24) 324 } 325 function makeKey_24(str) { 326 return hex_md5(makeKey_16(str) + makeKey_1(str)).substr(1, 24) 327 } 328 function makeKey_25(str) { 329 return hex_md5(makeKey_9(str) + makeKey_4(str)).substr(2, 24) 330 } 331 function makeKey_26(str) { 332 return hex_md5(makeKey_10(str) + makeKey_5(str)).substr(3, 24) 333 } 334 function makeKey_27(str) { 335 return hex_md5(makeKey_17(str) + makeKey_3(str)).substr(4, 24) 336 } 337 function makeKey_28(str) { 338 return hex_md5(makeKey_18(str) + makeKey_7(str)).substr(1, 24) 339 } 340 function makeKey_29(str) { 341 return hex_md5(makeKey_19(str) + makeKey_3(str)).substr(2, 24) 342 } 343 function makeKey_30(str) { 344 return hex_md5(makeKey_0(str) + makeKey_7(str)).substr(3, 24) 345 } 346 function makeKey_31(str) { 347 return hex_md5(makeKey_1(str) + makeKey_8(str)).substr(4, 24) 348 } 349 function makeKey_32(str) { 350 return hex_md5(makeKey_4(str) + makeKey_14(str)).substr(3, 24) 351 } 352 function makeKey_33(str) { 353 return hex_md5(makeKey_5(str) + makeKey_15(str)).substr(4, 24) 354 } 355 function makeKey_34(str) { 356 return hex_md5(makeKey_3(str) + makeKey_16(str)).substr(1, 24) 357 } 358 function makeKey_35(str) { 359 return hex_md5(makeKey_7(str) + makeKey_9(str)).substr(2, 24) 360 } 361 function makeKey_36(str) { 362 return hex_md5(makeKey_8(str) + makeKey_10(str)).substr(3, 24) 363 } 364 function makeKey_37(str) { 365 return hex_md5(makeKey_6(str) + makeKey_17(str)).substr(1, 24) 366 } 367 function makeKey_38(str) { 368 return hex_md5(makeKey_12(str) + makeKey_18(str)).substr(2, 24) 369 } 370 function makeKey_39(str) { 371 return hex_md5(makeKey_14(str) + makeKey_19(str)).substr(3, 24) 372 } 373 function makeKey_40(str) { 374 return hex_md5(makeKey_15(str) + makeKey_0(str)).substr(4, 24) 375 } 376 function makeKey_41(str) { 377 return hex_md5(makeKey_16(str) + makeKey_1(str)).substr(3, 24) 378 } 379 function