- 浏览: 275688 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
86614009:
如何在service层,如何获取绑定到当前线程的entitna ...
使用spring的OpenEntityManagerInView -
yajunyajun2011:
好帖子 怎么没人顶呢
Java 正则表达式最大,最小匹配问题 -
xtuali:
能说明一下,你的nutch是哪个版本的吗?谢谢!
搜索引擎Nutch源代码研究之一 网页抓取(1) -
dongmusic:
需要学习这么多的东西,吐血中...
如何提高Java开发能力 -
jiminsc:
cool
LDAP 验证、添加、修改、删除(转)
网站的url分为很多种类:<a href="" />; <form action="" method="Get"/>;<link href=""/>;<img src=""/>;<script src=""/> ;<frame src=""/> 等等
难点:
递归遍历
获得页面每个url
同时请求(每种类型的请求方式都不同)
有些链接是重复的,需要去重
使用 Htmlparse 工具 下载htmlparser.jar
遍历 + 通过htmlparser 解析页面元素
去重需要使用正则表达式
二、用htmlparse 可以对 a ,link,script,img 元素获取,但无法解决对form的递归提交,因为form提交方式分为get,post两种,对post方式参数列表无法获取,无法动态设置post提交方式。
使用HttpUnit测试工具很好强大的模拟浏览器,可以任意提交,页面元素也可以获得。
下载引入 httpunit.rar
对于不符合链接格式的都会无法请求 也就是坏链接。
难点:
递归遍历
获得页面每个url
同时请求(每种类型的请求方式都不同)
有些链接是重复的,需要去重
使用 Htmlparse 工具 下载htmlparser.jar
遍历 + 通过htmlparser 解析页面元素
- 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;
- }
- }
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;
- }
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两种,对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;
- }
- }
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; } }
对于不符合链接格式的都会无法请求 也就是坏链接。
发表评论
-
修改XHTML元素
2011-05-16 14:53 668修改XHTML元素通常通过修改如下几个常用属性来实现: 1. ... -
HTML解析器软件
2011-01-07 14:38 7342HTML解析器软件 ... -
将Unicode字符转换成中文
2011-01-04 16:12 1025public static String ToChines ... -
URL编码与中文的转换
2011-01-04 14:56 1457public static String Encode ... -
htmlparser 去除html标签体(获取body,title纯文本)
2010-12-29 20:38 2615package test; import java.io.* ... -
利用HtmlParser进行网页信息提取[原创]
2010-12-19 19:28 12841.1 概述 在开发工作中,往往有些需求是需要获取某些网页中 ... -
htmlparser提取网页正文
2010-12-19 19:02 1884Java代码 mport org.ht ... -
如何分析网页-----使用HtmlParser(1)
2010-12-19 13:42 1091如何分析网页-----使用Ht ... -
用nekohtml来获取网页指定内容
2010-12-01 19:15 1121用nekohtml来获取网页指定内容 下载地址 http:/ ... -
nekohtml的简单使用
2010-12-01 09:01 1502做了一段时间的网页解析的工作,有了些体会, ... -
Neko的简单使用
2010-11-29 21:42 1130做了一段时间的网页解析的工作,有了些体会,写出来和大家分享。 ... -
NekoHTML学习笔记
2010-11-29 21:18 1404NekoHTML学习笔记文章分 ... -
htmlparser使用指南
2010-11-29 19:41 899转载:http://www.yeeach.com/2008 ...
相关推荐
遍历文件夹及子文件夹下所有图片,并生成图片的路径网站路径,并生成HTML文件。
本程序可实现无限分类的树的查询,此文件包含程序和数据表的结构,可实现树的无限节点遍历,还可以实现各个节点的Url的定向链接。
该工具将遍历URL路径以查找打开的目录。 如果找到,它将查找所有zip / txt / exe文件并下载。 这些文件可能包含网络钓鱼源代码,受害者日志以及可能的恶意软件。 您可以在文本文件中提供URL列表,或者默认情况下,...
connect-traversal 是 Connect 和 Express 框架的中间件,它允许使用 URL 遍历而不是 URL 调度。 遍历机制比 URL 调度更强大,并在 Rails (Ruby)、Pyramid (Python) 等流行框架中使用。 对于新资源的注册,只需...
二叉树的遍历及其应用--期中上机考试.cpp
本代码用for语句循环,用fi判断,增加3个执行模块,最大执行范围根据a的值来界定,a值可自定义。
通过XPath遍历给定的URL,并将选定的元素作为JSON返回。 用法 范围 必需的 描述 ü 是的 网页的URL,以执行给定的XPath查询。 x [ n ] 是的 要执行的XPath查询。 您可以在单个请求中运行多个XPath查询。 JSON...
例如url=c:\文件夹1,而文件夹1中包含多个文件夹,现在程序要求遍历所有文件夹找出文件夹中的文件,然后原样保存到D盘的文件夹中去。原样是指只需文件夹中文件过去就可以,不用再还原文件夹。从键盘键入文件夹
亲测可用,中级漏洞,解决服务器段请求伪造 final String forURL = ESAPI.encoder().encodeForURL(url); restTemplate.exchange(forURL, HttpMethod.GET,new HttpEntity<String>(headers), List.class, params);
本文实例讲述了python遍历类中所有成员的方法。分享给大家供大家参考。具体分析如下: 这段代码自定义了一个类,类包含了两个成员title和url,在类的内部定义了一个函数list_all_member用于输出类的所有成员变量及值...
creationComplete="service.send()" > ... url="data/slideshow.xml" result="resultHandler(event)" fault="faultHandler(event)"/> dataProvider="{slides}"/> </mx:Application>
url访问小工具,遍历指定url,可以通过此种方式刷alexa。
例子: 如果请求 URL 是/foo/bar/baz/123 ,它被标记为以下内容: [ " foo " , " bar " , " baz " , " 123 " ] 然后执行以下查找的等效项: root_tree [ "foo" ][ "bar" ][ "baz" ][ "123" ] 此查找产生的对象是...
1. 我们首先定义了一个get_html函数,用于获取指定URL的HTML内容。...如果请求成功,我们将返回response的文本内容;...然后,我们遍历所有的URL,对每个URL,我们发送一个GET请求来获取这个URL的内容,然后将这个内容保存
继续遍历其他商品URL,重复步骤5和6,直到所有商品的价格都被提取。 将爬取到的商品价格进行展示,可以通过打印到控制台、写入文件或者展示在GUI界面中。 需要注意的是,使用Python爬取淘宝商品价格时,应该遵循以下...
路径遍历攻击的简单工具 基本用法 python3 dirrunner.py -u https://example/com/someurl 深度 可以使用-d标志指定要挖掘的子目录数量。 默认值= 12。 python3 dirrunner.py -u https://example/com/someurl -d 8 ...
Mutator 将针对从 burpsuite 看到的每个请求运行,例如(代理、转发器、扫描仪)生成许多潜在的 url,每个都附加一个要传递给 Executor 和 Detector 类的有效负载,以检测其中一种检测技术是否成功 该插件使用两种...
本文实例采用案例分析的方法介绍了jquery遍历json对象的三种情况,供大家参考,具体内容如下 第一个案例:jquery 遍历json对象集合 常用示例 jsp中 $.ajax({ url: ${applicationScope.rootpath}common/...