前几天公布了保存文件的一些源码,今天我发一下怎么抓取网页源码。学过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博客下载器通过解析网页源代码,提取出这些信息,并将它们以合适的格式存储到本地,以便用户在无网络连接的情况下也能访问。 **核心功能** 1. **输入用户名获取博客列表**:用户只需提供CSDN的用户名,下载器...
【CSDN博文搜索引擎源码】是一个用于搜索CSDN博客文章的系统,它整合了多个关键组件,帮助用户快速定位到所需的技术信息。这个源码涵盖了从数据爬取、文本处理到索引构建和查询执行的全过程,是学习和研究搜索引擎...
标题中的“抓取CSDN博客以及简书博客的文章合并成kindle观看的Mobi格式”涉及到了几个关键的技术知识点: 1. **网络爬虫**:为了从CSDN和简书博客抓取文章,首先我们需要使用网络爬虫技术。Python提供了一些强大的...
本项目是关于如何使用WebMagic抓取CSDN(China Software Developer Network)博客的内容,并通过JDBC(Java Database Connectivity)将其保存到数据库中的实例。下面将详细介绍这个过程涉及的关键知识点。 1. **...
【Java爬取CSDN博客源码】是一个关于利用Java编程语言进行网络数据抓取的实践项目,主要涉及的技术领域是Web爬虫和大数据处理。在这个项目中,开发者编写了一个爬虫程序,虽然存在一些小问题,但基本功能已经实现,...
标题中的"C#源码做的新浪博客采集器"指的是一个使用C#编程语言编写的程序,其功能是自动抓取和处理新浪博客上的信息。这样的工具通常用于数据分析、内容挖掘或者研究目的,它可以帮助用户批量获取博客文章的内容、...
本教程主要针对C#初学者,旨在通过学习通用修改器的源码,让大家了解并掌握如何抓取内存基址这一关键技能。 内存基址是游戏数据在计算机内存中的位置,理解并能够获取这些地址对于制作游戏辅助至关重要。在C#中,...
Java爬虫技术是一种用于自动化网页数据抓取的编程方法,主要应用于数据分析、信息提取和搜索引擎优化等领域。在Java中,我们可以使用Jsoup、HttpURLConnection、Apache HttpClient等库来实现爬虫功能。本教程以CSDN...
在IT行业中,这种转换工具非常有用,特别是对于开发者和博主,他们可能经常在CSDN上阅读和学习技术文章,而Markdown格式则更便于他们在自己的编辑器或版本控制系统(如Git)中管理和编辑这些内容。以下是这个小工具...
在IT领域,自动化测试和网页抓取是两个重要的实践领域,而C#结合Selenium与Edge浏览器的使用,为开发者提供了高效且灵活的工具来实现这些功能。本篇将深入探讨如何利用C#和Selenium WebDriver模拟浏览器行为,特别是...
这个文件可能是Java源代码,用于将从网页抓取的原始链接和提取码数据进行整理和转换,以便后续的下载过程。 总之,通过Java编程,结合`Jsoup`库,我们可以有效地从网页中提取百度云的链接和提取码,进而实现批量...
这可能涉及到XPath或CSS选择器的使用,以及对抓取到的字符串进行清洗和格式化。 3. 模拟登录与Cookie管理:淘宝网站通常需要用户登录后才能查看某些特定商品信息,因此爬虫可能需要模拟登录过程,发送登录请求并...
爬虫负责抓取网页,索引器构建索引库,查询处理器处理用户的搜索请求,排名算法则决定搜索结果的排列顺序。 二、VC++环境与编程 VC++是Microsoft开发的C++集成开发环境,支持Windows平台上的应用程序开发。使用...
【标题】"采集蛙-源码"所涉及的知识点主要集中在网页数据抓取和JavaFX图形用户界面开发上。这是一个使用Java和Jsoup库构建的项目,用于自动化地从网站中抓取源代码,体现了对网络爬虫技术的运用。 1. **网页数据...
`csdn2md`是一个基于Java实现的工具,它的主要功能是抓取CSDN(中国最大的开发者社区)上指定用户的所有博客文章,并将这些文章转换成Markdown(md)格式。这个项目对于那些希望将自己的CSDN博客迁移到其他支持...
网站抓取是一种技术,用于自动提取网站上的数据。这通常通过编程语言如Python的BeautifulSoup或Scrapy库来实现,它们可以解析HTML和XML文档,获取所需内容。 2. **网页爬虫(Web Crawler)**: 网页爬虫是抓取...
Java爬虫技术是一种在互联网上自动获取网页信息的程序,它是大数据分析、搜索引擎优化和内容监控等领域的基础工具。在这个“Java爬虫详细完整源码实例”中,我们可以深入理解如何利用Java语言来构建一个功能完备的...
本资源包含一个名为"天猫(淘宝)数据爬取源码(可直接使用).zip"的压缩包,其中包含了用于爬取天猫和淘宝平台商品数据的Python源代码。主要涉及的知识点包括网络爬虫技术、Python编程语言以及数据存储。 1. **...
**Lucene 和 Heritrix 源码分析** 在IT领域,搜索引擎的开发是一项复杂而重要的任务,它涉及到大量的文本处理、索引构建以及高效的查询算法。Lucene 和 Heritrix 是两个开源工具,分别专注于搜索的核心算法和网页...
6. **网络通信与数据抓取**:软件需要从CSDN论坛获取实时信息,这就涉及到网络通信和网页抓取技术。开发者可以通过源代码学习如何使用HTTP协议进行数据交换,以及如何解析HTML页面来提取所需信息。 总之,...