【搜索引擎Jediael开发4】V0.01完整代码


截止目前,已完成如下功能:

1、指定某个地址,使用HttpClient下载该网页至本地文件

2、使用HtmlParser解释第1步下载的网页,抽取其中包含的链接信息

3、下载第2步的所有链接指向的网页至本地文件


下一步需要完成的功能:

1、创建用于保存种子URL的配置文件及其数据结构

2、创建用于保存Todo信息(未下载URL)的数据结构

3、创建用于保存Visited信息(已下载的URL)的数据结构

4、下载网页时同步更新Tode与Visited。

5、从上述第3步下载的网页抽取链接并继续下载,直到Todo列表为空。


主要有以下类:

1、主类MyCrawler

2、网页下载类PageDownloader

3、网页内容分类类HtmlParserTool

4、接口Filter


完整代码可见归档代码 Jediael_v0.01

或者

https://code.csdn.net/jediael_lu/daopattern/tree/d196da609baa59ef08176322ca61928fbfbdf813

或者

http://download.csdn.net/download/jediael_lu/7382011


1、主类MyCrawler

package org.ljh.search;

import java.io.IOException;
import java.util.Iterator;
import java.util.Set;

import org.htmlparser.Parser;
import org.ljh.search.downloadpage.PageDownloader;
import org.ljh.search.html.HtmlParserTool;
import org.ljh.search.html.LinkFilter;

public class MyCrawler {	

	public static void main(String[] args) {
		String url = "http://www.baidu.com";
		
		LinkFilter linkFilter = new LinkFilter(){
			@Override
			public boolean accept(String url) {
				if(url.contains("baidu")){
					return true;
				}else{
					return false;
				}
			}			
		};
		try {
			PageDownloader.downloadPageByGetMethod(url);
			Set<String> urlSet = HtmlParserTool.extractLinks(url, linkFilter);
			Iterator iterator = urlSet.iterator();
			while(iterator.hasNext()){
				PageDownloader.downloadPageByGetMethod((String) iterator.next());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


2、网页下载类PageDownloader

package org.ljh.search.downloadpage;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Scanner;

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

//本类用于将指定url对应的网页下载至本地一个文件。
public class PageDownloader {

	public static void downloadPageByGetMethod(String url) throws IOException {

		// 1、通过HttpGet获取到response对象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		// 注意,必需要加上http://的前缀,否则会报:Target host is null异常。
		HttpGet httpGet = new HttpGet(url);
		CloseableHttpResponse response = httpClient.execute(httpGet);

		InputStream is = null;
		if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
			try {
				// 2、获取response的entity。
				HttpEntity entity = response.getEntity();

				// 3、获取到InputStream对象,并对内容进行处理
				is = entity.getContent();

				String fileName = getFileName(url);
				saveToFile("D:\\tmp\\", fileName, is);
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} finally {

				if (is != null) {
					is.close();
				}
				if (response != null) {
					response.close();
				}
			}
		}
	}

	//将输入流中的内容输出到path指定的路径,fileName指定的文件名
	private static void saveToFile(String path, String fileName, InputStream is) {
		Scanner sc = new Scanner(is);
		Writer os = null;
		try {
			os = new PrintWriter(path + fileName);
			while (sc.hasNext()) {
				os.write(sc.nextLine());
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (sc != null) {
				sc.close();
			}
			if (os != null) {
				try{
				os.flush();
				os.close();
				}catch(IOException e){
					e.printStackTrace();
					System.out.println("输出流关闭失败!");
				}
			}
		}
	}

	// 将url中的特殊字符用下划线代替
	private static String getFileName(String url) {
		url = url.substring(7);
		String fileName = url.replaceAll("[\\?:*|<>\"/]", "_") + ".html";
		return fileName;
	}

}

3、网页内容分类类HtmlParserTool

package org.ljh.search.html;

import java.util.HashSet;
import java.util.Set;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

//本类创建用于HTML文件解释工具
public class HtmlParserTool {

	// 本方法用于提取某个html文档中内嵌的链接
	public static Set<String> extractLinks(String url, LinkFilter filter) {
		Set<String> links = new HashSet<String>();
		try {
			// 1、构造一个Parser,并设置相关的属性
			Parser parser = new Parser(url);
			parser.setEncoding("gb2312");

			// 2.1、自定义一个Filter,用于过滤<Frame >标签,然后取得标签中的src属性值
			NodeFilter frameNodeFilter = new NodeFilter() {
				@Override
				public boolean accept(Node node) {
					if (node.getText().startsWith("frame src=")) {
						return true;
					} else {
						return false;
					}
				}
			};
			
			//2.2、创建第二个Filter,过滤<a>标签
			NodeFilter aNodeFilter = new NodeClassFilter(LinkTag.class);
			
			//2.3、净土上述2个Filter形成一个组合逻辑Filter。
			OrFilter linkFilter = new OrFilter(frameNodeFilter, aNodeFilter);
			
			//3、使用parser根据filter来取得所有符合条件的节点
			NodeList nodeList = parser.extractAllNodesThatMatch(linkFilter);
			
			//4、对取得的Node进行处理
			for(int i = 0; i<nodeList.size();i++){
				Node node = nodeList.elementAt(i);
				String linkURL = "";
				//如果链接类型为<a />
				if(node instanceof LinkTag){
					LinkTag link = (LinkTag)node;
					linkURL= link.getLink();
				}else{
					//如果类型为<frame />
					String nodeText = node.getText();
					int beginPosition = nodeText.indexOf("src=");
					nodeText = nodeText.substring(beginPosition);
					int endPosition = nodeText.indexOf(" ");
					if(endPosition == -1){
						endPosition = nodeText.indexOf(">");
					}
					linkURL = nodeText.substring(5, endPosition - 1);
				}
				//判断是否属于本次搜索范围的url
				if(filter.accept(linkURL)){
					links.add(linkURL);
				}
			}
			
		} catch (ParserException e) {
			e.printStackTrace();
		}
		return links;
	}
}

4、接口Filter

package org.ljh.search.html;

//本接口所定义的过滤器,用于判断url是否属于本次搜索范围。
public interface LinkFilter {
	public boolean accept(String url);
}



深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值