前几天公布了保存文件的一些源码,今天我发一下怎么抓取网页源码。学过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的源码结构修改了。程序只是用于学习之用,严禁用于非法目的而照成CSDN服务器过载。 由于生成PDF的时候需要依赖...
自己动手写编译器链接器PDF及源码 想玩编译器的可以下载
博客园和CSDN博客过滤器源码 源码描述: 功能分析 1、整合博客园首页和CSDN热门博客 2、添加过滤条件,如:标题、内容、推荐数范围、评论数范围、阅读数范围、源博客页数(如搜索博客园前几页的数据)等 3、博客...
抓取CSDN博客文章的简单爬虫python源码
我的CSDN博客地址http://blog.csdn.net/qq_23100787 这是我关于字符串切割的一篇博文的工程,贴上来供读者借鉴运行
《自己动手写网络爬虫》PDF书及源码,罗刚著作,很有实践价值。
小巫CSDN博客客户端源码,配套博文可以到http://blog.csdn.net/wwj_748/article/details/39134151进行参考
好消息:CSDN博客下载器v2.0版本增加导出PDF文件功能,方便查看图片与文章。 在无网络环境,也可以看自己的一些文章。当然如果您发现CSDN博客的一些文章值得收藏,你也可以使用本软件轻松的下载到您的电脑。 该版本...
于渊的自己动手写操作系统真正高清版,原来csdn上有一个号称高清的版本,但是没有part1,太坑人了,后来自己花了好长时间才下到,不敢独享,特发出来与大家共同学习!
情人节七夕节520程序员表白源码 效果博客对应表白网页12 地址:https://blog.csdn.net/m0_37916936/article/details/116608659
PHP博客源码PHP博客源码PHP博客源码PHP博客源码
本工具几乎支持国内所有知名博客的导出功能。 支持3种导出方式:个人博客、博客专栏、指定URL。 支持5种导出格式:CHM、PDF、HTML、TXT、EPUB。
网页的抓取和正文提取 通过爬虫工具爬取网页(至少1000个,其中包含附件的网页不少于100个,多线程实现爬虫可加分),然后提取网页标题和网页正文,以及网页中的附件并保存附件到本地json文件中。 分词处理、去停用...
Python爬虫源码大放送:抓取数据,轻松搞定! 想轻松抓取网站数据,却苦于技术门槛太高?别担心,这些源码将助你轻松搞定数据抓取,让你成为网络世界的“数据侠盗”。 它们还具有超强的实用价值。无论你是想要分析...
类似与csdn博客里面的代码高亮显示支持 它可以在网页中对各种程序源代码语法进行加亮显示。支持当前流行的各种编程语言:C#、CSS、C++、Delphi、Java、JavaScript、PHP、Python、Ruby、SQL、Visual Basic、XML / ...
Mir2游戏源码分析 完整源码下载: http://download.csdn.net/source/3025342
这是博客交流CSDN下载助手的第二篇博客的源码 ,已经实现csdn的登录。界面跟csdn登录界面基本一致。更过qt资源,欢迎关注我的博客http://blog.csdn.net/wu5151
根据url链接获取链接页面前端源码并下载到本地一个单独的文件夹,包括html、css、js及图片资源,小巧且高效,可供你日后快速浏览这个网站。
WebMagic抓取CSDN博客通过JDBC保存到数据库中去