(4)Java 有一个非常实用的开源工具包 HtmlParser,它专门针对 Html 页面进行处理,不仅能提取 URL,还能提取文本以及你想要的任何内容.下面的HtmlParserTool类将实现其具体的一些功能:
public class HtmlParserTool {
// 获取一个网站上的链接,filter 用来过滤链接
public static Set<String> extracLinks(String url, LinkFilter filter) {
Set<String> links = new HashSet<String>();
try {
Parser parser = new Parser(url);
parser.setEncoding("gb2312");
// 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性
NodeFilter frameFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node.getText().startsWith("frame src=")) {
return true;
} else {
return false;
}
};
// OrFilter 来设置过滤 <a> 标签和 <frame> 标签
OrFilter linkFilter = new OrFilter(new NodeClassFilter( LinkTag.class), frameFilter);
// 得到所有经过过滤的标签 NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node tag = list.elementAt(i);
if (tag instanceof LinkTag)
// <a> 标签
{
LinkTag link = (LinkTag) tag;
String linkUrl = link.getLink();
// URL
if (filter.accept(linkUrl)) links.add(linkUrl);
} else
// <frame> 标签
{
// 提取 frame 里 src 属性的链接,如 <framesrc="test.html"/>
String frame = tag.getText();
int start = frame.indexOf("src=");
frame = frame.substring(start);
int end = frame.indexOf(" ");
if (end == -1)
end = frame.indexOf(">");
String frameUrl = frame.substring(5, end - 1);
if (filter.accept(frameUrl))
links.add(frameUrl);
}
}
} catch (ParserException e) {
e.printStackTrace();
} return links;
}
}
(5)现在使用MyCrawler类将爬虫爬起来:
public class MyCrawler {
/** * 使用种子初始化 URL 队列
* @return * @param seeds 种子URL */
private void initCrawlerWithSeeds(String[] seeds) {
for(int i=0;i<seeds.length;i++)
LinkQueue.addUnvisitedUrl(seeds[i]);
}
/** * 抓取过程 * @return * @param seeds */
public void crawling(String[] seeds) {
//定义过滤器,提取以开头的链接
LinkFilter filter = new LinkFilter(){
public boolean accept(String url) {
if(url.startsWith("https://www.linuxidc.com"))
return true;
else
return false;
}
}
//初始化 URL 队列
initCrawlerWithSeeds(seeds);
//循环条件:待抓取的链接不空且抓取的网页不多于1000
while(!LinkQueue.unVisitedUrlsEmpty() &&LinkQueue.getVisitedUrlNum()<=1000) {
//队头URL出队列
String visitUrl=(String)LinkQueue.unVisitedUrlDeQueue();
if(visitUrl==null) continue;
DownLoadFile downLoader=new DownLoadFile();
//下载网页 downLoader.downloadFile(visitUrl);
//该 URL 放入已访问的 URL 中 LinkQueue.addVisitedUrl(visitUrl);
//提取出下载网页中的
URL Set<String> links=HtmlParserTool.extracLinks(visitUrl,filter);
//新的未访问的 URL 入队
for(String link:links) {
LinkQueue.addUnvisitedUrl(link);
}
}
}
//main 方法入口
public static void main(String[]args) {
MyCrawler crawler = new MyCrawler();
crawler.crawling(new String[]{"https://www.linuxidc.com"});
}