首先:要读取一个网站的内容,必须要知道该网站的网址,使用时传递的参数等信息。
那么先给大家推荐一个软件IEInspector.HTTP.Analyzer.Full.Edition.v6HTTPAnalyzerFullV6 该软件为http包抓取工具,可以获得你所访问的网站在在处理过程中提交的参数等信息。
拿查询来说,当按钮点击查询时,IEInspector会把网页post的参数列表获取到。这样HttpClient接下来的工作就简单了。
以我刚刚做过的项目为例:
private static String GetXmlValue(String PassValue,String Page){ String res=""; HttpClient httpClient =new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true) ); //设置网页参数 start httpClient.getParams().setContentCharset("utf-8"); httpClient.getHostConfiguration().setHost("jtj.daqing.gov.cn"); //大庆主页 List<Header> li = new ArrayList<Header>(); //设置请求头 li.add(new Header("Accept","application/json, text/javascript, */*")); //读取内容,包含 li.add(new Header("x-requested-with","XMLHttpRequest")); li.add(new Header("Referer","http://218.246.177.55:8088/jtj_querry/cheliangxinxi/cheliangxinxi_csky_zhuangtai.aspx")); li.add(new Header("Accept-Language","zh-cn")); //中国汉字 li.add(new Header("Content-Type","application/x-www-form-urlencoded")); li.add(new Header("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)")); li.add(new Header("Accept-Encoding","gzip, deflate")); li.add(new Header("Host","jtj.daqing.gov.cn")); //主机 li.add(new Header("Connection","Keep-Alive")); //连接(持续连接) li.add(new Header("Cache-Control","no-cache")); //无缓存,每次重新读取 httpClient.getHostConfiguration().getParams().setParameter("http.default-headers", li); //设置网页参数 end PostMethod method = new PostMethod("http://218.246.177.55:8088/jtj_querry/cheliangxinxi/cheliangxinxi_csky_zhuangtai.aspx"); method.setParameter("TextBox1", PassValue); //读取网页输入的查询值 method.setParameter("Button1", "查询"); //查询按钮单机事件 method.setParameter("__EVENTTARGET", ""); //不知道干啥的,一堆字符,不传一样 method.setParameter("__EVENTARGUMENT", ""); //不知道干啥的,一堆字符,不传一样 method.setParameter("__EVENTVALIDATION", ""); //不知道干啥的,一堆字符,不传一样 method.setParameter("__VIEWSTATE", ""); //不知道干啥的,一堆字符,不传一样 try{ int statusCode=httpClient.executeMethod(method);//网页返回状态 if(statusCode == HttpStatus.SC_OK){ //表示成功练到该网站,获得该网站内容 String thisRes= new String(method.getResponseBody(), "utf-8"); res=thisRes; } }catch(Exception e){ logger.error("DaQingTaxiAction:GetXmlValue:", e); e.printStackTrace(); }finally { method.releaseConnection(); } return res; }
以上参数为IEInspector 获取到的配置信息等信息,把它们全部填写完毕,网站就会返回一个你要查询的网页。
继续处理:
下面用到的软件为Jsoup,该软件可以用document等功能方便直接获取网页信息。如果该网站返回内容中,你所要的数据的table并没有id,那么就要使用火狐浏览器,去获取他的Xpath。然后通过Xpath去读取你所需要的内容
本文例子为:
String ttr[]=null; try { Document doc = Jsoup.parse(html); Element element=doc.getElementById("gv1"); //找到table标签所在的 Elements links = element.getElementsByTag("tbody"); //table标签下的tbody for(Element link : links){ String linkText = link.text(); //获取内容 如车牌号黑ET001 ? ?等 ttr=linkText.split(" "); //由于获取到的都是按空格分开的一串字符,所以按照空格分开,分成String数组 } } catch (Exception e) { logger.error("DaQingTaxiAction:AnalyticalHtml:", e); e.printStackTrace(); } 获取到的ttr数组即为要显示的搜索结果信息。table一般在要爬去的网页上都是有id的,直接获得该id,就可以获得table,然后找到table下面的tbody等信息,直接获取到显示内容,封装成对象显示到网页。 eg:String ttr[]=null; try { Document doc = Jsoup.parse(html); Element element=doc.getElementById("gv1"); //找到table标签所在的 id Elements links = element.getElementsByTag("tbody"); //table标签下的tbody for(Element link : links){ String linkText = link.text(); //获取内容 如车牌号黑ET001 ? ?等 ttr=linkText.split(" "); //由于获取到的都是按空格分开的一串字符,所以按照空格分开,分成String数组 } } catch (Exception e) { logger.error("DaQingTaxiAction:AnalyticalHtml:", e); e.printStackTrace(); } List<CarBasicInformation> list=new ArrayList<CarBasicInformation>(); try { String theArray[][]=getStringTwoArray(ttr); for(int i=1;i<theArray.length;i++){ CarBasicInformation cbi=new CarBasicInformation(); for(int j=0;j<theArray[0].length;j++){ String brandNo=theArray[i][j].toString(); String company=theArray[i][++j].toString(); String transport=theArray[i][++j].toString(); String factory=theArray[i][++j].toString(); String frameNo=theArray[i][++j].toString(); String EngineNO=theArray[i][++j].toString(); String certifia=theArray[i][++j].toString(); String effective=theArray[i][++j].toString(); String remarks=theArray[i][++j].toString(); //如果出现 ,解析时容易出现问号,所以做一下判断 if("?".equals(brandNo)){ cbi.setCarBrandNo(" "); }else{ cbi.setCarBrandNo(brandNo);//车牌号 } if("?".equals(company)){ cbi.setGenusCompany(" "); }else { cbi.setGenusCompany(company);//所属单位 } if("?".equals(transport)){ cbi.setTransportCertificateNo(" "); }else { cbi.setTransportCertificateNo(transport);//运输证号 } if("?".equals(factory)){ cbi.setCarFactory(" "); }else { cbi.setCarFactory(factory);//厂家 } if("?".equals(frameNo)){ cbi.setCarFrameNumber(" "); }else{ cbi.setCarFrameNumber(frameNo);//车架号 } if("?".equals(EngineNO)){ cbi.setEngineNumber(" "); }else{ cbi.setEngineNumber(EngineNO);//发动机号 } if("?".equals(certifia)){ cbi.setCertificationDate(" "); }else{ cbi.setCertificationDate(certifia);//发证日期 } if("?".equals(effective)){ cbi.setEffectiveDate(" "); }else{ cbi.setEffectiveDate(effective);//有效日期 } if("?".equals(remarks)){ cbi.setRemarks(" "); }else{ cbi.setRemarks(remarks);//备注 } } list.add(cbi); } } catch (Exception e) { logger.error("DaQingTaxiAction:AnalyticalHtml:", e); e.printStackTrace(); }
封装完成后,直接显示到前台jsp页面即可。