ウェブサイトのすべてのUrlを巡る 9499 ワード Web 同前 webform ウェブサイトのurlは多くの種類に分けられます:;;;; ;public class Urll { // 定义的全局变量 public static Vector<String> svecOutUrl = new Vector<String>(); public static Vector<String> svecBadUrl = new Vector<String>(); public static Vector<String> svecAUrl = new Vector<String>(); public static final int DEEP=3; //遍历的深度 public static boolean bl; //判断标志 private static String loc; private static Parser parser; //对超文本进行分析 private static String hostName = "sina.com"; // 由于网站中URL之间的连接构成了图,所以对图的遍历这里采用深度优先的方法。 public static void extractLinks(String loc) throws Exception { String str1; URL wwwurl; boolean byes; Vector<String> vecUrl=new Vector<String>(); // 解析 <a> try { parser = new Parser(loc); //原理见HTMLParser bl=true; } catch (Exception e) { bl=false; e.printStackTrace(); } filterStr = "a"; filter = new TagNameFilter(filterStr); links = parser.extractAllNodesThatMatch(filter); for (int i = 0;i < links.size();i++) { if(bl) { byes=true; LinkTag LinkTag = (LinkTag)links.elementAt(i); str1= LinkTag.getLink(); System.out.println(""+i); str1 = Patter (str1) if(str1.equals("")) continue; if(!svecAUrl.contains(str1)) { try { // 判断是否可连接 wwwurl=new URL(str1); URLConnection con = wwwurl.openConnection(); con.setConnectTimeout(1000); con.getInputStream(); } catch(SocketTimeoutException e) { byes=false; svecBadUrl.add(str1); continue; } catch(Exception e) { byes=false; continue; } if(GetHostName(str1).equals(hostName)) { svecAUrl.add(str1); vecUrl.add(str1); } else { svecOutUrl.add(str1); } } } } // 递归调用 String strNew; int b = 1; if(b<=DEEP) { for(int i=0;i<vecUrl.size();i++) { strNew=(String)vecUrl.get(i); extractLinks(strNew); } } } // 通过该函数来判断所得URL是否是本网站的URL public static String GetHostName(String host) { URL aurl; String ss=" "; try { aurl=new URL(host); ss=aurl.getHost(); ss = ss.substring(ss.length()-10, ss.length()); } catch(Exception e) { e.printStackTrace(); } return ss; } } リセットには正規表現が必要です private String Patter (String str) { if (str.indexOf("http:") == -1) { return str = ""; } Pattern p = Pattern.compile("http://www.sina.com/\\d+/v/\\d+.html"); Matcher m = p.matcher(str); boolean b = m.matches(); if (b) { str = "http://www.sina.com/0/v/0.html"; return str; } } 二、htmlparseでa,link,script,img要素を取得できますが、formの再帰的なコミットは解決できません.formコミット方式はget,postの2種類に分けられ、post方式パラメータリストは取得できません.postコミット方式を動的に設定できません.HttpUnitテストツールを使用すると、強力なシミュレーションブラウザが使用でき、任意にコミットでき、ページ要素も入手できます.ダウンロードhttpunit.rar private static WebConversation wc = new WebConversation(); private static WebForm w; // 由于网站中URL之间的连接构成了图,所以对图的遍历这里采用深度优先的方法。 public static void extractLinks(WebRequestSource webT,String method,boolean start) throws Exception { Vector<WebForm> vecForm=new Vector<WebForm>(); Vector<WebLink> vecLink=new Vector<WebLink>(); WebResponse resp = null; WebForm[] webForm = new WebForm[0]; WebLink[] webLink = new WebLink[0]; try { HttpUnitOptions.setExceptionsThrownOnScriptError(false); // 按照 Get Post link 类型打开web if (start) { // 首页 WebRequest req = new PostMethodWebRequest("http://www.sina.com/"); resp = wc.getResponse(req); } else if ("post".equals(method) || "get".equals(method)) { //获得form 并提交 WebForm w = (WebForm) webT; [color=red]resp = w.submit();[/color] } else { WebLink l = (WebLink) webT; [color=red]resp = l.click();[/color] } webForm = resp.getForms(); webLink = resp.getLinks(); bl=true; } catch (Exception e) { bl=false; e.printStackTrace(); } String ss,str1; URL wwwurl; boolean byes; StringBuffer strUrl; int a=0,b=0,tID=0; b++; // 获取一个页面中所有的FORM中URL for (int i = 0;i < webForm.length;i++) { if(bl) { byes=true; // 按照 Get Post 类型 strUrl = new StringBuffer(resp.getURL().toString()); if (!"./".equals(webForm[i].getAction()) && "post".equals(webForm[i].getMethod())) { strUrl.append(webForm[i].getAction().substring(1, webForm[i].getAction().length())); strUrl.append("?"); String[] para = webForm[i].getParameterNames(); for (int p = 0;p< para.length;p++) { strUrl.append(para[p]); strUrl.append("=&"); } } else if (!"./".equals(webForm[i].getAction())) { strUrl.append(webForm[i].getAction().substring(1, webForm[i].getAction().length())); } if(strUrl.equals("")) continue; if(!svecLink.contains(strUrl.toString())) { try { // 按照 Get Post 类型 if (!"./".equals(webForm[i].getAction())) { webForm[i].submit(); } } catch(Exception e) { byes=false; } if(GetHostName(strUrl.toString()).equals(hostName) && byes){ a++; tID++; svecLink.add(strUrl.toString()); // 按照 Get Post 类型 vecForm.add(webForm[i]); } else { svecOutlink.add(strUrl.toString()); } if (svecLink.size() >= 1000) { svecLink.clear(); } } } } // 获取一个页面中所有的LINK中URL for (int i = 0;i < webLink.length;i++) { if(bl) { byes=true; // 按照 Link 类型 strUrl = new StringBuffer(webLink[i].getURLString()); if (strUrl.indexOf("http") == -1) { strUrl = new StringBuffer(); } if(strUrl == null || "".equals(strUrl.toString())) continue; if(!svecLink.contains(strUrl.toString())) { try { webLink[i].newScriptable(); HttpUnitOptions.clearScriptErrorMessages(); HttpUnitOptions.setExceptionsThrownOnScriptError(false); HttpUnitOptions.setScriptingEnabled(false); HttpUnitOptions.setJavaScriptOptimizationLevel(0); WebRequest re = webLink[i].getRequest(); URL u = re.getURL(); u.getContent(); // 按照 Link 类型 } catch(Exception e) { byes=false; System.out.print(e.getMessage()); } if(GetHostName(strUrl.toString()).equals(hostName) && byes){ a++; tID++; svecLink.add(strUrl.toString()); // 按照 Link 类型 vecLink.add(webLink[i]); } else { svecOutlink.add(strUrl.toString()); } if (svecLink.size() >= 1000) { svecLink.clear(); } } } } WebForm webFNew; WebLink webLNew; if(a>0&&b<=DEEP) { // 递归调用 for(int i=0,j=0;i<vecForm.size()||j<vecLink.size();i++,j++) { webFNew = (WebForm)vecForm.get(i); extractLinks(webFNew,webFNew.getMethod().toString(),false); webLNew = (WebLink)vecLink.get(j); extractLinks(webLNew,"link".toString(),false); } } } // 通过该函数来判断所得URL是否是本网站的URL,如果不是就不需要添加svecLink中如果是并且以前没有提取过就添加到svecLink中。 public static String GetHostName(String host) { URL aurl; String ss=" "; try { aurl=new URL(host); ss=aurl.getHost(); ss = ss.substring(ss.length()-10, ss.length()); } catch(Exception e) { e.printStackTrace(); } return ss; } } リンク形式に合わない場合は、要求できません.つまり、悪いリンクです. Selenium+Java Web自動化テスト環境の構成 X Number