Jsoup+HtmlUnit获取懒加载数据

1 篇文章 0 订阅

需要的包:

		<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~这样就能获取懒加载后的数据了!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用Jsoup获取图片,可以按照以下步骤进行操作: 1. 使用Jsoup.connect()方法连接到指定的URL。 2. 使用Jsoup.parse()方法解析HTML文档。 3. 使用doc.select()方法选择包含图片的元素。 4. 使用element.attr()方法获取图片的URL。 5. 使用Jsoup.connect()方法连接到图片的URL。 6. 使用Response.bodyAsBytes()方法获取图片的字节数组。 下面是一个示例代码,可以获取指定网页中的所有图片: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.jsoup.Connection.Response; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class ImageDownloader { public static void main(String[] args) throws IOException { String url = "https://www.example.com"; Document doc = Jsoup.connect(url).get(); Elements imgs = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]"); for (Element img : imgs) { String imgUrl = img.attr("abs:src"); Response resultImageResponse = Jsoup.connect(imgUrl) .ignoreContentType(true).execute(); InputStream inputStream = resultImageResponse.bodyStream(); OutputStream outputStream = new FileOutputStream( "image_" + System.currentTimeMillis() + ".jpg"); int bytesRead = -1; byte[] buffer = new byte[4096]; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值