在【开源中国】看到一篇使用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爬取广西师范大学首页信息源代码,博客的资源,不知道放在哪就传到这里吧,代码不是很复杂,但是有点乱,里面都有相应的注释
org.jsoup 包实现的小爬虫,包含jar包 import org.jsoup.Jsoup; import org.jsoup.nodes.Document;
基于jsoup实现的java爬虫,爬取豆瓣电影数据基于jsoup实现的java爬虫,爬取豆瓣电影数据
jsoup网络爬虫jsoup网络爬虫jsoup网络爬虫jsoup网络爬虫
该资源包含了一个利用jsoup实现的网页爬虫的下案例,简单易懂。
使用jsoup技术连接网站地址,通过改变参数获取网站div...项目中包括dbutil链接数据库的工具类,执行sql的helper工具类,获取网站div图片保存到本地的工具类信息,包括了jsoup1.10.1的jar包和commom-dbutils1.5的jar包;
使用jsoup进行爬虫并获取模板网页具体数据,获取总页数进行自动翻页处理。
jsoup+httpclient 简单爬虫,一个jsoup的简单爬虫实例
用Jsoup的技术抓取某个Q某阅读的信息,然后通过获得的内容解析出需要的内容。
本地创建.xlsx文件,里面存放京东商品地址,运行项目启动导入本地xlsx文件,自动爬取文件中地址信息下载到本地
JsoupXpath jsoup的升级版 ,支持jsoup的同时还支持原生xpath语法,让你的爬虫更得心应手,无所不爬!
Android Jsoup 爬虫协议抓取网页信息
初级爬虫
基于jsoup的网络爬虫开发,简单易懂,易于初学者分析!!!
java爬虫完整代码,爬取某东和某电影平台,可以举一反三爬取想要的资源有用信息;利用jsoup跨域请求url地址,利用jQuery选择器选取页面元素,获取想要的信息标签中的内容,转为java对象保存到数据库或者缓存.
jsoup1.8.1抓取爬虫工具jsoup1.8.1抓取爬虫工具jsoup1.8.1抓取爬虫工具
jsoup爬虫学习源代码和jsoup 的jar包上传,我的第一次上传资源,多多包涵
主要介绍了Java爬虫Jsoup+httpclient获取动态生成的数据的相关资料,需要的朋友可以参考下
给出网址可以抓取网页上的代码 可自己根据抓取网页的源码来修改要追踪的标签。 此demo为了熟悉和使用jsoup。
网页爬虫jsoup,开源项目,备用,欢迎下载