`
isiqi
  • 浏览: 16496869 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

自己动手写CSDN博客提取器源码分析之四:抓取网页源码

 
阅读更多

前几天公布了保存文件的一些源码,今天我发一下怎么抓取网页源码。学过java和C的都知道,java抓取源码要比C语言简单的多,很多东西java都封装好了,只需要调用URL这个类的一些接口就可以获得我们需要的一些资源,而不像C一样,自己构造包,自己再发送,自己要非常懂HTML的一些发送和接收消息包的格式,相当的麻烦。。。下面就是我工程里面的获取源码的类(精简了)。

/**
 * 
 */
package com.wyp.HTML;

/**
 * @author w397090770
 * Create Data: 2012-7-17
 * Email: wyphao.2007@163.com
 * 
 * 版权所有,翻版不究,但是在修改本程序的时候务必加上这些注释。谢谢 
 * 仅用于学习交流之用
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

//import org.apache.log4j.Logger;
//import org.apache.log4j.PropertyConfigurator;

import com.wyp.utils.BlogReturnStatus;
import com.wyp.utils.Pair;

/**
 **网页抓取 通用类
 * 
 * @author
 */

public class SpiderHTML {
	// 定义一个logger
	//static Logger logger = Logger.getLogger(SpiderHTML.class.getName());
	//用户,用来生成保存爬取到文件的文件夹
	public static String userName = null;
	//保存路径
	public static String pathText = null;
	public SpiderHTML() {
		// 加载log4j.properties配置文件
		//PropertyConfigurator.configure("log4j.properties");
	}
	
	/**
	 * 抓取页面返回的几个状态
	 * */
	/**
	 *网页抓取方法
	 * 
	 * @param urlString
	 *            要抓取的url地址
	 * @param charset
	 *            网页编码方式
	 * @param timeout
	 *            超时时间
	 * @param type
	 * 			  获取网页的格式 0 网页 1 图片
	 * @param userName
	 *            博客用户的名称
	 * @return 抓取的网页内容和读取网页的返回状态
	 * @throws IOException
	 *             抓取异常
	 */
	public static Pair<String, BlogReturnStatus> GetWebContent(String urlString, final String charset,
			int timeout, int type) throws IOException {
		if (urlString == null || urlString.length() == 0) {
			return null;
		}

		//System.out.println("***********************" + urlString);
		//String imgAbsolutePath = null;
		BlogReturnStatus blogReturnStatus = null;
		urlString = (urlString.startsWith("http://") || urlString
				.startsWith("https://")) ? urlString : ("http://" + urlString)
				.intern();
		URL url = new URL(urlString);

		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		
		// 只接受text/html类型,当然也可以接受图片,pdf,*/*任意,就是tomcat/conf/web里面定义那些
		conn.setRequestProperty("Accept", "text/html");
		// 设置超时为timeout毫秒
		conn.setConnectTimeout(timeout);
		try {
			// 如果失败
			if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
				//logger.warn("Connection failed! URL: [" + urlString + "]");
				blogReturnStatus = BlogReturnStatus.TIME_OUT;
				return new Pair<String, BlogReturnStatus>(null, blogReturnStatus);
			}
		} catch (IOException e) {
			// e.printStackTrace();
			//logger.error(e.toString() + " URL: [" + urlString + "]");
			blogReturnStatus = BlogReturnStatus.FAILURE;
			return new Pair<String, BlogReturnStatus>(null, blogReturnStatus);
		}
		//logger.info("Start reading [" + urlString + "]");
		// 打开输入流
		InputStream input = conn.getInputStream();
		// 设置流读取函数,并设置字符集为charset
		BufferedReader reader = new BufferedReader(new InputStreamReader(input,
				charset));

		String line = null;
		// 用来存储读取到的网页
		StringBuffer sb = new StringBuffer();
		
		switch(type){
		case 0:
			// 直到读去网页源码结束
			while ((line = reader.readLine()) != null) {
				sb.append(line).append(System.getProperty("line.separator"));
			}
			break;
		case 1:
			sb.append(processImg(input, urlString));
			break;
		default:
			System.err.println("Unsupport File Type!");
			//logger.error("Unsupport File Type!");
			return null;
		}
		
		
		
		//logger.info("End reading [" + urlString + "]");
		// 关闭读对象
		if (reader != null) {
			reader.close();
		}
		if (conn != null) {
			conn.disconnect();
		}
		blogReturnStatus = BlogReturnStatus.OK;
		//System.out.println(sb);
		return new Pair<String, BlogReturnStatus>(sb.toString(), blogReturnStatus);

	}
	
	/**
	 * @param str 获取到的网页文件
	 * 
	 *  本函数用来保存图片到对应用户的img文件夹下面
	 */
	private static String  processImg(InputStream is, String urlString){
		String dirs = pathText + File.separator + userName + File.separator + "img" + File.separator;
		File file = new File(dirs);
		//目录不存在,创建它
		if(!file.exists()){
			file.mkdirs();
		}
		
		//得到图片的名称和格式
		String imgNameAndType = urlString.substring(urlString.lastIndexOf("/") + 1);
		
		file = new File(dirs + imgNameAndType);
		//文件不存在,则创建
		if(!file.exists()){
			try {
				file.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				//logger.error("Create " + imgNameAndType + "Failure!");
				e.printStackTrace();
				return dirs + imgNameAndType;
			}
			
			//logger.info("Starting Save: [" + imgNameAndType + "]");
			OutputStream os = null;
			try {
				os = new FileOutputStream(file);
				int bytes = -1;
				while((bytes = is.read()) != -1){
					os.write(bytes);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				try {
					is.close();
					os.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			//logger.info("End Save: [" + imgNameAndType + "]");
		}else{
			//logger.info("The file [ "+ imgNameAndType +"] is exist!");
		}
		
		
		return dirs + imgNameAndType;
	}

	/**
	 * 类测试函数
	 * 
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		Pair<String, BlogReturnStatus>pair  = GetWebContent("http://blog.csdn.net/w397090770", "utf-8", 5000, 0);
		System.out.println(pair.getSecond());
	}
}

这个类也比较简单把,这个类可以来获取网页源码以及图片,注意看获取图片和网页源码的方法不同点。下面两个类是上面要用到的。

package com.wyp.utils;

/**
 * @author w397090770 
 * Create Data 2012-7-7 
 * Email: wyphao.2007@163.com
 * 版权所有,翻版不究,但是在修改本程序的时候务必加上这些注释。谢谢 
 * 仅用于学习交流之用
 */
public class Pair<T1, T2> {

	private T1 first;
	private T2 second;

	/**
	 * 
	 */
	public Pair() {
		// TODO Auto-generated constructor stub
		first = null;
		second = null;
	}

	/**
	 * @param first
	 *            first part
	 * @param second
	 *            second part
	 */
	public Pair(T1 first, T2 second) {
		this.first = first;
		this.second = second;
	}

	public Pair(Pair<T1, T2> pair) {
		this.first = pair.getFirst();
		this.second = pair.getSecond();
	}

	public Pair<T1, T2> make_pair(T1 first, T2 second) {
		Pair<T1, T2> pair = new Pair<T1, T2>(first, second);
		return pair;
	}

	/**
	 * @return the first
	 */
	public T1 getFirst() {
		return first;
	}

	/**
	 * @param first
	 *            the first to set
	 */
	public void setFirst(T1 first) {
		this.first = first;
	}

	/**
	 * @return the second
	 */
	public T2 getSecond() {
		return second;
	}

	/**
	 * @param second
	 *            the second to set
	 */
	public void setSecond(T2 second) {
		this.second = second;
	}

}
package com.wyp.utils;


/**
 * @author w397090770
 * Create Data 2012-7-6
 * Email: wyphao.2007@163.com
 * 
 * 版权所有,翻版不究,但是在修改本程序的时候务必加上这些注释。谢谢 
 * 仅用于学习交流之用
 * 
 * 本类是用来标志获取博客返回地址的状态
 */
public enum BlogReturnStatus {
	//成功获取网页
	OK, 
	//获取网页源码超过设置的时间
	TIME_OUT, 
	//获取网页异常
	FAILURE
}
分享到:
评论

相关推荐

    CSDN博客下载器

    CSDN博客下载器通过解析网页源代码,提取出这些信息,并将它们以合适的格式存储到本地,以便用户在无网络连接的情况下也能访问。 **核心功能** 1. **输入用户名获取博客列表**:用户只需提供CSDN的用户名,下载器...

    CSDN博文搜索引擎源码

    【CSDN博文搜索引擎源码】是一个用于搜索CSDN博客文章的系统,它整合了多个关键组件,帮助用户快速定位到所需的技术信息。这个源码涵盖了从数据爬取、文本处理到索引构建和查询执行的全过程,是学习和研究搜索引擎...

    抓取CSDN博客以及简书博客的文章合并成kindle观看的Mobi格式

    标题中的“抓取CSDN博客以及简书博客的文章合并成kindle观看的Mobi格式”涉及到了几个关键的技术知识点: 1. **网络爬虫**:为了从CSDN和简书博客抓取文章,首先我们需要使用网络爬虫技术。Python提供了一些强大的...

    WebMagic抓取CSDN博客通过JDBC保存到数据库中去

    本项目是关于如何使用WebMagic抓取CSDN(China Software Developer Network)博客的内容,并通过JDBC(Java Database Connectivity)将其保存到数据库中的实例。下面将详细介绍这个过程涉及的关键知识点。 1. **...

    Java爬取CSDN博客源码

    【Java爬取CSDN博客源码】是一个关于利用Java编程语言进行网络数据抓取的实践项目,主要涉及的技术领域是Web爬虫和大数据处理。在这个项目中,开发者编写了一个爬虫程序,虽然存在一些小问题,但基本功能已经实现,...

    C#源码做的新浪博客采集器,仅供C#学习用

    标题中的"C#源码做的新浪博客采集器"指的是一个使用C#编程语言编写的程序,其功能是自动抓取和处理新浪博客上的信息。这样的工具通常用于数据分析、内容挖掘或者研究目的,它可以帮助用户批量获取博客文章的内容、...

    C#游戏辅助制作教程-通用修改器源码-抓取内存基址

    本教程主要针对C#初学者,旨在通过学习通用修改器的源码,让大家了解并掌握如何抓取内存基址这一关键技能。 内存基址是游戏数据在计算机内存中的位置,理解并能够获取这些地址对于制作游戏辅助至关重要。在C#中,...

    Java爬虫入门教程:CSDN文章抓取全攻略.zip

    Java爬虫技术是一种用于自动化网页数据抓取的编程方法,主要应用于数据分析、信息提取和搜索引擎优化等领域。在Java中,我们可以使用Jsoup、HttpURLConnection、Apache HttpClient等库来实现爬虫功能。本教程以CSDN...

    csdn文章转换为markdown格式

    在IT行业中,这种转换工具非常有用,特别是对于开发者和博主,他们可能经常在CSDN上阅读和学习技术文章,而Markdown格式则更便于他们在自己的编辑器或版本控制系统(如Git)中管理和编辑这些内容。以下是这个小工具...

    C# 使用Selenium模拟浏览器获取CSDN博客内容

    在IT领域,自动化测试和网页抓取是两个重要的实践领域,而C#结合Selenium与Edge浏览器的使用,为开发者提供了高效且灵活的工具来实现这些功能。本篇将深入探讨如何利用C#和Selenium WebDriver模拟浏览器行为,特别是...

    提取文件中百度云链接与提取码的java源码

    这个文件可能是Java源代码,用于将从网页抓取的原始链接和提取码数据进行整理和转换,以便后续的下载过程。 总之,通过Java编程,结合`Jsoup`库,我们可以有效地从网页中提取百度云的链接和提取码,进而实现批量...

    爬取淘宝商品数据项目的源代码

    这可能涉及到XPath或CSS选择器的使用,以及对抓取到的字符串进行清洗和格式化。 3. 模拟登录与Cookie管理:淘宝网站通常需要用户登录后才能查看某些特定商品信息,因此爬虫可能需要模拟登录过程,发送登录请求并...

    vc搜索引擎源码

    爬虫负责抓取网页,索引器构建索引库,查询处理器处理用户的搜索请求,排名算法则决定搜索结果的排列顺序。 二、VC++环境与编程 VC++是Microsoft开发的C++集成开发环境,支持Windows平台上的应用程序开发。使用...

    采集蛙-源码

    【标题】"采集蛙-源码"所涉及的知识点主要集中在网页数据抓取和JavaFX图形用户界面开发上。这是一个使用Java和Jsoup库构建的项目,用于自动化地从网站中抓取源代码,体现了对网络爬虫技术的运用。 1. **网页数据...

    csdn2md:利用爬虫爬取指定用户的CSDN博客文章转为md格式,目的是完成博客迁移

    `csdn2md`是一个基于Java实现的工具,它的主要功能是抓取CSDN(中国最大的开发者社区)上指定用户的所有博客文章,并将这些文章转换成Markdown(md)格式。这个项目对于那些希望将自己的CSDN博客迁移到其他支持...

    怎么下载整个网站

    网站抓取是一种技术,用于自动提取网站上的数据。这通常通过编程语言如Python的BeautifulSoup或Scrapy库来实现,它们可以解析HTML和XML文档,获取所需内容。 2. **网页爬虫(Web Crawler)**: 网页爬虫是抓取...

    Java爬虫详细完整源码实例

    Java爬虫技术是一种在互联网上自动获取网页信息的程序,它是大数据分析、搜索引擎优化和内容监控等领域的基础工具。在这个“Java爬虫详细完整源码实例”中,我们可以深入理解如何利用Java语言来构建一个功能完备的...

    天猫(淘宝)数据爬取源码(可直接使用).zip

    本资源包含一个名为"天猫(淘宝)数据爬取源码(可直接使用).zip"的压缩包,其中包含了用于爬取天猫和淘宝平台商品数据的Python源代码。主要涉及的知识点包括网络爬虫技术、Python编程语言以及数据存储。 1. **...

    Lucene+Heritrix 源码

    **Lucene 和 Heritrix 源码分析** 在IT领域,搜索引擎的开发是一项复杂而重要的任务,它涉及到大量的文本处理、索引构建以及高效的查询算法。Lucene 和 Heritrix 是两个开源工具,分别专注于搜索的核心算法和网页...

    CSDNReader2005 CSDN论坛阅读器 CSDNReader附全部源代码.zip

    6. **网络通信与数据抓取**:软件需要从CSDN论坛获取实时信息,这就涉及到网络通信和网页抓取技术。开发者可以通过源代码学习如何使用HTTP协议进行数据交换,以及如何解析HTML页面来提取所需信息。 总之,...

Global site tag (gtag.js) - Google Analytics