`
Mr_Tank_
  • 浏览: 21117 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

 
阅读更多

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

首先要引入Jsoup包,顺便把下载也发一下,下载地址:http://jsoup.org/downloadjsoup参考文档: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
	}

	@Override
	public List<NewsModel> getNews() throws IOException {
		// TODO Auto-generated method stub
		String 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 {

	@Test
	public 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让爬虫变得简单很多,内容也蛮少的,看一下就基本看完了




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics