java爬虫抓取动态网页(每个类的源代码Java实现网络爬虫框架(一))

优采云 发布时间: 2021-10-07 23:11

  java爬虫抓取动态网页(每个类的源代码Java实现网络爬虫框架(一))

  免费资源网-

  目录Java实现网络爬虫框架一、各个类的功能介绍二、各个类Java实现网络爬虫框架的源码

  我目前正在从事与搜索相关的项目。我需要抓取互联网上的一些链接并将它们存储在索引库中。虽然有很多强大的开源爬虫框架,但是我抱着学习的态度写了一个简单的网络爬虫。了解原理。今天就给小伙伴们分享一下这个简单的爬虫程序!!

  一、各个类的作用DownloadPage.java的作用就是下载这个超链接的页面源代码。FunctionUtils.java的作用是提供不同的静态方法,包括:页面链接正则表达式匹配、URL链接获取判断是否创建文件、获取页面的Url并转换为标准化的Url、拦截目标网页源文件的内容。HrefOfPage.java 的作用是获取页面源代码的超链接。UrlDataHanding.java 的作用是集成各种类,实现url获取数据到数据处理类。UrlQueue.java 未访问的 Url 队列。VisitedUrlQueue.java 已访问的 URL 队列。二、各个类的源码

  DownloadPage.java 为此类使用 HttpClient 组件。

  

package com.sreach.spider;

import java.io.IOException;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

/**

* @author binghe

*/

public class DownloadPage {

/**

* 根据URL抓取网页内容

*

* @param url

* @return

*/

public static String getContentFormUrl(String url) {

/* 实例化一个HttpClient客户端 */

HttpClient client = new DefaultHttpClient();

HttpGet getHttp = new HttpGet(url);

String content = null;

HttpResponse response;

try {

/* 获得信息载体 */

response = client.execute(getHttp);

HttpEntity entity = response.getEntity();

VisitedUrlQueue.addElem(url);

if (entity != null) {

/* 转化为文本信息 */

content = EntityUtils.toString(entity);

/* 判断是否符合下载网页源代码到本地的条件 */

if (FunctionUtils.isCreateFile(url)

&& FunctionUtils.isHasGoalContent(content) != -1) {

FunctionUtils.createFile(

FunctionUtils.getGoalContent(content), url);

}

}

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

client.getConnectionManager().shutdown();

}

return content;

}

}

  此类的 FunctionUtils.java 方法是静态方法

<p>

package com.sreach.spider;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

* @author binghe

*/

public class FunctionUtils {

/**

* 匹配超链接的正则表达式

*/

private static String pat = "http://www\\.oschina\\.net/code/explore/.*/\\w+\\.[a-zA-Z]+";

private static Pattern pattern = Pattern.compile(pat);

private static BufferedWriter writer = null;

/**

* 爬虫搜索深度

*/

public static int depth = 0;

/**

* 以"/"来分割URL,获得超链接的元素

*

* @param url

* @return

*/

public static String[] divUrl(String url) {

return url.split("/");

}

/**

* 判断是否创建文件

*

* @param url

* @return

*/

public static boolean isCreateFile(String url) {

Matcher matcher = pattern.matcher(url);

return matcher.matches();

}

/**

* 创建对应文件

*

* @param content

* @param urlPath

*/

public static void createFile(String content, String urlPath) {

/* 分割url */

String[] elems = divUrl(urlPath);

StringBuffer path = new StringBuffer();

File file = null;

for (int i = 1; i < elems.length; i++) {

if (i != elems.length - 1) {

path.append(elems[i]);

path.append(File.separator);

file = new File("D:" + File.separator + path.toString());

}

if (i == elems.length - 1) {

Pattern pattern = Pattern.compile("\\w+\\.[a-zA-Z]+");

Matcher matcher = pattern.matcher(elems[i]);

if ((matcher.matches())) {

if (!file.exists()) {

file.mkdirs();

}

String[] fileName = elems[i].split("\\.");

file = new File("D:" + File.separator + path.toString()

+ File.separator + fileName[0] + ".txt");

try {

file.createNewFile();

writer = new BufferedWriter(new OutputStreamWriter(

new FileOutputStream(file)));

writer.write(content);

writer.flush();

writer.close();

System.out.println("创建文件成功");

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

/**

* 获取页面的超链接并将其转换为正式的A标签

*

* @param href

* @return

*/

public static String getHrefOfInOut(String href) {

/* 内外部链接最终转化为完整的链接格式 */

String resultHref = null;

/* 判断是否为外部链接 */

if (href.startsWith("http://")) {

resultHref = href;

} else {

/* 如果是内部链接,则补充完整的链接地址,其他的格式忽略不处理,如:a href="#" rel="external nofollow" */

if (href.startsWith("/")) {

resultHref = "http://www.oschina.net" + href;

}

}

return resultHref;

}

/**

* 截取网页网页源文件的目标内容

*

* @param content

* @return

*/

public static String getGoalContent(String content) {

int sign = content.indexOf("

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线