HttpClient获取网页内容详解

首先:要读取一个网站的内容,必须要知道该网站的网址,使用时传递的参数等信息。

那么先给大家推荐一个软件IEInspector.HTTP.Analyzer.Full.Edition.v6\HTTPAnalyzerFullV6 该软件为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();
     //如果出现&nbsp,解析时容易出现问号,所以做一下判断
     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页面即可。

posted on 2013-11-11 15:14  谢皓宇  阅读(1497)  评论(0编辑  收藏  举报

导航