爬虫-模拟点击,实现加载页面全部内容
- 完成页面加载:
- 目标分析:在爬取页面数据时,如果是遇到这个不进行点击,会导致数据爬取不全。
- 解决方法:可以采取模拟点击来进行避免。
- 一,它对应的xpath是
- 二,一直点击直到最后按钮消失,页面加载完成后,xpath会变为:
- 三,实现代码:
- 点击任务,进入新页面
- 目标分析:下面的文字可以点击进入一个任务页面。想实现:输入这个页面总url,自动进入每一个任务页面。并加载页面全部信息。
- 一,通过xpath定位到文字
- 二,代码:
- 加载页面全部信息详解
完成页面加载:
目标分析:在爬取页面数据时,如果是遇到这个不进行点击,会导致数据爬取不全。
解决方法:可以采取模拟点击来进行避免。
一,它对应的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的元素是否为空,来决定是否执行点击事件。