`
Mr_Tank_
  • 浏览: 22595 次
  • 性别: 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让爬虫变得简单很多,内容也蛮少的,看一下就基本看完了




分享到:
评论

相关推荐

    jsoup示例-爬取广西师大首页信息

    在本示例中,我们将深入探讨如何使用Jsoup来爬取广西师范大学的首页信息。 首先,了解基本的Jsoup用法是至关重要的。`Jsoup.connect()`方法用于建立到目标网页的连接,`get()`则用于获取页面内容。一旦我们有了HTML...

    SpringBoot+jsoup爬虫

    **SpringBoot+Jsoup爬虫详解** 在现代Web开发中,数据抓取(或称爬虫)是一项重要的技能,尤其对于数据分析、...通过合理的设计和编程,我们可以构建出高效、可靠的爬虫系统,实现从大量网页中自动提取有价值的信息。

    jsoup网页爬虫小案例

    **jsoup网页爬虫小案例** 在这个案例中,我们将探讨如何使用Java的Jsoup库来实现...通过学习和实践这个"jsoup网页爬虫小案例",你将能够掌握如何利用Jsoup创建自己的爬虫项目,为日后的数据挖掘和分析打下坚实的基础。

    jsoup包实现的小爬虫

    **JSoup库详解及其在构建小爬虫中的应用** JSoup是一个用于处理实际世界HTML的Java库。它提供了非常方便的API,用于提取和操作数据,使用DOM、CSS以及类似于jQuery的方法。在Java中,当你需要从网页抓取数据或者...

    java+idea+jsoup 爬虫

    Java + IntelliJ IDEA + Jsoup 爬虫是一个高效且便捷的网页抓取解决方案。Jsoup 是一个用于处理实际世界HTML的Java库,它提供了非常方便的API,用于提取和操作数据,使用DOM、CSS以及类似于jQuery的方法。在这个项目...

    JsoupXpath jsoup升级版 java爬虫工具

    JsoupXpath jsoup的升级版 ,支持jsoup的同时还支持原生xpath语法,让你的爬虫更得心应手,无所不爬!

    Jsoup-网络爬虫项目

    **Jsoup网络爬虫项目详解** ...总结,基于Jsoup的网络爬虫项目为初学者提供了一个直观的学习平台,通过实践这个项目,你可以深入理解网络爬虫的工作原理,熟悉Jsoup库的使用,为后续的数据分析和Web开发打下坚实基础。

    jsoup实现网络爬虫

    **JSoup实现网络爬虫详解** 网络爬虫是获取大量网页数据的重要工具,而Java作为广泛应用的编程语言,提供了丰富的库来支持网络爬虫的开发。JSoup是其中一个优秀的库,专为处理真实世界的HTML而设计。本篇将详细介绍...

    基于jsoup的SpringBoot爬虫demo

    在现代互联网环境中,数据抓取是获取大量信息的重要手段,而SpringBoot作为Java领域广泛使用的轻量级框架,结合jsoup库,可以构建高效、灵活的网络爬虫应用。这个"基于jsoup的SpringBoot爬虫demo"项目旨在展示如何...

    Android_Jsoup网页爬虫案例

    **Android Jsoup网页爬虫案例** Jsoup是一个Java库,设计用于处理真实世界的HTML,它提供了非常方便的API,用于提取和操作数据,使用DOM、CSS以及类似于jQuery的方法。在Android开发中,我们有时需要从网页上抓取...

    jsoup爬虫学习之爬取博客(包含jsoup jar包)

    通过学习如何使用`jsoup`爬虫,我们可以从各种博客和其他网站获取有价值的信息,例如文章内容、作者信息、评论等。 首先,让我们理解`jsoup`的基本概念。`jsoup`设计灵感来源于jQuery,因此它的API对于熟悉...

    jsoup爬虫获取某网站的信息

    使用jsoup技术连接网站地址,通过改变参数获取网站div...项目中包括dbutil链接数据库的工具类,执行sql的helper工具类,获取网站div图片保存到本地的工具类信息,包括了jsoup1.10.1的jar包和commom-dbutils1.5的jar包;

    Java爬虫Jsoup+httpclient获取动态生成的数据

    在Web开发和数据抓取领域,Java爬虫技术是实现网页自动化信息提取的重要手段。本文主要讲述如何利用Java编程语言中的Jsoup库和HttpClient工具包来获取和解析动态生成的数据,特别是那些通过JavaScript动态加载的数据...

    爬虫实例(jsoup).zip

    【标题】"爬虫实例(jsoup).zip" 提供了一个基于jsoup的Java爬虫项目的实例,这旨在帮助初学者快速掌握网页抓取的...通过学习和实践这个实例,你将能够独立构建自己的爬虫项目,从而更有效地获取和利用网络上的信息。

    网页爬虫jsoup

    **网页爬虫jsoup详解** jsoup是一款强大的Java库,专为处理真实世界的HTML而设计。它提供了非常方便的API,用于抓取和解析网页数据,实现网页爬虫功能。作为一个开源项目,jsoup受到广大开发者喜爱,不仅因为它易于...

    jsoup+httpclient j简单爬虫

    **JSoup + HttpClient 简单爬虫** 在信息技术领域,数据抓取,或称“爬虫”,是一种自动化获取网页信息的技术。JavaScript Object Notation (JSON) Soup 和 HttpClient 是两个在Java开发中常用于实现爬虫功能的库。...

    jsoup爬虫实战

    使用jsoup进行爬虫并获取模板网页具体数据,获取总页数进行自动翻页处理。

    JSoup爬虫小案例

    用Jsoup的技术抓取某个Q某阅读的信息,然后通过获得的内容解析出需要的内容。

    jsoup多线程爬虫

    **jsoup多线程爬虫** 是一个使用Java语言,基于jsoup库实现的网络爬虫项目。这个项目的核心目标是高效地抓取网页上的新闻内容,通过多线程技术来提升爬取效率。jsoup是一款强大的HTML解析库,它能够帮助开发者方便地...

    jsoup爬虫中文api

    ### Jsoup爬虫技术及其API应用 #### 一、Jsoup简介 Jsoup是一款用于Java的应用程序接口(API),主要用于从HTML文档中提取和操作数据。它提供了强大的功能,包括解析HTML文档、清洗用户输入的数据、从网站抓取数据等...

Global site tag (gtag.js) - Google Analytics