引言
应用 Java 的开源库,编写一个搜索引擎,这个引擎能爬取一个网站的内容。并根据网页内容进行深度爬取,获取所有相关的网页地址和内容,用户可以通过关键词,搜索所有相关的网址。
具体功能
(1) 用户可以指定爬取一个url对应的网页的内容。
(2) 对网页内容进行解析,并获取其中所有的url链接地址。
(3) 用户可以设定爬取深度,代表着从初始url对应的页面开始,可以爬取其中所有的url对应的网页内的url,以此类推。深度越大,能爬取到的网站越多。
(4) 对爬取到的url内容进行保存、建立索引。建立索引的内容是url地址本身,和url对应的网页标题。
(5) 用户可以通过关键词对网址进行搜索,找出有该关键词的url地址。
(6) 建立索引和搜索索引的过程能智能识别中文关键词,能对关键词进行分词操作。
(7) 用户可以指定保存索引的地址、初始url、爬取深度、进行搜索的关键词和最大匹配项。
开源框架
- Lucene
- Jsoup
源码
爬虫部分:Spider.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
package webCrawler.Spider;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import webCrawler.Index.BuildIndex;
/**
* @author lannooo
*/
public class Spider {
ArrayList<String> URLs;
private String startURL;
private int digLevel;
/**
* @param startURL 爬虫的起始URL
* @param digLevel 爬取深度
*/
public Spider(String startURL, int digLevel){
this .startURL = startURL;
this .digLevel = digLevel;
this .URLs = new ArrayList<>();
}
/**
* @param level 当前爬取的深度剩余
* @param arrayList 需要进行下一轮爬去的URL集
* @return 从一格url集爬取到的新的URL集
* @throws IOException
*/
public ArrayList<String> getLevelURLs( int level, ArrayList<String> arrayList)
throws IOException{
ArrayList<String> total = null ;
if (level> 0 ){
total = new ArrayList<>();
for (String url: arrayList){
/*对于每个arrayList中的URL,首先解析其网页内容,并获得里面所有URL项*/
for(String each: getBareLinks(url)){
total.add(each);
}
}
/*用HashSet这个容器将total里面重复项删除*/
HashSet<String> hashSet = new HashSet<>(total);
total = new ArrayList<>(hashSet);
}
return total;
}
/**
* 从startURL开始,爬取所有相关URLs
* @throws IOException
*/
public void getAll() throws IOException{
ArrayList<String> newURLs;
ArrayList<String> currentURLs = new ArrayList<>();
/*把startURL加入currentURLs这个列表中,从这个url开始爬*/
currentURLs.add(startURL);
for(int i=digLevel; i>0; i--){
/*
* 对于每一层,都要获取一次由这个url引申出去的url集
* 然后把当前集的已经爬去过的url加入到总的URL集中
* 最后newURLs作为新的需要进行深度爬取的集进入下一轮循环
*/
System.out.println("Dig into level: " + (digLevel-i+1));
newURLs = getLevelURLs(i, currentURLs);
for(String each: currentURLs){
URLs.add(each);
}
currentURLs = newURLs;
}
for(String each:currentURLs){
URLs.add(each);
}
HashSet<String> hashSet = new HashSet<>(URLs);
URLs = new ArrayList<>(hashSet);
}
/**
* @param path 保存索引的路径
* @throws IOException
*/
public void storeURLsAndInfo(String path) throws IOException{
BuildIndex build = new BuildIndex(path);
/* 把URLs中的所有url进行实际网页标题的爬取*/
for(String each:URLs){
String text = getLinkText(each);
if(text!=null){
build.addField("url", each);
build.addField("text", text);
/*将这一个entry加入索引中*/
build.pushIndex();
}
}
build.close();
}
/**
* @param url 需要获取网页标题的url
* @return 标题内容
* @throws IOException
*/
public String getLinkText(String url) throws IOException{
Document document = null;
try {
/*用Jsoup进行连接,设置超时时间为3秒*/
document = Jsoup.connect(url).timeout(3000).get();
} catch (Exception e) {
System.out.println("[TIMEOUT]Get title of url:"+url);
return null;
}
String id="codetool">
建立索引:BuildIndex.java
搜索索引
UI界面(这里为了方便只是命令行的形式,可以根据需求写一个GUI界面)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。 原文链接:http://blog.csdn.net/qq_22187919/article/details/60466006 延伸 · 阅读
精彩推荐
|