1. 程式人生 > >[爬蟲]請求返回521解決方法

[爬蟲]請求返回521解決方法

我需要抓取的網站是國家企業信用資訊公示系統,但是該網站有反爬蟲,一般的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 大致思路就是這樣,祝你成功!