zoukankan      html  css  js  c++  java
  • HttpClient获取网页内容详解

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

    那么先给大家推荐一个软件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();
         //如果出现&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页面即可。

  • 相关阅读:
    C++ string 类详解
    C语言 -- 字符串详解
    基本数据结构 -- 链表的遍历、查找、插入和删除
    Shell 基础 -- 总结几种括号、引号的用法
    用 C 语言描述几种排序算法
    Win10 + vs2017 编译并配置tesseract4.1.0
    前端如何引入vConsole
    php设计模式-数据对象映射模式
    PHP设计模式-策略模式
    PHP设计模式-适配器模式
  • 原文地址:https://www.cnblogs.com/xiehaoyu/p/3417955.html
Copyright © 2011-2022 走看看