Java 爬虫工具Jsoup详解
Java爬虫工具Jsoup详解
Jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
jsoup的主要功能如下:
1.从一个URL,文件或字符串中解析HTML;
2.使用DOM或CSS选择器来查找、取出数据;
3.可操作HTML元素、属性、文本;
jsoup是基于MIT协议发布的,可放心使用于商业项目。
jsoup可以从包括字符串、URL地址以及本地文件来加载HTML文档,并生成Document对象实例。
简单而言,Jsoup就是先取html页面代码然后解析这些页面通过Jsoup携带的满足我们绝大多数需求的各种选择器从这个页面中获取我们所需要的重要数据的一款功能强大的html解析器,但也只是相对而言,这里的页面这是死的静态页面,如果你想获取动态生成的页面数据那么你得用到其他的java爬虫技术,我会不定时更新这些技术一起探讨。下面我们来具体谈谈如何运用Jsoup
一、如何取页面
Jsoup提供了用来解析html页面的方法parse(),我们通过解析它可以获取整个页面的dom对象,通过这个对象来获取你所需要的页面所须有的参数。获取页面的方法有很多,这里就简单的列举几个:
①通过Jsoup携带的connect()方法
StringhtmlPage=Jsoup.connect("https://www.baidu.com").get().toString();
这个方法说需要的参数就是一个String类型的url链接,但是你的注意把这些链接的protrol加上,以免问题,其实这个方法解决了我们很多问题,我们完全可以把Jsoup解析html抽取成一段通用工具类,然后通过改变拼接的url参数获取到很多我们想要的东西,举个例子:京东和淘宝的商品链接都是固定的,通过改变其三方商品ID来获取商品详情参数。
Stringurl="https://item.jd.com/11476104681.html"; 完全可以替换成 Stringurl="https://item.jd.com/"+skuId+".html";
通过改变他的三方商品ID你就可以获取这个页面一些基本数据,像商品的图片和标题什么的都可以轻松获取,而价格因为做了一些相关方面的处理得动态的获取,这里先不做说明,后面慢慢会讲解。
②通过httpclient直接获取这个页面的静态页面
先贴一部分httpclient获取页面工具
importjava.io.IOException;
importjava.io.UnsupportedEncodingException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Map;
importjava.util.Set;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.NameValuePair;
importorg.apache.http.ParseException;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.client.methods.HttpUriRequest;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.protocol.HTTP;
importorg.apache.http.util.EntityUtils;
/**
*HTTP请求工具类.
*@authorLuoLong
*@since20150513
*
*/
publicclassHttpClientUtils{
/**
*post方式请求.
*@paramurl请求地址.
*@paramparams请求参数
*@returnString
*/
publicstaticStringpost(Stringurl,Mapparams){
DefaultHttpClienthttpclient=newDefaultHttpClient();
Stringbody=null;
HttpPostpost=postForm(url,params);
body=invoke(httpclient,post);
httpclient.getConnectionManager().shutdown();
returnbody;
}
/**
*get方式请求.
*@paramurl请求地址.
*@returnString
*/
publicstaticStringget(Stringurl){
DefaultHttpClienthttpclient=newDefaultHttpClient();
Stringbody=null;
HttpGetget=newHttpGet(url);
body=invoke(httpclient,get);
httpclient.getConnectionManager().shutdown();
returnbody;
}
/**
*请求方法.
*@paramhttpclientDefaultHttpClient.
*@paramhttpost请求方式.
*@returnString
*/
privatestaticStringinvoke(DefaultHttpClienthttpclient,
HttpUriRequesthttpost){
HttpResponseresponse=sendRequest(httpclient,httpost);
Stringbody=paseResponse(response);
returnbody;
}
/**
*
*@paramresponse
*@return
*/
@SuppressWarnings({"deprecation","unused"})
privatestaticStringpaseResponse(HttpResponseresponse){
HttpEntityentity=response.getEntity();
Stringcharset=EntityUtils.getContentCharSet(entity);
Stringbody=null;
try{
body=EntityUtils.toString(entity);
}catch(ParseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnbody;
}
privatestaticHttpResponsesendRequest(DefaultHttpClienthttpclient,
HttpUriRequesthttpost){
HttpResponseresponse=null;
try{
response=httpclient.execute(httpost);
}catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnresponse;
}
@SuppressWarnings("deprecation")
privatestaticHttpPostpostForm(Stringurl,Mapparams){
HttpPosthttpost=newHttpPost(url);
Listnvps=newArrayList();
SetkeySet=params.keySet();
for(Stringkey:keySet){
nvps.add(newBasicNameValuePair(key,params.get(key)));
}
try{
httpost.setEntity(newUrlEncodedFormEntity(nvps,HTTP.UTF_8));
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
returnhttpost;
}
}
通过get()方法就可以获取html页面的String类型数据
Stringcontent=HttpClientUtils.get(url); 或者你可以直接把页面下载到本地,然后解析此html文档获取 Fileinput=newFile(FilePath); Documentdoc=Jsoup.parse(input,"UTF-8",url);
二、解析页面获取需要的数据
当你获取到页面的dom对象后,那么下面的操作就非常简单了,你只需要通过操作这个dom对象来获取页面所有的静态资源,动态加载的资源不在此列,后面在做讲解。
先贴一段百度网页的源代码: