基于Java的宽度优先遍历互联网结点(2)

(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"});
 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/53ea44940631d11ff0644ea70ce146ff.html