写在前面的话:头一次爬取这样的请求,用博客的形式记录一下。
DWR网上查了一下,说是ajax开源框架:Direct Web Remoting。不管怎么样,想要的信息就在这个请求的中,抓包工具看一下请求参数是这样的:
好吧,既然找到了参数,就开始模拟吧。这就遇到了第一个坑,scriptSessionid这个参数是变的,ctrl+f查找一下这个参数,查不到从哪一个请求中产生的。上网查一下,发现也有人遇到过,http://www.sufeinet.com/thread-1759-1-1.html,我去,显示已解决,兴奋的看了看贴吧,好吧,还是让我在页面中找,可是我是真找不到呀。哈哈,多亏了同事的帮忙,发现有个engine.js请求中有和这个参数很像的一个参数,就是少三位数字,怪不得查不到(ps:我是搜的74D536FEF48F67B49E0D868629A60F1E195,少三位当然搜不到。)
扯远一点:从某个购物网站抓数据时,也遇到过这样的,网站上显示11.9%,然后我怎么ctrl+f搜11.9都搜不到,最后也是同事搜到的,我去,原来抓到的页面里是0.119。
剩下3位发现是随机的,那就好弄啦。这个参数这个坑就填上了。这里说一下,抓包工具一定要从首页开始抓,不从首页抓抓不到engine.js这个请求的,导致分析很容易掉坑。
最后一个坑,对于基础好的大神,其实也不算是坑了。我主要用httpclient不会提交这样的参数,问了一下同事,直接贴一下代码好了(提交参数,需要加换行符“\r\n”):
public static String textpost(HttpClient client, String url, Map<String, String> headers, String jsonParams,
String reqCharset) {
if (StringUtils.isBlank(url) || client == null) {
throw new IllegalArgumentException("url and client can not be null.");
}
if (StringUtils.isBlank(reqCharset)) {
reqCharset = "utf-8";
}
try {
RequestBuilder requestBuilder = RequestBuilder.post().setUri(url);
if (StringUtils.isNotBlank(jsonParams)) {
StringEntity entity = new StringEntity(jsonParams);
entity.setContentEncoding(reqCharset);
entity.setContentType("text/plain");
requestBuilder.setEntity(entity);
}
HttpUriRequest request = requestBuilder.build();
if (MapUtils.isNotEmpty(headers)) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
request.addHeader(entry.getKey(), entry.getValue());
}
}
HttpResponse response = client.execute(request);
try {
String html = EntityUtils.toString(response.getEntity(), "utf-8");
return html;
} catch (IOException e) {
logger.error("", e);
}
} catch (ParseException e) {
logger.error("", e);
} catch (IOException e) {
logger.error("", e);
}
return null;
}
最后说一下,学到的好技巧,这样提交有时会提交错误,可是又不好找原因。可以用抓包工具抓程序的包,然后用对比工具进行对比,就很容易找到错误啦!