java爬取网页模拟表单提交后的数据并进行处理

   最近在做一个关于数据爬取的功能,在此记录一下。(该功能主要是模拟表单提交后获取提交后的页面的数据,我们再进行处理)

本文章用(http://www.suanmingde.com/xingming/xmpd/)网站作为例子,如有侵权等请联系我删除。

    下面帖代码:

     
    String name1="王也";
    String name2="诸葛青";
    Integer xing1=0;
    Integer xing2=0;
    Integer sex1=0;
    Integer sex2=0;

    // 得到浏览器对象,直接New一个就能得到,现在就好比说你得到了一个浏览器了
    WebClient webclient = new WebClient();

// 这里是配置一下不加载css和javaScript,配置起来很简单,是不是
        webclient.getOptions().setCssEnabled(false);
        webclient.getOptions().setJavaScriptEnabled(false);

                // 做的第一件事,去拿到这个网页,只需要调用getPage这个方法即可
                HtmlPage htmlpage = webclient.getPage("http://www.suanmingde.com/xingming/xmpd/");
// 根据名字得到一个表单,查看上面这个网页的源代码可以发现表单的名字叫“f”
//final HtmlForm form = htmlpage.getFormByName("f");
//得到网页上第二个表单
final HtmlForm form = htmlpage.getForms().get(1);
        //获取网页的配对按钮 (根据class)
        HtmlElement button = htmlpage.getHtmlElementById("btn_begincs2");
        // 得到搜索框
        HtmlTextInput txtUName = form.getInputByName("name1"); //用户名text框
        //设置值
        txtUName.setValueAttribute(name1);

        HtmlSelect txtUName1 = form.getSelectByName("xing1");
        txtUName1.setSelectedIndex(xing1);
        HtmlSelect  txtUName2 = form.getSelectByName("sex1");
        txtUName2.setSelectedIndex(sex1);

        HtmlTextInput  txtUNameq = (HtmlTextInput )form.getInputByName("name2");
        txtUNameq.setValueAttribute(name2);

        HtmlSelect txtUNameg1 = form.getSelectByName("xing2");
        txtUNameg1.setSelectedIndex(xing2);
        HtmlSelect  txtUNameg2 = form.getSelectByName("sex2");
        txtUNameg2.setSelectedIndex(sex2);
        //提交表单
        final HtmlPage nextPage = button.click();

        //把获得后的网页转换成document
        Document document = Jsoup.parse(nextPage.asXml());
        //获得第一人的 五行和五格
        Map<String, String> stringStringMap = haveAttribute(document, 1,name1.length());
        //获得第二人的 五行和五格
        Map<String, String> stringStringMap2 = haveAttribute(document, 2,name2.length());
        //获得配对文本结果
        Element e = document.select("[class=\"box_con\"]").get(2);
        Elements font = e.select("font");
        String resulText = font.text().toString();
        Elements span = e.select("span");
        String resultPairZong = span.text().toString().split("分")[0];


 上面我抽取了一个方法
haveAttribute(document, 1,name1.length())

参数说明  :  

                     第一个参数表示 获取后的页面的decument形式。

                     第二个参数表示  获取第几个class为clearfix的对象

                     第三个参数表示  姓名的长度


上面的方法根据自己的实际业务进行处理。


下面贴上抽取的方法代码:

 //获取网页数据 五行和五格  num等于1时 获得第一个人的   num等于2时  获得第二人的
    public static Map<String,String> haveAttribute(Document document, Integer num,Integer nameLeng){
        //保存到map
        Map<String, String> map = new HashMap<>();

        //获得name的五行
        Element e = document.select("[class=\"clearfix\"]").get(num);
        Elements li = e.select("li");

        //判断姓名的长度
        if (nameLeng==1){
            //获得第一个五行的属性
            String attribute1 = li.get(9).text();
            map.put("attribute1",attribute1);
        }
        if (nameLeng==2){
            //获得第一个五行的属性
            String attribute1 = li.get(9).text();
            //获得第二个五行的属性
            String attribute2 = li.get(14).text();
            map.put("attribute1",attribute1);
            map.put("attribute2",attribute2);
        }
        if (nameLeng==3){
            //获得第一个五行的属性
            String attribute1 = li.get(9).text();
            //获得第二个五行的属性
            String attribute2 = li.get(14).text();
            //获得第三个五行的属性
            String attribute3 = li.get(19).text();
            map.put("attribute1",attribute1);
            map.put("attribute2",attribute2);
            map.put("attribute3",attribute3);
        }
        if (nameLeng==4){
            //获得第一个五行的属性
            String attribute1 = li.get(9).text();
            //获得第二个五行的属性
            String attribute2 = li.get(14).text();
            //获得第三个五行的属性
            String attribute3 = li.get(19).text();
            //获得第三个五行的属性
            String attribute4 = li.get(24).text();
            map.put("attribute1",attribute1);
            map.put("attribute2",attribute2);
            map.put("attribute3",attribute3);
            map.put("attribute4",attribute4);
        }


        //获得name1的五格
        Element el = document.select("[class=\"sort_2nd\"]").get(num-1);
        String text = el.text().toString();
        String[] split = text.split(" ");
        String tian = split[2].toString();
        String ren = split[6].toString();
        String s = split[9].toString();
        String[] split1 = s.split(">>");
        String di = split1[1].toString();
        Element els = document.select("[class=\"sort_3rd\"]").get(num-1);
        String text2 = els.text().toString();
        String[] split2 = text2.split(" ");
        String wai = split2[1].split(">>")[1].toString();
        String zong = split2[5].toString();

        map.put("tian",tian);
        map.put("ren",ren);
        map.put("di",di);
        map.put("wai",wai);
        map.put("zong",zong);
        return map;
    }

  导入的依赖:

               <dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.11.2</version>
		</dependency>
		<dependency>
			<groupId>net.sourceforge.htmlunit</groupId>
			<artifactId>htmlunit</artifactId>
			<version>2.18</version>
		</dependency>

over!


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值