Jsoup存在的时间已经很长,历史可以追溯到2010年的青葱岁月。说起来,那时的java工程师们还是神一般的存在,那会我们自己搞工具,自己搞框架,唯独缺少了开源精神。好些比较好用的工具都湮灭在原公司的资料库中。
Jsoup这个工具的活跃度还不错,对有一定开发经验的人来说,入门还是很容易的。它对前端的css选择器知识有一定要求,这个网上搜索一下,很快也就掌握了。
下面我爬取了中工网的一些信息,作为测试。
Document page_entrance= Jsoup.connect("http://www.workercn.cn/xuexi/").timeout(30000).get();
Element nav=page_entrance.getElementById("nav");
Elements a_targets=nav.select("a");
hrefs=a_targets.eachAttr("href");
有一点,不够人性化的设计是,对于404或者503这类的响应码,Jsoup都是通过异常的形式抛出,再编码的时候,异常的捕获需要着重处理。
try {
content_list = Jsoup.connect(cur_href).timeout(30000).get();
} catch (HttpStatusException e){
int code=e.getStatusCode();
writer.write(code+"_[ "+cur_href+" ]\r\n");
}catch (ConnectException e){
writer.write("链接异常_[ "+cur_href+" ]\r\n");
}catch (SocketTimeoutException e){
writer.write("访问超时_[ "+cur_href+" ]\r\n");
}catch (Exception e){
writer.write(e.getMessage());
}
通过异常捕获记录一些信息,比如,检测网站上的无效链接。
另外,还有一点值得注意。借用Jsoup与某些接口进行交互时,post请求很多时候需要忽略内容类型,否则可能出现UnsupportedMimeTypeException.下面是在某功能中使用Jsoup 向百度站长进行链接提交的实现。
Document document=Jsoup.connect("http://data.zz.baidu.com/urls?site=www.workercn.cn&token=*********").ignoreContentType(true).requestBody(toBd.toString()).header("Content-Type", "application/json").post();
System.out.println(document.body());
在请求体的时候,可以参考如下:
//构造字符串,以\r\n进行不同链接的间隔区分
toBd.append(toBidu.get(i)+"\r\n");