JSoup+Htmlunit爬取分页组件中的分页数据
JSoup+htmlunit爬取分页组件中的数据
业务需求场景
爬取XX网站中的球队数据-球队的比赛赛程(所有赛程放在一个分页主件中的)
这里不像传统的分页页面,需要传入一个page页码再去请求,然后再去爬取table 中的数据
解决思路 利用 htmlunit 去模拟点击事件(这里指点击下一页),循环点击去取到每一页的结果(效率低,建议后面存缓存或者入库)
分析页面:
我们可以发现数据是放在一个id=schedules-table table标签里。这样就很好取了
因为这边是取1-5页的数据就可以了。所以博主分了两部分 第一页。JSoup传统取
2-5页htmlunit去取。
代码:
@RequestMapping("/teamMatchs")
public List teamMatchs(@RequestBody JSONObject jsonObject) throws Exception{
String str= jsonObject.getString(“teamId”);
String href=str.substring(str.lastIndexOf("/")+1);
String url=“https://data.leisu.com/”;
Document doc = Jsoup.connect(url+href).get();
Element table1 = doc.getElementById(“schedules-table”);
Elements trLists=table1.select(“tr”);
List data =new ArrayList<>();
//爬取分页的第一页数据放在这里
for(int m=1;m<trLists.size();m++){
TeamMatchsDto matchsDto = new TeamMatchsDto();
String leagueName=trLists.get(m).child(0).text();
String turns=trLists.get(m).child(1).text();
String startTime=trLists.get(m).child(2).text();
String homeTeam=trLists.get(m).child(3).text();
String score=trLists.get(m).child(4).text();
String visitingTeam=trLists.get(m).child(5).text();
String halfScore=trLists.get(m).child(6).text();
matchsDto.setLeagueMatchName(leagueName);
matchsDto.setTurns(turns);
matchsDto.setStartTime(startTime);
matchsDto.setHomeTeam(homeTeam);
matchsDto.setScore(score);
matchsDto.setVisitingTeam(visitingTeam);
matchsDto.setHalfScore(halfScore);
data.add(matchsDto);
}
//爬取2-5页
WebClient webClient = new WebClient();
webClient.getOptions().setCssEnabled(false);
HtmlPage htmlPage = webClient.getPage(url+href);
HtmlAnchor anchor = (HtmlAnchor) htmlPage.getByXPath("//*[@id=“schedules-pagination”]/a[3]").get(0);
for(int i =0;i<4;i++){
HtmlPage page = anchor.click();
String xml = page.getElementById(“schedules-table”).asXml();
Document document = Jsoup.parse(xml);
Element table = document.getElementById(“schedules-table”);
Elements trLists2=table.select(“tr”);
for(int m=1;m<trLists2.size();m++){
TeamMatchsDto matchsDto2 = new TeamMatchsDto();
String leagueName=trLists2.get(m).child(0).text();
String turns=trLists2.get(m).child(1).text();
String startTime=trLists2.get(m).child(2).text();
String homeTeam=trLists2.get(m).child(3).text();
String score=trLists2.get(m).child(4).text();
String visitingTeam=trLists2.get(m).child(5).text();
String halfScore=trLists2.get(m).child(6).text();
matchsDto2.setLeagueMatchName(leagueName);
matchsDto2.setTurns(turns);
matchsDto2.setStartTime(startTime);
matchsDto2.setHomeTeam(homeTeam);
matchsDto2.setScore(score);
matchsDto2.setVisitingTeam(visitingTeam);
matchsDto2.setHalfScore(halfScore);
data.add(matchsDto2);
}
System.out.println(i);
}
System.out.println(“success”);
return data;
}
TeamMatchsDto 用来存取需要爬取的字段。根据自己的业务场景改变