本次抓取地址:https://www.oschina.net/news 项目源码:https://github.com/geekfly2016/Spider 代码目录:Spider/src/xyz/geekfly/get_list/OSCHINA_NEWS.java
1.打开目标网址,打开开发者工具,清空控制台
2.拖动滚动条到底部
在一堆请求中,我们可以看到有一个xhr的请求,地址如get_more_news_list,那它肯定就是翻页加载数据的Url请求了。 (可点击xhr进行过滤Url请求,xhr即为Ajax类型的请求。)
点击该链接,在Header中,我们可以看到请求地址,请求类型,参数等,参数中的p即为获取第p页的数据,有些网站还会包括每页的数据条数,根据实际情况添加即可。
点击response可以查看返回的数据,细心的同学已经看到返回的数据和Java数据采集-3.抓取开源中国新闻(新版)博客中介绍的一致,此处不再做过多介绍。
3.解析数据
forEachData为解析每一页数据的,获取具体的每一条的相关信息。 以下代码详细介绍参考:Java数据采集-3.抓取开源中国新闻(新版)
代码语言:javascript复制public static void forEachData(Elements items){
String host = "https://www.oschina.net";
for(Element item: items){
//过滤广告
if(!item.attr("data-tracepid").isEmpty()){
continue;
}
// 标题
String title = item.select("a").first().text();
//标题地址
String title_href = item.select("a").first().attr("href");
if(!title_href.startsWith("https://")){
title_href = host title_href;
}
//描述
String desc = item.select("div[class=sc sc-text text-gradient wrap summary]").text();
//作者头像
String author_image = item.select("img[class=avatar]").attr("src");
//String author_image = item.select("img").first().attr("src");
// System.out.println(item);
Element mr = item.select(".from .mr").get(0);
//作者
String author = mr.select("a").text();
// 从span[class=mr]中移除a标签,输出的即为发布时间
mr.select("a").remove();
String published = mr.text();
String number = item.select(".from .mr").last().text();
System.out.println("t" title);
}
4.构造循环
在主函数中,使用循环获取每一页的数据,由于此类型的网站并不知道总页数,所以一般需要根据看是否还能获取到数据来判断结束。 getPageData函数为获取某一页的数据,接收页数作为参数,返回当前页的数据条数。
代码语言:javascript复制public static void main(String[] args) throws IOException {
for(int page_number=1;;page_number ){
int data_rows = getPageData(page_number);
System.out.println("当前执行:" page_number "页,数据数:" data_rows);
//返回数据为空时,结束循环
if(data_rows == 0){
break;
}
}
}
public static int getPageData(int page_number) throws IOException{
String page_url = "https://www.oschina.net/action/ajax/get_more_news_list?newsType=&p=" page_number;
Document document = Jsoup.connect(page_url)
.userAgent("ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36")
.post();
//获取样例 69条 共7页
Elements items = document.select("div[class=item box]");
forEachData(items);
return items.size();
}