Javaネットワークプログラミングの------ネットワーククモ


ネットワーククモ
ネットワーククモは、Webページのハイパーリンクを通じてより多くのWebページにアクセスし、必要な情報を抽出することができます.
本編クモは新浪のホームページから登り始め、ホームページのメールアドレスを抽出します.
本編では主に再帰アルゴリズムを採用し、階層的に深く検索していますが、私はここで制限を設定しました.50層に再帰するだけで戻り、無限に検索したいなら制限を取り除きます.
本編では検索したURLとメールアドレスをIOでファイルに書き,採用者は自分でパスを指定したり,本例でclasspathで同じファイルを作成したりすることができる.
正規表現を使用して、Webページのハイパーリンクを抽出します.
package cn.hncu.bs;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MySpider {

	private static int ply=0;

	/**
	 * @param args
	 * Internet Spider
	 */
	public static void main(String[] args) {
		String address="http://www.sina.com";
		search1(address);
	}

	private static void search1(String address) {
		ply++;
		if (ply>=50){//    
			return;
		}
		try {
			URL url=new URL(address);
			BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream()));
			
			//     
			String regexEmail="\\w+@\\w+(\\.\\w+)+";
			String regexAddress="http://([\\w-]+\\.)+[\\w-]+(/[\\w- .%&=]*)?";
			
			Pattern p1=Pattern.compile(regexEmail);
			Pattern p2=Pattern.compile(regexAddress);
			String line=null;
			while ((line=br.readLine())!=null){
				Matcher m1=p1.matcher(line);
				while (m1.find()){
					String email=m1.group();
					BufferedReader brLink=new BufferedReader(new InputStreamReader(new FileInputStream("emailAddress.txt")));
					String compareEmail=null;
					boolean emailFlag=false;
					while ((compareEmail=brLink.readLine())!=null){
						if (email.equalsIgnoreCase(compareEmail)){
							emailFlag=true;
							break;
						}
					}
					if (emailFlag){
						continue;
					}
					System.out.println(email);
					DataOutputStream dEmail=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("emailAddress.txt",true)));
					dEmail.writeBytes(email+"\r
"); dEmail.flush(); } Matcher m2=p2.matcher(line); while (m2.find()){ String link=m2.group(); BufferedReader brLink=new BufferedReader(new InputStreamReader(new FileInputStream("linkAddress.txt"))); String compareLink=null; boolean linkFlag=false; while ((compareLink=brLink.readLine())!=null){ if (link.equalsIgnoreCase(compareLink)){ linkFlag=true; break; } } if (linkFlag){ continue; } System.out.println(link); DataOutputStream dLink=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("linkAddress.txt",true))); dLink.writeBytes(link+"\r
"); dLink.flush(); search1(link); } } ply--; return; } catch (Exception e) { return;// , } } }

また、自分でアルゴリズムを書いてWebページのハイパーリンクを抽出することもできます.
(若干の欠陥があり、改善が必要)
package cn.hncu.bs;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MySpider {

	private static int ply=0;

	/**
	 * @param args
	 * Internet Spider
	 */
	public static void main(String[] args) {
		String address="http://www.sina.com";
		search2(address);
	}

	private static void search2(String address) {
		ply++;
		if (ply>=50){//    
			return;
		}
		try {
			URL url=new URL(address);
			BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream()));
			
			//     
			String regexEmail="\\w+@\\w+(\\.\\w+)+";
			
			Pattern p1=Pattern.compile(regexEmail);
			String line=null;
			while ((line=br.readLine())!=null){
				Matcher m1=p1.matcher(line);
				while (m1.find()){
					String email=m1.group();
					BufferedReader brLink=new BufferedReader(new InputStreamReader(new FileInputStream("emailAddress2.txt")));
					String compareEmail=null;
					boolean emailFlag=false;
					while ((compareEmail=brLink.readLine())!=null){
						if (email.equalsIgnoreCase(compareEmail)){
							emailFlag=true;
							break;
						}
					}
					if (emailFlag){
						continue;
					}
					System.out.println(email);
					DataOutputStream dEmail=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("emailAddress2.txt",true)));
					dEmail.writeBytes(email+"\r
"); dEmail.flush(); } int index=line.indexOf("http://"); String link=""; if (index!=-1){ for (int i=index;i<line.length();i++){ if (line.charAt(i)=='\"'||line.charAt(i)=='\''||line.charAt(i)==';'||line.charAt(i)==' '||line.charAt(i)=='<'){ continue; } if (line.charAt(i)=='>'){ break; } link+=line.charAt(i); } BufferedReader brLink=new BufferedReader(new InputStreamReader(new FileInputStream("linkAddress2.txt"))); String compareLink=null; boolean linkFlag=false; while ((compareLink=brLink.readLine())!=null){ if (link.equalsIgnoreCase(compareLink)){ linkFlag=true; break; } } if (linkFlag){ continue; } System.out.println(link); DataOutputStream dLink=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("linkAddress2.txt",true))); dLink.writeBytes(link+"\r
"); dLink.flush(); search2(link); } } ply--; return; } catch (Exception e) { return;<span style="font-family: Arial, Helvetica, sans-serif;">// , </span> } } }