package com.neusoft.mid.parser;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NTCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.log4j.Logger;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.Tag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.Span;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.htmlparser.visitors.NodeVisitor;
import com.neusoft.mid.parser.bean.ContentBean;
public class CatchContent implements Runnable{
private static final Logger logger = Logger.getLogger(CatchContent.class);
final static boolean IS_INIT=false;//true问第一次使用 false为初始化之后使用
private DoSql doSql;
private String type;
private String url;
private String maxDate;
public DoSql getDoSql() {
return doSql;
}
public void setDoSql(DoSql doSql) {
this.doSql = doSql;
}
/**
* 字符串转换成日期
* @param str
* @return date
*/
public static Date StrToDate(String str) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(str);
} catch (ParseException e) {
logger.error(e);
}
return date;
}
/**
* 判断日期大小
*/
public boolean isLate(String createdate){
if(this.maxDate ==null){
return false;
}
if(StrToDate(createdate).getTime()<StrToDate(this.maxDate).getTime()){
logger.info("日期小于数据库中最大日期,不予录入");
return true;
}
return false;
}
public void initInsertDB(String name,String createdate,String content){
ContentBean cbean = new ContentBean();
cbean.setName(name);
cbean.setContent(content);
cbean.setCreatedate(createdate);
cbean.setType(type);
try {
doSql.insertData(cbean);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void insertDB(String name,String createdate,String content){
if(isLate(createdate)){
logger.info("日期小于数据库中最大日期,不予录入");
}else{
ContentBean cbean = new ContentBean();
cbean.setName(name);
cbean.setContent(content);
cbean.setCreatedate(createdate);
cbean.setType(type);
try {
doSql.insertData(cbean);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//分别读纯文本和链接
public static String[] readDateAndLink(String result) throws Exception
{
Parser myParser;
// Parser parser;
myParser = Parser.createParser(result, "GB2312");
HtmlPage htmlPage = new HtmlPage(myParser);
myParser.visitAllNodesWith(htmlPage);
NodeList nodelist ;
nodelist = htmlPage.getBody();
int size= nodelist.size();
Node[] nodes = nodelist.toNodeArray();
StringBuffer sb = new StringBuffer();
for(int i =0;i<size;i++){
sb.append(nodes[i].toHtml().trim());
}
/**
* 获取url
*/
Parser parser = new Parser(sb.toString());
parser.setEncoding("GB2312");
// NodeList list = parser.extractAllNodesThatMatch(filter);
final StringBuffer spanBuffer = new StringBuffer();
final StringBuffer titleBuffer = new StringBuffer();
final StringBuffer urlBuffer = new StringBuffer();
NodeVisitor visitor = new NodeVisitor() {
public void visitTag(Tag tag) {
if (tag instanceof Span) {
spanBuffer.append(tag.getChildren().asString());
spanBuffer.append("`");
} else if (tag instanceof LinkTag) {
urlBuffer.append(tag.getAttribute("href"));
urlBuffer.append("`");
titleBuffer.append(tag.getAttribute("title"));
titleBuffer.append("`");
}
else if (tag instanceof org.htmlparser.tags.ParagraphTag ) {
System.out.println( spanBuffer.append(tag.getChildren().asString()));
}
}
};
parser.visitAllNodesWith(visitor);
String allContent[] = {spanBuffer.toString(),urlBuffer.toString(),titleBuffer.toString()};
return allContent;
}
/**
* 获得代理的httpClient
* @return
*/
public static HttpClient getHttpClient(){
//构造HttpClient
HttpClient httpClient = new HttpClient();
httpClient.getHostConfiguration().setProxy("192.168.107.28",8080);
NTCredentials defaultcreds = new NTCredentials("帐号", "密码", "192.168.107.28", "hold");
httpClient.getState().setProxyCredentials(AuthScope.ANY, defaultcreds);
HostConfiguration hcf =new HostConfiguration();
hcf.setProxy("192.168.107.28",8080);
return httpClient;
}
public void save(String[] result){
//链接字符串
String url = result[1];
//标题字符串
String title = result[2];
//日期字符串
String date = result[0];
String[] urlArr = url.split("`");
String[] titleArr = title.split("`");
String[] dateArr = date.split("`");
//判断是否为初始化第一次操作
if(IS_INIT){
for(int i = 0 ; i< urlArr.length;i++){
String _url = urlArr[i];
String _title = titleArr[i];
String _date = dateArr[i];
String _content = getContent(_url);
initInsertDB(_title,_date,_content);
}
}else{
for(int i = 0 ; i< urlArr.length;i++){
String _url = urlArr[i];
String _title = titleArr[i];
String _date = dateArr[i];
String _content = getContent(_url);
insertDB(_title,_date,_content);
}
}
}
public static String getContent(String _url) {
HttpClient httpClient = getHttpClient();
// System.out.println("http://www.szeb.edu.cn/"+_url);
//创建GET方法
GetMethod getMethod = new GetMethod("http://www.szeb.edu.cn/"+_url);
//使用系统提供的默认的恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
try {
//执行getMethod
int statusCode = httpClient.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
// System.err.println("抓取失败: " + getMethod.getStatusLine());
}
//读取内容
byte[] responseBody = getMethod.getResponseBody();
String result= readContent(new String(responseBody));
return result;
} catch (HttpException e) {
//发生致命的异常,可能是协议不对或者返回的内容有问题
logger.error(e);
} catch (IOException e) {
//发生网络异常
e.printStackTrace();
} catch (Exception e) {
logger.error(e);
} finally {
//释放
getMethod.releaseConnection();
}
return null;
}
/**
* 获得内容
* @param url
* @return
*/
private static String readContent(String string) {
Parser myParser;
// Parser parser;
myParser = Parser.createParser(string, "GB2312");
HtmlPage htmlPage = new HtmlPage(myParser);
try {
myParser.visitAllNodesWith(htmlPage);
} catch (ParserException e) {
logger.error(e);
}
//获得标题
// String textInPage = htmlPage.getTitle();
// System.out.println(textInPage);
NodeList nodelist ;
nodelist = htmlPage.getBody();
int size= nodelist.size();
Node[] nodes = nodelist.toNodeArray();
StringBuffer sb = new StringBuffer();
for(int i =5;i<size;i++){
// System.out.println(i+"@@@@@@@@@@@@@@@@@@@@"+nodes[i].toHtml().trim());
//获得内容
// System.out.println(i+"@@@@@@@@@@@@@@@@@@@@"+nodes[i].toPlainTextString());
//取得连接页面
sb.append(nodes[i].toPlainTextString());
}
return sb.toString();
}
/**
* 获得连接以及标题 日期
* @param url
* @return
*/
public void getUrlAndTitle(String url){
HttpClient httpClient = getHttpClient();
//创建GET方法
GetMethod getMethod = new GetMethod(url);
//使用系统提供的默认的恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
try {
//执行getMethod
logger.info("#############开始抓取网页源代码###################");
int statusCode = httpClient.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("抓取失败: " + getMethod.getStatusLine());
}
//读取内容
byte[] responseBody = getMethod.getResponseBody();
String result[]= readDateAndLink(new String(responseBody));
save(result);
} catch (HttpException e) {
//发生致命的异常,可能是协议不对或者返回的内容有问题
// System.out.println("没有连上网络");
logger.error(e);
} catch (IOException e) {
//发生网络异常
logger.error(e);
} catch (Exception e) {
logger.error(e);
} finally {
logger.info("#############抓取网页源代码结束###################");
// System.out.println("#############抓取网页源代码结束###################");
//释放
getMethod.releaseConnection();
}
}
//main.jsp?start=0&PageCount=100000&totalnum=156&colid=504
public void run() {
getUrlAndTitle(this.url);
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMaxDate() {
return maxDate;
}
public void setMaxDate(String maxDate) {
this.maxDate = maxDate;
}
}
分享到:
相关推荐
"抓取HTML数据到Excel" 从该文件中,我们可以提取以下知识点: 一、Excel中的Web查询功能 * Excel中的Web查询功能可以用来抓取HTML数据,从网页上提取数据并将其导入Excel表格中。 * 通过点选“Web查询”按钮,...
本文实例讲述了Python实现抓取HTML网页并以PDF文件形式保存的方法。分享给大家供大家参考,具体如下: 一、前言 今天介绍将HTML网页抓取下来,然后以PDF保存,废话不多说直接进入教程。 今天的例子以廖雪峰老师的...
在本项目中,“delphi写的 正则分析抓取html数据”是利用Delphi编程语言实现的一个应用,它专注于从HTML文档中提取所需的信息。Delphi是一种基于Object Pascal的集成开发环境(IDE),以其高效、跨平台和丰富的库...
抓取HTML数据通常是为了获取网页上的有用信息,如文章内容、产品价格、评论等。通过解析HTML源代码,我们可以定位到目标数据所在的标签、属性或者CSS选择器,然后使用正则表达式进行匹配和提取。 正则表达式是一种...
java的封装类,可以从指定网络地址,抓取地址中的网页,并分析抓取图片地址,下载到本地
用于Dart和Flutter的简单Web刮板一个非常基本的Web抓取工具实现,用于从网页中抓取html元素。 拉请求是最欢迎的。入门在您的pubspec.yaml根目录中添加: dependencies : web_scraper : 然后, import 'package:web_...
Excel作为一款强大的电子表格工具,提供了Web查询功能,使得用户无需编程就能直接从网页抓取数据。以下是如何利用Excel抓取Yahoo股票价格的详细步骤: 1. 首先,在Excel工作表中选择一个空白单元格,例如A29,作为...
### C#多线程网页内容抓取技术解析 #### 概述 在现代互联网应用开发中,网页抓取是一项常见的需求,特别是在数据挖掘、搜索引擎等领域。传统的单线程抓取方式往往因效率低下而不适用于大规模的数据采集场景。本文...
4. **处理JavaScript**:很多现代网站使用JavaScript动态加载内容,单纯抓取HTML可能无法获取完整数据。这时需要利用如Selenium WebDriver这样的工具模拟浏览器执行JavaScript,获取动态渲染后的页面内容。 5. **...
在这个场景中,我们将探讨如何抓取HTML和PDF文件,特别是利用Python中的工具,如`Fitz`和`PyMuPDF`来处理PDF文档,并将数据存储在数据框(DataFrame)中,这对于数据分析和后续处理非常有用。我们将使用Jupyter ...
httrack不仅能够抓取HTML页面,还包括图片、CSS、JavaScript等资源,使得本地的网站镜像尽可能地与原网站保持一致。 ### 安装与配置 httrack的安装过程相对简单,如压缩包中的`httrack-3.43-4.exe`文件所示,这是...
PHP编写的网页小偷程序是一种常见的网页数据抓取工具,它能够自动地从目标网站抓取HTML内容,并在本地生成相应的HTML文件。这样的程序对于数据分析、网站备份、内容聚合等场景非常有用。以下是对这个话题的详细解释...
这些爬虫不仅抓取HTML文本,还可能包含URL(统一资源定位符),用于跟踪网页间的链接关系;新闻内容,用于提供实时信息;多媒体,如音频和视频,增强搜索结果的多样性;以及图片,丰富搜索结果的视觉呈现。 标签中...
改造者帮助您获取类似json的html玛文<dependency> <groupId>... public interface Google { @POST ( " /topstories " ) Call< TopStoyResp> topstories (); }public class TopStoyResp { @S
在描述中提到的“重新组织了CSS文件,图片,动画”,意味着程序不仅抓取HTML内容,还处理了与之相关的样式表(CSS)、图像和动画资源。这一步骤通常涉及将外部CSS文件内联化,以便于本地查看,同时将图片和动画文件...
一个adobe air 开发的类似IE浏览器的小工具,可实现自动数据提交,自动登录网站,可自动模拟任何基于网页的操作,实现跨框架Frame嵌套层次的源码分析及对站点的节点操作!!! 欢迎加入Flex,air,as3技术开发讨论群:...
在IT领域,HTML网页内容抓取是一项常见的任务,特别是在数据挖掘、网络分析和自动化测试中。这个主题涉及到网络爬虫(Web Crawler)的概念,它允许我们自动化地从互联网上获取大量的HTML信息。以下是对“html网页...
总结来说,这个项目利用Jsoup和Java的强大力量,实现了高效、全面的网站抓取功能,不仅可以抓取HTML内容,还能抓取并保存相关资源,为离线浏览、数据备份和分析提供了便利。通过学习和掌握这种方法,开发者可以更好...
本实例主要介绍如何使用`urllib2`来抓取HTML页面资源,并将要抓取的网页地址存储在列表中,以便于管理和重用。 首先,我们需要理解`urllib2`模块的核心组件: 1. **`urlopen()`函数**:这是`urllib2`中的核心函数...