爬虫-模拟点击,实现加载页面全部内容

完成页面加载:

目标分析:在爬取页面数据时,如果是遇到这个不进行点击,会导致数据爬取不全。

在这里插入图片描述

解决方法:可以采取模拟点击来进行避免。

一,它对应的xpath是

在这里插入图片描述

二,一直点击直到最后按钮消失,页面加载完成后,xpath会变为:

style会发生变化,我们可以通过id定位,通过style来判断,是否执行点击事件。
在这里插入图片描述

三,实现代码:

WebClient webClient;
HtmlPage htmlPage;
webClient.waitForBackgroundJavaScript(10000);
webClient.setJavaScriptTimeout(10000);
WebRequest webRequest = new WebRequest(new URL(url));
htmlPage = webClient.getPage(webRequest);
//根据id状态进行判断,是否执行点击事件
 while (!("display: none;").equals(htmlPage.getElementById("getMoreTopic").getAttribute("style"))) {
    
    	//定位按钮
     DomElement more = htmlPage.getElementById("getMoreTopic");
     //点击按钮
     htmlPage = more.click();
     //等待10s,给click事件充足时间。
     webClient.waitForBackgroundJavaScript(10000);
}

点击任务,进入新页面

目标分析:下面的文字可以点击进入一个任务页面。想实现:输入这个页面总url,自动进入每一个任务页面。并加载页面全部信息。

在这里插入图片描述

一,通过xpath定位到文字

在这里插入图片描述

二,代码:

//爬取每一个任务模块
List<HtmlElement> items = htmlPage.getByXPath("/html/body//div[contains(@class,\"oneDiv\")]");
 	 //一条任务名,这是xpath。
     DomElement TopicMore = htmlElement.getFirstByXPath("./div[1]/div[2]/p/span");
     // 模拟点击,分别点击每一条任务,进入对应url页面
     htmlPage = TopicMore.click();
     webClient.waitForBackgroundJavaScript(10000);
     //进入任务页面后,循环加载更多,实现加载全部页面
     while (htmlPage.getElementById("more_reply") != null) {
    
    
     	DomElement more1 = htmlPage.getElementById("more_reply");
     	htmlPage = more1.click();
     	webClient.waitForBackgroundJavaScript(10000);
}

加载页面全部信息详解

在这里插入图片描述
因为点击按钮,观察xpath,会发现,这个xpath,会消失。所以可以通过判断这个id为more_reply的元素是否为空,来决定是否执行点击事件。

猜你喜欢

转载自blog.csdn.net/Ciel_Y/article/details/110234553