在【开源中国】看到一篇使用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、抽象类:AbstractSpiderpackage 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.connect()`方法用于建立到目标网页的连接,`get()`则用于获取页面内容。一旦我们有了HTML...
**SpringBoot+Jsoup爬虫详解** 在现代Web开发中,数据抓取(或称爬虫)是一项重要的技能,尤其对于数据分析、...通过合理的设计和编程,我们可以构建出高效、可靠的爬虫系统,实现从大量网页中自动提取有价值的信息。
**jsoup网页爬虫小案例** 在这个案例中,我们将探讨如何使用Java的Jsoup库来实现...通过学习和实践这个"jsoup网页爬虫小案例",你将能够掌握如何利用Jsoup创建自己的爬虫项目,为日后的数据挖掘和分析打下坚实的基础。
**JSoup库详解及其在构建小爬虫中的应用** JSoup是一个用于处理实际世界HTML的Java库。它提供了非常方便的API,用于提取和操作数据,使用DOM、CSS以及类似于jQuery的方法。在Java中,当你需要从网页抓取数据或者...
Java + IntelliJ IDEA + Jsoup 爬虫是一个高效且便捷的网页抓取解决方案。Jsoup 是一个用于处理实际世界HTML的Java库,它提供了非常方便的API,用于提取和操作数据,使用DOM、CSS以及类似于jQuery的方法。在这个项目...
JsoupXpath jsoup的升级版 ,支持jsoup的同时还支持原生xpath语法,让你的爬虫更得心应手,无所不爬!
**Jsoup网络爬虫项目详解** ...总结,基于Jsoup的网络爬虫项目为初学者提供了一个直观的学习平台,通过实践这个项目,你可以深入理解网络爬虫的工作原理,熟悉Jsoup库的使用,为后续的数据分析和Web开发打下坚实基础。
**JSoup实现网络爬虫详解** 网络爬虫是获取大量网页数据的重要工具,而Java作为广泛应用的编程语言,提供了丰富的库来支持网络爬虫的开发。JSoup是其中一个优秀的库,专为处理真实世界的HTML而设计。本篇将详细介绍...
在现代互联网环境中,数据抓取是获取大量信息的重要手段,而SpringBoot作为Java领域广泛使用的轻量级框架,结合jsoup库,可以构建高效、灵活的网络爬虫应用。这个"基于jsoup的SpringBoot爬虫demo"项目旨在展示如何...
**Android Jsoup网页爬虫案例** Jsoup是一个Java库,设计用于处理真实世界的HTML,它提供了非常方便的API,用于提取和操作数据,使用DOM、CSS以及类似于jQuery的方法。在Android开发中,我们有时需要从网页上抓取...
通过学习如何使用`jsoup`爬虫,我们可以从各种博客和其他网站获取有价值的信息,例如文章内容、作者信息、评论等。 首先,让我们理解`jsoup`的基本概念。`jsoup`设计灵感来源于jQuery,因此它的API对于熟悉...
使用jsoup技术连接网站地址,通过改变参数获取网站div...项目中包括dbutil链接数据库的工具类,执行sql的helper工具类,获取网站div图片保存到本地的工具类信息,包括了jsoup1.10.1的jar包和commom-dbutils1.5的jar包;
在Web开发和数据抓取领域,Java爬虫技术是实现网页自动化信息提取的重要手段。本文主要讲述如何利用Java编程语言中的Jsoup库和HttpClient工具包来获取和解析动态生成的数据,特别是那些通过JavaScript动态加载的数据...
【标题】"爬虫实例(jsoup).zip" 提供了一个基于jsoup的Java爬虫项目的实例,这旨在帮助初学者快速掌握网页抓取的...通过学习和实践这个实例,你将能够独立构建自己的爬虫项目,从而更有效地获取和利用网络上的信息。
**网页爬虫jsoup详解** jsoup是一款强大的Java库,专为处理真实世界的HTML而设计。它提供了非常方便的API,用于抓取和解析网页数据,实现网页爬虫功能。作为一个开源项目,jsoup受到广大开发者喜爱,不仅因为它易于...
**JSoup + HttpClient 简单爬虫** 在信息技术领域,数据抓取,或称“爬虫”,是一种自动化获取网页信息的技术。JavaScript Object Notation (JSON) Soup 和 HttpClient 是两个在Java开发中常用于实现爬虫功能的库。...
使用jsoup进行爬虫并获取模板网页具体数据,获取总页数进行自动翻页处理。
用Jsoup的技术抓取某个Q某阅读的信息,然后通过获得的内容解析出需要的内容。
**jsoup多线程爬虫** 是一个使用Java语言,基于jsoup库实现的网络爬虫项目。这个项目的核心目标是高效地抓取网页上的新闻内容,通过多线程技术来提升爬取效率。jsoup是一款强大的HTML解析库,它能够帮助开发者方便地...
### Jsoup爬虫技术及其API应用 #### 一、Jsoup简介 Jsoup是一款用于Java的应用程序接口(API),主要用于从HTML文档中提取和操作数据。它提供了强大的功能,包括解析HTML文档、清洗用户输入的数据、从网站抓取数据等...