import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 只会爬取在该域名域内的链接(二级,三级)
* 图片资源可以去取第三方网站的内容
* Created:2010-6-22
* @author:Gerry
* @version:
*/
public class WebProcess {
private String urlName ; //链接原型
private String urlFileName; //重命名后的文件名
private String html ; //html内容
public String getUrlFileName() {
return urlFileName;
}
public void setUrlFileName(String urlFileName) {
this.urlFileName = urlFileName;
}
public String getHtml() {
return html;
}
public void setHtml(String html) {
this.html = html;
}
public String getUrlName() {
return urlName;
}
public void setUrlName(String urlName) {
this.urlName = urlName;
}
public ByteArrayOutputStream getAddressContext(String str_url) throws Exception {
URLConnection conn = null;
String str_urlhead = "http://" ;
str_url = str_urlhead + str_url ;
URL url = new URL(str_url);
System.setProperty("http.proxyHost", "openproxy.xxxxxx.com");//setting proxy host
System.setProperty("http.proxyPort", "8080");//setting proxy host port
conn = url.openConnection();
if (conn == null){return null;}
conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/2008052906 Firefox/3.0");
conn.setUseCaches(false);
InputStream ins = conn.getInputStream();
ByteArrayOutputStream outputstream = new ByteArrayOutputStream();
byte[] str_b = new byte[1024];
int i = -1;
while ((i=ins.read(str_b)) > 0){
outputstream.write(str_b,0,i);
}
ins.close();
outputstream.close();
//all_content = outputstream.toString("UTF-8");
//return new String(all_content.getBytes("ISO8859-1"));
return outputstream;
}
private int writeFolder(String path){
File file = new File(path);
file.mkdir();
return 1 ;
}
/**
* 写文件的实现类
* content==null 的时候那么写入二进制文件
* content不为null 的时候就写入文本文件
*/
private int writeFile(String path,String content,ByteArrayOutputStream outputstream) throws IOException{
File f = new File(path);
f.createNewFile();
FileOutputStream fout = new FileOutputStream(f);
if(content==null){
fout.write(outputstream.toByteArray());
}else{
fout.write(content.getBytes("utf-8"));
}
fout.flush();
fout.close();
return 1 ;
}
/**
* 关于替换资源的几种情况(不保留原始网站目录结构)递归调用
* 一级目录 1.js 外部引用文件
* 一级目录 2.css 外部引用文件
* 一级目录 3.<img src="" width=0 height=0 /> 标签中引用的图片
* 一级目录 4.关于css中引用的图片
* 二级目录 1.<a href="#"></a> 标签中重写url链接
* @param filePath
* type = 1 (src 资源文件)
* type = 2 (href 二级,其他文件) link href="" CSS样式表
* @param
* 重命名规则
* 1.http://hi.csdn.net/js/jquery-1.4.2.min.js
* /用 - 符号替换
* http:// 替换为空
* 2.重命名后为 http--hi.csdn.net-js-jquery-1.4.2.min.js
* @return
* @throws Exception
* Created:2010-6-22
* @author:Gerry
*/
private List<WebProcess> parseHtmlContent(String type,String html,List<WebProcess> list) throws Exception{
if(type==null){type="1";}
if(type.equals("1")){
String regEx = "src=['\"]http://?([^'\"<>]+)['\"]?";
Pattern p = Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(html);
if(m.find()){
String group1 = m.group(1);
if(group1.indexOf("/")>-1){//判断是否为未重写以前的
WebProcess webProcess = new WebProcess();
String tempTr = m.group(0);
tempTr = tempTr.replaceAll("http://", "");
tempTr = tempTr.replaceAll("HTTP://", "");
tempTr = tempTr.replaceAll("/", "-");
String tempTr2 = m.group(1);
tempTr2 = tempTr2.replaceAll("/", "-");
webProcess.setUrlName(m.group(1));//原始http:url链接名字
webProcess.setUrlFileName(tempTr2);//重命名后的名字
list.add(webProcess);
html = m.replaceFirst(tempTr);//修改源文件中的资源链接
return parseHtmlContent("1",html,list);
}else{
return parseHtmlContent("1",html,list);
} }else {
WebProcess webProcess = new WebProcess();
webProcess.setHtml(html);
list.add(webProcess);
return list ;
}
}else if(type.equals("2")){
}
return list ;
}
/**
* 核心业务方法
* @param webname
* @return
* @throws Exception
* Created:2010-6-22
* @author:Gerry
*/
private int kernelBusiness(String webname) throws Exception{
WebProcess process = new WebProcess();
System.out.println("正在读取远程文件:"+webname+"...");
String content = process.getAddressContext(webname).toString("UTF-8");
System.out.println("远程文件读取完毕!");
List<WebProcess> list = process.parseHtmlContent("1",content,new ArrayList<WebProcess>());
if(list!=null && list.size()>0){
content = list.get(list.size()-1).getHtml();
}
System.out.println("一共是:"+list.size());
//对本地写文件的相关操作
System.out.println("正在写入文件index.html到本地...");
String localAddress = "F:\\"+webname ;//修改磁盘地址
process.writeFolder(localAddress);
process.writeFile(localAddress+"\\index.html",content,null);
System.out.println("文件index.html保存完毕!"); //对本地写主页中的资源文件
for(int i=0;i<list.size();i++){
WebProcess webprocess = (WebProcess)list.get(i);
String resourceUrl = webprocess.getUrlName();
System.out.println("正在读取远程文件:"+resourceUrl+"...");
ByteArrayOutputStream outputstreamResource = new ByteArrayOutputStream();
try{
outputstreamResource = process.getAddressContext(resourceUrl);
}catch(Exception ex){
System.out.println("远程连接出现异常!!!请求http://"+resourceUrl+"失败!");
}
System.out.println("远程文件读取完毕!");
System.out.println("正在写入文件"+resourceUrl+"到本地...");
try{
//判断输出的是文本还是二进制文件流
if(webprocess.getUrlFileName()!=null){
if(webprocess.getUrlFileName().length()>3){
String temp_urlfilename = webprocess.getUrlFileName();
String temp_lastfilesub = temp_urlfilename.substring(temp_urlfilename.length()-3,temp_urlfilename.length());
temp_lastfilesub = temp_lastfilesub.toUpperCase();
if(temp_lastfilesub.equals(".JS") || temp_lastfilesub.equals("CSS")){
process.writeFile(localAddress+"\\"+webprocess.getUrlFileName(),outputstreamResource.toString("UTF-8"),null);
}else if(temp_lastfilesub.equals("SWF") || temp_lastfilesub.equals("GIF") || temp_lastfilesub.equals("JPG") || temp_lastfilesub.equals("PNG")){
process.writeFile(localAddress+"\\"+webprocess.getUrlFileName(),null,outputstreamResource);
}
}
}
}catch(Exception ex){
System.out.println("文件写入出现异常!!!文件"+webprocess.getUrlFileName()+"失败!");
}
System.out.println("文件"+resourceUrl+"保存完毕!");
}
return 1 ;
}
public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
System.out.println("开始执行时间:=="+startTime);
////////////////////////////////////////////////////
String args1 = "www.csdn.net" ;
WebProcess process = new WebProcess();
process.kernelBusiness(args1);
///////////////////////////////////////////////////
long endTime = System.currentTimeMillis();
long wasterTime = endTime - startTime;
System.out.println("结束执行时间:=="+endTime);
System.out.println("一共执行了时间:=="+wasterTime);//6172 ms
}
}
分享到:
相关推荐
在Java语言中实现网页爬虫,可以利用其强大的类库和跨平台特性,使得爬虫程序具有高效、稳定的特点。本项目是一个基于Java的网页爬虫1.5版本,主要关注聚焦爬虫的设计和实现,旨在高效地抽取特定主题的网页内容。 ...
JavaSpider 1.6是一款基于Java实现的网页爬虫软件,专为聚焦爬虫设计,旨在从互联网上抓取特定网站的源代码内容并进行存储。这个1.6版本是多个版本的集合,包含了从1.1到1.6的所有更新和改进,使得爬虫功能更加完善...
在这个"java网页爬虫demo"中,我们重点关注的是使用Java语言实现的一个完整示例。主类是"SpiderWidth.java",这表明该程序的核心逻辑在其中。 首先,我们要理解Java爬虫的基本构成。一个简单的Java爬虫通常包括以下...
JavaSpider 1.4版本是一款基于Java开发的聚焦爬虫工具,专门设计用于高效、定向地收集网络数据。 在JavaSpider 1.4中,主要涉及以下关键技术点: 1. **URL管理**:爬虫首先需要知道从哪里开始爬取。它通常会有一个...
Jediael_v0.01,作为一款搜索引擎的早期版本,是Java技术在信息检索领域的实践应用。Java,作为一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库,成为了构建复杂系统,尤其是网络服务如搜索引擎...
Java开发的网页爬虫是一种利用编程技术自动化抓取互联网上信息的工具,主要应用于数据分析、搜索引擎索引、市场研究等领域。在Java中实现网页爬虫,通常涉及到以下几个关键知识点: 1. **网络请求库**:Java中常用...
Java语言在IT行业中被广泛应用于各种领域,其中就包括网络数据抓取,即网页爬虫。本示例项目“基于Java语言的BT网页内容爬虫程序”提供了如何使用Java进行网页抓取的具体实践,这对于数据分析、网站监控或者信息检索...
综上所述,"Java实现的网页爬虫1.5版本聚焦爬虫抽取网页html"是一个涉及网络编程、HTML解析、数据库操作和算法策略的综合项目。通过不断优化和改进,这个爬虫可以成为一个强大的信息获取工具,服务于各种数据分析和...
java网页爬虫 java网页爬虫 java网页爬虫 java网页爬虫
Java网页爬虫是一种用于自动化地抓取互联网上信息的程序,尤其在大数据分析、搜索引擎索引和内容监控等领域有着广泛的应用。在这个特定的压缩包文件中,包含了一个名为"Robot"的Java类,用于实现抓取网页上所有链接...
在Java编程语言中实现网络爬虫,可以充分利用其强大的面向对象特性以及丰富的库支持。以下将详细介绍网络爬虫的基本原理、Java实现的关键技术和相关知识点。 1. **网络爬虫基础** 网络爬虫通过模拟浏览器发送HTTP...
标题中的“知乎爬虫最新版java”指的是一个使用Java编程语言编写的爬虫程序,专门用于抓取知乎网站上的用户详细信息。这个爬虫可能是为了数据挖掘、数据分析或研究目的而设计的,它能帮助用户高效地获取大量知乎用户...
运行Java应用,可直接在网页进行爬虫任务配置,可对爬虫任务进行定时触发,爬取内容保存至本地或者数据库中一个Java语言写的自动化爬虫工具。运行Java应用,可直接在网页进行爬虫任务配置,可对爬虫任务进行定时触发...
Java爬虫是一个强大的工具,用于自动化地从互联网上获取数据,尤其在大数据分析、网站监控和内容抓取等领域中有着广泛的应用。在这个Java爬虫实例中,我们将深入探讨其核心概念和技术,帮助你理解如何使用Java来编写...
Java作为一种广泛使用的编程语言,在爬虫开发领域也占据着重要的地位。Java爬虫不仅可以帮助我们高效地抓取数据,还能对数据进行清洗、存储等操作。 #### 二、Java爬虫基础知识 ##### 2.1 HTTP协议 HTTP...
在这个“Java爬虫详细完整源码实例”中,我们可以深入理解如何利用Java语言来构建一个功能完备的网络爬虫。下面将详细介绍其中可能涉及的关键知识点。 1. **网络请求库**:在Java爬虫中,我们通常会用到如...
本文是一份关于使用Java语言进行网页数据抓取的教程,主要介绍了使用Apache HttpClient这个库来完成网络请求和数据获取的操作。Apache HttpClient是一个支持HTTP协议的客户端工具,被广泛应用于Java爬虫开发中,帮助...
在本Java搜索及网页爬虫视频教程中,你将深入学习如何使用Java语言构建高效的搜索引擎和网络爬虫。这些技术是现代数据驱动应用的核心部分,能够帮助开发者从互联网上抓取和处理海量信息。 首先,我们要理解Java搜索...
JAVA爬虫是指使用JAVA编程语言来实现网页爬虫的技术。爬虫是指模拟用户的行为来自动获取网络资源的程序。JAVA爬虫可以用来自动登录淘宝网,实现自动登录淘宝网的功能。 在本例中,我们使用了Selenium工具来实现自动...
以上是关于"网络爬虫源代码Java版本"的一些主要知识点,学习和实践这些内容可以帮助你更好地理解和构建自己的Java网络爬虫项目。通过下载并研究提供的源代码,你可以更深入地了解这些技术的实际应用。