【谷歌翻译,参考可以看官方原文】
jsoup:Java的HTML解析器
jsoup是与现实世界的HTML工作的Java库。它提供了用于提取和操作数据,使用最好的DOM,
CSS和jquery的方法很像,而且的API很方便。
jsoup实现了WHATWG的HTML5规范,并解析HTML到同一个DOM现代浏览器做。
刮从一个URL,文件或字符串解析HTML
发现并提取数据,使用DOM遍历或CSS选择器 操纵HTML元素,属性和文本
对一个安全白名单干净的用户提交的内容,以防止XSS攻击 输出HTML整洁
jsoup是专门用来对付HTML各品种在野外发现的;从原始和验证,无效标签汤; jsoup将创建一个明智的解析树。
//Document doc=Jsoup.parse(new URL(requestURL), 3000);
// Document doc=Jsoup.connect(requestURL).timeout(5000).get();
//Document doc = Jsoup.connect(requestURL).timeout(3000).userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0")).get();
Document doc = Jsoup.connect(requestURL).timeout(3000).cookie("auth", "token").userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0").get();
Jsoup.connect( homepage).userAgent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)").referrer("www.google.com").get()
例
获取维基百科网页,它解析为一个DOM,并从在新闻栏目中选择头条新闻为元素(在线样品)的列表:
Document doc =Jsoup.connect("http://en.wikipedia.org/").get();
Elements newsHeadlines = doc.select("#mp-itn b a");//获取id为mp-itn下面b标签的a标签的元素
开源 jsoup是在宽松的MIT许可证分发的一个开源项目。源代码可以在GitHub上。 入门
下载jsoup罐子(版本1.8.1) 阅读菜谱介绍 享受! 开发和支持 如果您对如何使用jsoup,
或者有想法将来的发展有任何疑问,请通过邮件列表联系。
如果您发现任何问题,请检查重复之后提交的bug。 状态 jsoup是一般的发布。
你抓取得太狠了吧,速度快的话,对方网站服务器会不定时有一会无响应,处理如下:
1.对方网站有多个IP的时候,自己写个分发类,轮流去每个ip取。
2.对于1个IP的时候,遇到这种情况,当前线程就自动暂停几秒钟,然后再重试,自动马上重试的话,也有问题。
建议jsoup和httpclient一起用,httpclient去抓取信息,jsoup做分析。上面2种处理,用httpclient都好解决的,jsoup的特长在于分析,抓取是httpclient的特长。
connectTimeout和soTimeout一般都设置3秒就好了,抓取么,用单例就好,多线程的话,更容易遇到timeout。
package ivyy.taobao.com.jsoup;
import ivyy.taobao.com.entity.CheBiao;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
*@Date:2015-1-6
*@Author:liangjilong
*@Email:jilongliang@sina.com
*@Version:1.0
*@Description:使用Jsoup抓取车标网各种相应车的信息
*/
public class JsoupCar {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
/**
* 国产,日本,德国,法国,意大利,英国,美国,韩国,其他
*/
String [] countryNames={"guochan","riben","deguo","faguo","yidali","yingguo","meiguo","hanguo","qita"};
//遍历获取太多信息估计会超时连接,可以单独一个一个的去设值抓取如
//List<CheBiao> listsChe=getCheBiaoInfoByHtml("guochan");
for(String countryName:countryNames){
//System.out.println(countryName);
List<CheBiao> listsChe=getCheBiaoInfoByHtml(countryName);//
int count=1;
for (Iterator iterator = listsChe.iterator(); iterator.hasNext();) {
CheBiao cheBiao = (CheBiao) iterator.next();
System.out.println("第"+count+"-------"+cheBiao.getDetailText());
//System.out.println("第"+count+"-------"+cheBiao.getConcise());
count++;
}
}
}
/***
* 根据相应的国家品牌的名称去获取车的信息
* @param countryName
* @return
*/
public static List<CheBiao> getCheBiaoInfoByHtml(String countryName)throws Exception{
List<CheBiao> listsChe=new ArrayList<CheBiao>();
String url=getUrl(countryName);
Document doc=Jsoup.parse(new URL(url), 3000);//方法一
//Document doc=Jsoup.connect(url).get();//方法二
if(doc!=null){
//处理从页面的class=expPicA样式下面的li标签
Elements liEls=doc.getElementsByAttributeValue("class", "expPicA").select("li");
for(Element li:liEls){
CheBiao che=new CheBiao();
//从i标签的class=iTit的a标签拿出相应的信息内容出来
String carName=li.select("i[class=iTit]").select("a").text().trim();//获取汽车名称
String imgSmallSrc=li.select("i[class=iTxt]").select("img").attr("src");//获取汽车图片路径
String concise=li.select("i[class=iDes]").text().trim();//简要
String detailUrl=li.select("i[class=iPic]").select("a").attr("href");//获取汽车详情的html页面连接
Document descDoc=Jsoup.parse(new URL(detailUrl), 3000);//方法一
String imgBigSrc="",detailText="";
if(descDoc!=null){
Element article=descDoc.select("div[class=article]").get(0);
detailText=article.html();//获取详情信息
imgBigSrc=article.select("img").attr("src");//获取大图片
}
che.setCarName(carName);
che.setConcise(concise);
che.setImgSmallSrc(imgSmallSrc);
che.setDetailUrl(detailUrl);
che.setImgBigSrc(imgBigSrc);
che.setDetailText(detailText);
listsChe.add(che);
}
return listsChe;
}else{
//html="Network Connect Timeout";
}
return null;
}
/***
* 根据相应的国家品牌的名称请求相应的连接
* @param countryName
* @return
*/
public static String getUrl(String countryName){
return "http://www.pcauto.com.cn/zt/chebiao/"+countryName;
}
}
package ivyy.taobao.com.entity;
import java.io.Serializable;
/**
*@Date:2015-1-6
*@Author:liangjilong
*@Email:jilongliang@sina.com
*@Version:1.0
*@Description:实体类
*/
@SuppressWarnings("all")
public class CheBiao implements Serializable{
private Integer id;//id标识
private String carName;//汽车名称
private String concise;//简要说明
private String imgSmallSrc;//汽车小图片路径
private String imgBigSrc;//汽车大图片路径
private String detailUrl;//汽车详情页面路径
private String detailText;//汽车详情描述
/******************get/set*****************************/
public String getDetailText() {
return detailText;
}
public void setDetailText(String detailText) {
this.detailText = detailText;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public String getConcise() {
return concise;
}
public void setConcise(String concise) {
this.concise = concise;
}
public String getImgSmallSrc() {
return imgSmallSrc;
}
public void setImgSmallSrc(String imgSmallSrc) {
this.imgSmallSrc = imgSmallSrc;
}
public String getImgBigSrc() {
return imgBigSrc;
}
public void setImgBigSrc(String imgBigSrc) {
this.imgBigSrc = imgBigSrc;
}
public String getDetailUrl() {
return detailUrl;
}
public void setDetailUrl(String detailUrl) {
this.detailUrl = detailUrl;
}
}