首页 > 学院 > 开发设计 > 正文

HtmlUnit 开发网络爬虫

2019-11-15 00:15:59
字体:
来源:转载
供稿:网友
HtmlUnit 开发网络爬虫

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

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

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

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

1,搜索过的url,并不需要重新访问2,如何拼凑新的url3,不要访问站外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;//引用HtmlUnitpublic 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();    }    }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表