[爬蟲]請求返回521解決方法
阿新 • • 發佈:2019-02-18
我需要抓取的網站是國家企業信用資訊公示系統,但是該網站有反爬蟲,一般的url下載方法並不適用,下面是我通過查資料後總結的一個可行的方法。
首先,要通過url和Cookie還有User-Agent去請求一次目標網址,第一次的cookie可以通過瀏覽器來獲取,cookie主要是需要__jsluid和__jsl_clearance。
請求後返回狀態為521,返回內容是一串加密後的javascript,解密後可以得到一串正常的js程式碼,執行js程式碼就可以得到一個cookie就是__jsl_clearance的。因為我是用的java,所以我是用的java自帶的指令碼引擎類ScriptEngineManager去解析的。javascript解析看程式碼:
ScriptEngineManager manager = new ScriptEngineManager();
//得到指令碼引擎
ScriptEngine engine = manager.getEngineByName("JavaScript");
//處理加密js
String js = page.trim().replace("<script>", "").replace("</script>", "").replace("eval(y.replace(/\\b\\w+\\b/g, function(y){return x[f(y,z)-1]}));", "y.replace(/\\b\\w+\\b/g, function(y){return x[f(y,z)-1]})");
try {
//得到解密後的js
String result = (String) engine.eval(js);
result = result.substring(result.indexOf("var cd"),result.indexOf("dc+=cd;")+7);
result = result.replaceAll("document*.*toLowerCase\\(\\)", "'x'");
//得到cookie
String jsl = (String) engine.eval(result);
} catch (ScriptException e) {
e.printStackTrace();
}
然後拿得到的cookie再去請求一遍,還會得到一個加密的js,使用上面的解密方法後得到一個cookie。
再通過獲取請求頭裡的cookie拿到__jsluid,兩個cookie合成後再請求一次就能得到這個網頁的頁面原始碼了。//得到__jsluid
Header[] headers = response.getHeaders("Set-Cookie");
String jsl = headers[0].getValue().split(";")[0]+";";
因為兩個cookie是需要配套使用,不配套的話不能下載成功,還是會返回521
大致思路就是這樣,祝你成功!