網絡爬蟲第一個要面臨的問題,就是如何抓取網頁,抓取其實很容易,沒你想的那么復雜,一個開源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(); } }
新聞熱點
疑難解答