需要的包:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.25</version>
</dependency>
返回的类:
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 List<TyphoonReportVo> getTyphoonReport() {
List<TyphoonReportVo> list=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~这样就能获取懒加载后的数据了!