[爬虫]请求返回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("", "").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
大致思路就是这样,祝你成功!

你可能感兴趣的:(java,爬虫)