【Jsoup】“广西师范大学”校园快讯和公告信息小爬虫

来源:互联网 发布:淘宝天天特价 编辑:程序博客网 时间:2024/05/01 01:37

在【开源中国】看到一篇使用Jsoup爬取36氪和雷锋网的文章,感觉蛮好玩的,自己也来弄一下;本来想爬取计院的信息,坑得要命,竟然访问不了!然后天真地找学校的首页下手了,原来这里有一个更大的坑;

首先要引入Jsoup包,顺便把下载也发一下,下载地址:http://jsoup.org/download jsoup参考文档:http://www.open-open.com/jsoup/


jsoup是一个Java HTML Parser。能够从URL、文件或字符串解析HTML。利用DOM遍历或CSS选择器查找和抽取数据。能够操作HTML元素,属性和文本。能够依据一个白名单过滤用户提交的内容。


在这里我爬取的是我们学校:广西师范大学 的首页信息【当年脑袋不太好,高考来了一个文科学校学计算机,还是补录的,让名校的大神们贱笑了,啊嗷】

闲话:这个首页很朴素,没有华丽的外表,内容多一分则嫌多,少一分则嫌少,一眼就可以找到你想要的东西,是我用过的好网站之一;

实现代码:

1、数据模型:NewsModel,懒得写,我是直接拷大神的,就不贴出来了

2、接口:Spider

package com.tan.code;import java.io.IOException;import java.util.List;public interface Spider {public abstract List<NewsModel> getNews() throws IOException;}
3、抽象类:AbstractSpider
package com.tan.code;import java.io.IOException;import java.util.ArrayList;import java.util.List;public abstract  class AbstractSpider implements Spider {protected String url;protected String webName;public abstract List<NewsModel> getNews() throws IOException ;    AbstractSpider(String url,String webName){    this.url=url;    this.webName=webName;}}
4、下面就是主要的代码了,有点乱:

package com.tan.code;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import com.tan.code.DeleteHtml.HtmlText;public class SpiderForGxnuInfo extends AbstractSpider {public SpiderForGxnuInfo() {super("http://www.gxnu.edu.cn/","Guangxi Normal University --- 广西师范大学:尊师重道 敬业乐群");// TODO Auto-generated constructor stub}@Overridepublic List<NewsModel> getNews() throws IOException {// TODO Auto-generated method stubString content = "";List<NewsModel> list = new ArrayList<NewsModel>();Document document = Jsoup.connect(url).timeout(6000).get();Elements tdelements = document.select("td[align=left]");for (Element tde : tdelements) {String col_value = tde.attr("colspan");// 如果colspan的值为5,说明是新闻标签-有點亂,第一次寫不想把代碼提取出來了if (col_value.equals("5")) {Elements aelements = tde.getElementsByTag("a");for (Element linkElement : aelements) {NewsModel newsModel = new NewsModel();String link = linkElement.attr("href");Document contentDocument = Jsoup.connect(link).timeout(6000).get();Element contentElement = contentDocument.select("div.bd").first();// 获取标题Elements tElement = contentElement.getElementsByTag("dt");// 设置标题newsModel.setTitle(tElement.text());Elements pElements = contentElement.getElementsByTag("p");if (!pElements.isEmpty()) {for (Element pElement : pElements) {// 得到文章的每一段content += pElement;}}newsModel.setContent(HtmlText.Html2Text(content));content = "";list.add(newsModel);}}// 如果colspan的值为6,说明是公告信息else if (col_value.equals("6")) {Elements aelements = tde.getElementsByTag("a");for (Element linkElement : aelements) {NewsModel newsModel = new NewsModel();String link = linkElement.attr("href");// 获取链接的文本内容String linktext = linkElement.text().toString();if (!linktext.contains("[")) {Document contentDocument = Jsoup.connect(link).timeout(6000).get();// 获取标题div// Element contentElement = contentDocument.select(// "div[align]").first();// newsModel.setTitle(contentElement.text());// 获取内容标签Element content_div = contentDocument.select("div#detailContent").first();//--------------------------------------------------------------淩亂的判斷,算了不提取信息了,遭罪---------------------------------------//// 遍历p,获取内容[无分类的公告信息的内容是p标签]//Elements pels = content_div.select("p");//if (!pels.isEmpty()) {//// 第一个p标签为标题标签//newsModel.setTitle(pels.get(0).text());//for (Element pel : pels) {//content += pel.text();////}//}// 【通知】【校内公示】内容在div标签里面// -----------------------看到这个师大的html标签,我凌乱了,这个是哪位大神做的---------------------////else {//// 文档的第一个align属性为center的div标签为标题//newsModel.setTitle(contentDocument//.select("div[align=center]").first().text()//.toString());////// 文档的align属性为left的div标签为内容//Elements c_divs = contentDocument//.getElementsByAttribute("div[align=left]");//for (Element c_div : c_divs) {//content += c_div.text();//}//}//else//------------------------------------------------------------------------------------------------------------------------------- content+=content_div.text();newsModel.setContent(HtmlText.Html2Text(content));content = "";list.add(newsModel);}}}}return list;}}
5、去掉文档中的HTML标签,这个代码自己水平有限,所以是百度来的,也看看吧:

package com.tan.code;import java.util.regex.Pattern;public class DeleteHtml {//去掉文本中的html标签public static class HtmlText {public static String Html2Text(String inputString) {String htmlStr = inputString;String textStr = "";java.util.regex.Pattern p_script;java.util.regex.Matcher m_script;java.util.regex.Pattern p_style;java.util.regex.Matcher m_style;java.util.regex.Pattern p_html;java.util.regex.Matcher m_html;java.util.regex.Pattern p_html1;java.util.regex.Matcher m_html1;try {String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; // 定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>// }String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; // 定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>// }String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式String regEx_html1 = "<[^>]+";p_script = Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE);m_script = p_script.matcher(htmlStr);htmlStr = m_script.replaceAll(""); // 过滤script标签p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);m_style = p_style.matcher(htmlStr);htmlStr = m_style.replaceAll(""); // 过滤style标签p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);m_html = p_html.matcher(htmlStr);htmlStr = m_html.replaceAll(""); // 过滤html标签p_html1 = Pattern.compile(regEx_html1, Pattern.CASE_INSENSITIVE);m_html1 = p_html1.matcher(htmlStr);htmlStr = m_html1.replaceAll(""); // 过滤html标签textStr = htmlStr;} catch (Exception e) {System.err.println("Html2Text: " + e.getMessage());}return textStr;// 返回文本字符串}}}

6、测试代码:

package com.tan.code;import java.io.IOException;import java.util.List;import org.junit.Test;public class MyTest {@Testpublic void test() throws IOException {//fail("Not yet implemented");SpiderForGxnuInfo slp=new SpiderForGxnuInfo();List<NewsModel> l=slp.getNews();for(int i=0;i<l.size();i++){NewsModel m=l.get(i);System.out.println("---------------------标题------------------------");System.out.println("标题"+m.getTitle());System.out.println("---------------------内容------------------------");System.out.println("内容"+m.getContent());}}}

6、测试结果:


总结:jsoup让爬虫变得简单很多,内容也蛮少的,看一下就基本看完了