zoukankan      html  css  js  c++  java
  • HtmlUnit 开发网络爬虫

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,几行代码就OK啦!

    通常在一个页面中会包含别的Url,在别的Url当中又会包含更多的Url。如果我们要对与该站点相关的Url全部都抓取过来。就相当于我们要对跟这个站有关的Url进行搜索。

    常用的搜索算法有bfs和dfs,考虑到网页上的Url的重要程度还是以广度来分布的,所以这里采用bfs来搜索url。

    到这里又会产生一些问题:

    1,搜索过的url,并不需要重新访问
    2,如何拼凑新的url
    3,不要访问站外url,处理无法访问的url等.....

    总之我们尽可能的根据实际的情况得到自己想要的url~所以我们尽可能编写合法的剪枝算法。

    下面添上自己胡乱写的算法的框架,写的不好哈哈。

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.LinkedList;
    import java.util.Map;
    import java.util.Queue;
    import java.util.Set;
    
    import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
    import com.gargoylesoftware.htmlunit.WebClient;
    import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
    
    //引用HtmlUnit
    public class MyWalker {
    
        static int num = 0;//暂时用num进行限制
        
        final static WebClient webClient = new WebClient();
        static Queue<String> Q = new LinkedList<String>();//存放被抓取的Url
        static Set<String> linkUrl = new HashSet<String>();
        static Map<String,Boolean> flagMap = new HashMap<String,Boolean>();//标记Url是否访问过
        
        static{
            webClient.getOptions().setCssEnabled(false);
            webClient.getOptions().setJavaScriptEnabled(false);
        }
        
        private static String baseUrl = "http://xjasc.gov.cn";
        
        //拼凑出可再次访问的url, 这里的拼凑是不完整的
        private static String createUrl(String current, String u){
         return current + "/" + u; } //判断该链接是否合法 private static boolean isLegal(String url){ if(num > 100) return false; return true; } //页面是否坏掉 private static boolean isBadUrl(String url){ return false; } private static void bfs(){ Q.offer(baseUrl); linkUrl.add(baseUrl);
         while(!Q.isEmpty()){ //得到当前的Url try { String tmpUrl = Q.poll(); if(flagMap.get(tmpUrl)==null){//该结点没有访问过 flagMap.put(tmpUrl, true);//标记为已经访问 HtmlPage page = webClient.getPage(tmpUrl); java.util.List<HtmlAnchor> achList=page.getAnchors(); for(HtmlAnchor ach:achList){ String newUrl = createUrl(tmpUrl, ach.getHrefAttribute()); if(isLegal(newUrl)){ System.out.println(newUrl); num++; linkUrl.add(newUrl); Q.offer(newUrl); } } } } catch (FailingHttpStatusCodeException e) { System.out.println(e.getStatusCode()); } catch (MalformedURLException e) { } catch (IOException e) { } } } public static void main(String[] args) { bfs(); } }
  • 相关阅读:
    [C++]怎么将.h和.cpp文件分别放在不同的目录
    [C++]VAssistX文件头添加注释功能设置
    教程-Delphi调用百度地图API(XE8+WIN7)
    WebBrowser的各种使用方法(未完待续)(XE8+WIN7)
    Android教程-夜神模拟器连接IDE更新让Delphi发现你的手机或夜神模拟器
    首尔甜城常用电话
    Android问题-DelphiXE5开发Andriod连接Webservice乱码问题
    点乘的使用
    [转]脏读,不可重复读,幻读的理解
    Unity3D刚体不同力的测试(ForceMode,AddForce,RelativeAddForce)
  • 原文地址:https://www.cnblogs.com/chenjianxiang/p/4522655.html
Copyright © 2011-2022 走看看