写在前面的话:头一次爬取这样的请求,用博客的形式记录一下。
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; }最后说一下,学到的好技巧,这样提交有时会提交错误,可是又不好找原因。可以用抓包工具抓程序的包,然后用对比工具进行对比,就很容易找到错误啦! 原文链接:https://www.f2er.com/ajax/161690.html