通过java不用正则表达式,实现对页面标签的过滤或解析。
我们平时上网用的浏览器,除了根据用户输入的url完成通信,还要解析执行javascript代码浏览器在发送http请求时,会在头部里面加入很多信息,比如Cookie/userAgent等。所以网站可以根据这些信息来确定这个请求时正常的用户请求还是爬虫集群请求,对于后者,为了减轻网站压力服务器通常不予回应,所以该系统在使用jsoup工具时,会附上猎豹浏览器真实的userAgent,降低失败率浏览器在拿到网页以后,会执行javascript代码,有一些代码会再次让浏览器发送请求,拿到一些内容来展现在网页上。因为jsoup不能执行javascript代码,所有会出现它拿到的内容少于真实内容的情形。
一、添加依赖包
org.jsoup
jsoup
1.6.3
二、常用类说明
1、获取url页面信息的post方法也get方法示例如下:
Document doc = Jsoup.connect("http://example.com").userAgent("Mozilla").data("name", "jsoup").get();
Document doc = Jsoup.connect("http://example.com").cookie("auth", "token").post();
2、获取此元素与它所有子元素的文本内容的组合。
String org.jsoup.nodes.Element.text()
说明:如给定的html为
Hello there now!
,p.txt(),那么返回的是“Hello there now!”3、将Html内容解析为一个文档
Document org.jsoup.Jsoup.parse(String html)
4、寻找与指定css选择器匹配的元素
Elements org.jsoup.nodes.Element.select(String cssQuery)
5、从elements中拿element,下标从0起
Element org.jsoup.select.Elements.get(int index)
三、示例
1、设置需要解析的界面url地址和请求参数
public static String doGet(String url, Map params ) throws Exception {
StringBuffer paramsurl = new StringBuffer();
paramsurl.append(url);
if(null != params && !params.isEmpty()) {
if(url.indexOf("?") > -1) {
paramsurl.append("&");
} else {
paramsurl.append("?");
}
Object[] paramsstr = params.keySet().toArray();
for(int i=0; i
2、创建一个通用的请求方法,将页面信息已String的形式获取到
private static String doRequest(HttpRequestBase request, int reSend) {
String result = "";
try {
request.setConfig(RequestConfig.copy(requestConfig).build());
request.setHeader("X-Requested-With", "XMLHttpRequest");
request.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
request.addHeader("Accept", "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01");
request.addHeader("Accept-Language", "zh-CN");
request.addHeader("Acceot-Encoding", "gzip, deflate");
request.addHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 1.0; WOW64; Trident/8.0");
request.addHeader("referer", "http://www.baidu.com");
request.addHeader("Cookies", "");
HttpResponse httpResponse = client.execute(request);
HttpEntity httpEntity = httpResponse.getEntity();
if(httpResponse.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(httpEntity, "utf-8");
if(StringUtils.isEmpty(result)) {
throw new Exception(httpResponse.getStatusLine().getStatusCode()+"");
}
} else {
request.abort();
if(null != httpEntity) {
result = EntityUtils.toString(httpEntity, "utf-8");
}
throw new Exception(httpResponse.getStatusLine().getStatusCode()+"");
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
3、获取页面包含的所有js地址
public List getScriptUris() {
Document document = Jsoup.parse("");
Elements elements = document.getElementsByTag("script");
if(null != elements && !elements.isEmpty()) {
List uris = new ArrayList();
for(int i=0; i
4、获取页面包含的CSS地址
public List getCssUris() {
Document document = Jsoup.parse("");
Elements elements = document.getElementsByTag("link");
if(null != elements && !elements.isEmpty()) {
List uris = new ArrayList();
for(int i=0; i