最近在做一个关于数据爬取的功能,在此记录一下。(该功能主要是模拟表单提交后获取提交后的页面的数据,我们再进行处理)
本文章用(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!