Javaネットワークプログラミングの------ネットワーククモ
5882 ワード
ネットワーククモ
ネットワーククモは、Webページのハイパーリンクを通じてより多くのWebページにアクセスし、必要な情報を抽出することができます.
本編クモは新浪のホームページから登り始め、ホームページのメールアドレスを抽出します.
本編では主に再帰アルゴリズムを採用し、階層的に深く検索していますが、私はここで制限を設定しました.50層に再帰するだけで戻り、無限に検索したいなら制限を取り除きます.
本編では検索したURLとメールアドレスをIOでファイルに書き,採用者は自分でパスを指定したり,本例でclasspathで同じファイルを作成したりすることができる.
正規表現を使用して、Webページのハイパーリンクを抽出します.
また、自分でアルゴリズムを書いてWebページのハイパーリンクを抽出することもできます.
(若干の欠陥があり、改善が必要)
ネットワーククモは、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>
}
}
}