尝试java开发搜索引擎爬虫

大家应该也知道百度搜索结果都会有一个百度快照,这是通过缓存服务器调用出来的页面信息,这样我们就可以通过百度快照快速的浏览网页信息,那么这个缓存服务器跟爬虫又有什么联系么?

我们来大致了解一下爬虫的基本原理(个人理解,有错误给予纠正)。首先搜索引擎是不会产生内容的,它的信息是通过爬虫把信息检索出来。爬虫通过域名URL获取到源代码,将页面内容存储到缓存服务器上同时建立索引。将下载下来的网页URL放进URL队列中,并记录避免重复抓取。然后在这个队列中检查URL,要是发现还没有被抓取就将这个URL放进待抓取队列中,在下次调度中下载这个URL相对应的网页。

首先我们需要一个jar包:jsoup-1.7.2.jar 这一个

package com.html;

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.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 
 * 利用java的Jsoup开发搜索引擎爬虫
 * HtmlJsoup<BR>
 * 创建人:youshangdetudoudou <BR>
 * 时间:2014年9月9日-上午10:55:27 <BR>
 * @version 1.0.0
 *
 */

public class HtmlJsoup {
	/**
	 * 
	 * 根据网址和页面的编码集获取网页的源代码<BR>
	 * 方法名:getHtmlResourceByURL<BR>
	 * 创建人:youshangdetudoudou <BR>
	 * 时间:2014年9月9日-上午11:01:22 <BR>
	 * @param url 需要下载的url地址
	 * @param encoding 需要网页的编码集
	 * @return String 返回网页的源代码<BR>
	 * @exception <BR>
	 * @since  1.0.0
	 */
	public static String getHtmlResourceByURL(String url,String encoding){
			//声明一个存储网页源代码的容器
			StringBuffer buffer = new StringBuffer();
			URL urlObj = null;
			URLConnection uc = null;
			InputStreamReader in = null;
			BufferedReader reader = null;
			//参数是网址。要try catch
		try {
			//建立网络连接
			urlObj = new URL(url);
			//打开网络连接
			uc = urlObj.openConnection();
			//建立网络的输入流
			in = new InputStreamReader(uc.getInputStream(),encoding);
			//缓冲写入的文件流
			reader = new BufferedReader(in);
			//临时变量
			String tempLine = null;
			//循环读取文件流
			while((tempLine = reader.readLine())!=null){
				buffer.append(tempLine+"\n");//循环不断的追加数据	

			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.err.println("connection timeout.....");
		}finally{
			if (in!=null) {
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return buffer.toString();
	}
	/**
	 * 
	 * 通过图片地址批量下载图片到服务器的磁盘<BR>
	 * 方法名:downImages<BR>
	 * 创建人:youshangdetudoudou <BR>
	 * 时间:2014年9月9日-下午2:15:51 <BR>
	 * @param imgURL
	 * @param filePath void<BR>
	 * @exception <BR>
	 * @since  1.0.0
	 */
	public static void downImages(String imgURL,String filePath){
			String fileName = imgURL.substring(imgURL.lastIndexOf("/"));
			//创建文件的目录
			try {
				File files = new File(filePath);
				//判断是否存在文件夹
				if(!files.exists()){
					files.mkdir();
				}
				//获取图片文件的下载地址
				URL url = new URL(imgURL);
				//连接网络图片地址
				HttpURLConnection uc = (HttpURLConnection)url.openConnection();
				//获取连接的输出流
				InputStream is = uc.getInputStream();
				//创建文件
				File file = new File(filePath+fileName);
				//创建输出流,写入文件
				FileOutputStream out = new FileOutputStream(file);
				int i = 0;
				while((i=is.read())!=-1){
					out.write(i);
				}
				is.close();
				out.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
	//java的入口函数
	public static void main(String[] args){
		System.out.println("haha");
		//根据网址和网页的编码集 获取网页的源代码
		String htmlResource = getHtmlResourceByURL("http://www.4399.com/","gbk");
		//System.out.println(htmlResource);
		//解析源代码
		 Document document = Jsoup.parse(htmlResource);
		 //获取网页的图片
		 Elements elements = document.getElementsByTag("img");
		 for(Element element : elements){
			 String imgSrc = element.attr("src");
			 String imgPath =imgSrc;
			 System.out.println("图片地址:"+imgSrc);

			downImages(imgPath,"F:\\xfmovie\\images");
			System.out.println("下载完成!!!!!!!!!");
		 }

		//解析我们需要下载的内容部分
	}

}

以上是获取http://www.4399.com/网页的源代码

以上是解析网页源代码其中的一部分截图。。。

以上是网页下载下来的图片。。。抓取成功。。

这是一个相对简单的抓取。。有时间up主会继续改善继续学习。。谢谢大家。。

时间: 2024-10-20 09:18:10

尝试java开发搜索引擎爬虫的相关文章

Java开发搜索引擎爬虫

1 package com.peidon.html; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.InputStreamReader; 9 import java.net.HttpURLConnectio

Java开发、网络爬虫、自然语言处理、数据挖掘简介

一.java开发 (1) 应用开发,即Java SE开发,不属于java的优势所在,所以市场占有率很低,前途也不被看好. (2) web开发,即Java Web开发,主要是基于自有或第三方成熟框架的系统开发,如ssh.springMvc.springside.nutz.,面向各自不同的领域,像OA.金融.教育等有非常成熟案例,这是目前最大的市场所在,故人称“java为web而生”.但目前看它的缺点入门不高,所以待遇相对中等,上升空间很有限且缓慢. (3)移动开发(Android),是目前的大趋势

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

9个基于Java的搜索引擎

1.Java 全文搜索引擎框架 Lucene 毫无疑问,Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.Lucene为开发人员提供了相当完整的工具包,可以非常方便地实现强大的全文检索功能.下面有几款搜索引擎框架也是基于Lucene实现的. 官方网站:http://lucene.apache.org/ 2.开源Java搜索引擎Nutch Nutch 是一个开源Java实现的搜索引擎.它提供了我们运行自己的搜索

9个基于Java的搜索引擎框架

在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友欢心,你也会在百度上寻找正规的整容医疗机构(尽管有很大一部分广告骗子).那么如果在你自己开发的网站系统中需要能让用户搜索一些重要的信息,并且能以结构化的结果展现给用户,下面分享的这9款Java搜索引擎框架或许就可以帮助到你了. 1.Java 全文搜索引擎框架 Lucene 毫无疑问,Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它是一个全文检索引

开发网络爬虫应该怎样选择爬虫框架?

有些人问,开发网络爬虫应该选择Nutch.Crawler4j.WebMagic.scrapy.WebCollector还是其他的?这里按照我的经验随便扯淡一下: 上面说的爬虫,基本可以分3类: 1.分布式爬虫:Nutch 2.JAVA单机爬虫:Crawler4j.WebMagic.WebCollector 3. 非JAVA单机爬虫:scrapy 第一类:分布式爬虫         爬虫使用分布式,主要是解决两个问题: 1)海量URL管理 2)网速 现在比较流行的分布式爬虫,是Apache的Nut

Java开发环境的配置与Hello World

一.Java开发需要做的准备 Java程序的执行过程是首先由Java编译器将以.java为后缀的Java源文件编译成.class字节码文件.然后字节码文件便可以由JVM虚拟机进行加载并执行. 在初学Java的时候,由于我们的电脑默认上不带有JVM虚拟机和Java编译器,所以我们首先需要在电脑上安装内部含有Java编译器.JVM虚拟机等其他Java开发相关组件的Java开发工具集(Java Development Kit),也就是我们常说的JDK. 1.1安装JDK Java目前隶属于Oracle

开发网络爬虫应该如何选择爬虫框架?

有些人问,开发网络爬虫应该选择Nutch.Crawler4j.WebMagic.scrapy.WebCollector还是其它的?这里依照我的经验随便扯淡一下: 上面说的爬虫,基本能够分3类: 1.分布式爬虫:Nutch 2.JAVA单机爬虫:Crawler4j.WebMagic.WebCollector 3. 非JAVA单机爬虫:scrapy 第一类:分布式爬虫         爬虫使用分布式.主要是解决两个问题: 1)海量URL管理 2)网速 如今比較流行的分布式爬虫,是Apache的Nut

《Java开发手册》

一. 编程规约 (一) 命名风格 [强制]抽象类命名使用Abstract或Base开头:异常类命名使用Exception 结尾:测试类 命名以它要测试的类的名称开始,以Test结尾. [强制]POJO类中布尔类型变量都不要加is前缀,否则部分框架解析会引起序列化错误. 说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的值采用 is_xxx 的命名方式,所以,需要在 设置从 is_xxx到 xxx的映射关系. 反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方