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!


发布了3 篇原创文章 · 获赞 0 · 访问量 2209
展开阅读全文

从java发布请求到php

03-21

<div class="post-text" itemprop="text"> <p>I have a problem ,when I send a post request from java to web server .But when I use GET method it works very well .</p> <p>java code </p> <pre><code> package networkTest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.nio.charset.Charset; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub try { URL url=new URL("http://127.0.0.1/index.php"); HttpURLConnection curl=(HttpURLConnection) url.openConnection(); curl.setDoInput(true); curl.setDoOutput(true); curl.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded"); curl.setAllowUserInteraction(true); curl.setRequestMethod("POST"); //** OutputStream out =curl.getOutputStream(); InputStream in =curl.getInputStream(); String data="name=xxx"; out.write(data.getBytes()); InputStreamReader reader=new InputStreamReader(in); BufferedReader Breader=new BufferedReader(reader); String buff; String Rdata=""; while((buff=Breader.readLine()) !=null ) { Rdata+=buff+" "; } System.out.println(Rdata); } catch (MalformedURLException e) { // TODO Auto-generated catch block System.err.println("error in url connection"); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block System.err.println("IO execption: error in opening connection"); e.printStackTrace(); } } } </code></pre> <p>PHP code I received a response from <code>inputstream</code> but the $_POST["name"] is always unset and the response is always "there is no request " </p> <pre><code><?php if(isset($_POST["name"])) { echo($_POST["name"]); } else { echo"there is no request"; } ?> </code></pre> </div> 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览