需要的包:
org.projectlombok
lombok
provided
1.16.20
org.jsoup
jsoup
1.8.3
net.sourceforge.htmlunit
htmlunit
2.25
返回的类:
import lombok.Data;
/*
* @author zzf
* @date 2019年1月15日 下午5:07:17
*/
@Data
public class TyphoonReportVo {
/**
* 发布时间
*/
String releaseTime;
/**
* 经度
*/
String longitude;
/**
* 纬度
*/
String latitude;
/**
* 中心气压
*/
String centralPressure;
/**
* 最大风速
*/
String maxWind;
/**
* 台风等级
*/
String typhoonLevel;
/**
* 台风名
*/
String typhoonName;
}
这里我要爬取的是台风信息:
http://typhoon.weather.com.cn/
代码如下:
public ListgetTyphoonReport() {
Listlist=new ArrayList<>();
String typhoonWeatherUrl="http://typhoon.weather.com.cn/";
try {
WebClient wc = new WebClient(BrowserVersion.CHROME);
// 启用JS解释器,默认为true
wc.getOptions().setJavaScriptEnabled(true);
// 禁用css支持
wc.getOptions().setCssEnabled(false);
// js运行错误时,是否抛出异常
wc.getOptions().setThrowExceptionOnScriptError(false);
// 状态码错误时,是否抛出异常
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
// 设置连接超时时间 ,这里是5S。如果为0,则无限期等待
wc.getOptions().setTimeout(5000);
// 是否允许使用ActiveX
wc.getOptions().setActiveXNative(false);
// 等待js时间
wc.waitForBackgroundJavaScript(1 * 1000);
// 设置Ajax异步处理控制器即启用Ajax支持
wc.setAjaxController(new NicelyResynchronizingAjaxController());
// 不跟踪抓取
wc.getOptions().setDoNotTrackEnabled(false);
HtmlPage page = wc.getPage(typhoonWeatherUrl);
// 以xml的形式获取响应文本
String pageXml = page.asXml();
Document document = Jsoup.parse(pageXml);
//获取对应a标签的url
Element a = document.select("div.borBox > h2.titleA > span > a").get(0);
String typhoonName = a.text();
page = wc.getPage(a.attr("href"));
pageXml = page.asXml();
Document listDocument = Jsoup.parse(pageXml);
//获取台风历史信息
Elements trs = listDocument.select("table > tbody > tr:gt(5)");
for (Element tr : trs) {
//保存数据
TyphoonReportVo typhoonReportVo=new TyphoonReportVo();
typhoonReportVo.setReleaseTime(tr.select("td:eq(0)").get(0).text());
typhoonReportVo.setLongitude(tr.select("td:eq(1)").get(0).text());
typhoonReportVo.setLatitude(tr.select("td:eq(2)").get(0).text());
typhoonReportVo.setCentralPressure(tr.select("td:eq(3)").get(0).text());
typhoonReportVo.setMaxWind(tr.select("td:eq(4)").get(0).text());
typhoonReportVo.setTyphoonLevel(tr.select("td:eq(5)").get(0).text());
typhoonReportVo.setTyphoonName(typhoonName);
System.out.println(tr);
list.add(typhoonReportVo);
}
} catch (Exception e) {
return null;
}
return list;
}
运行后:
ok~这样就能获取懒加载后的数据了!