- 浏览: 288270 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 715修改XHTML元素通常通过修改如下几个常用属性来实现: 1. ... -
HTML解析器软件
2011-01-07 14:38 7470HTML解析器软件 ... -
将Unicode字符转换成中文
2011-01-04 16:12 1079public static String ToChines ... -
URL编码与中文的转换
2011-01-04 14:56 1519public static String Encode ... -
htmlparser 去除html标签体(获取body,title纯文本)
2010-12-29 20:38 2661package test; import java.io.* ... -
利用HtmlParser进行网页信息提取[原创]
2010-12-19 19:28 13771.1 概述 在开发工作中,往往有些需求是需要获取某些网页中 ... -
htmlparser提取网页正文
2010-12-19 19:02 1926Java代码 mport org.ht ... -
如何分析网页-----使用HtmlParser(1)
2010-12-19 13:42 1148如何分析网页-----使用Ht ... -
用nekohtml来获取网页指定内容
2010-12-01 19:15 1155用nekohtml来获取网页指定内容 下载地址 http:/ ... -
nekohtml的简单使用
2010-12-01 09:01 1547做了一段时间的网页解析的工作,有了些体会, ... -
Neko的简单使用
2010-11-29 21:42 1191做了一段时间的网页解析的工作,有了些体会,写出来和大家分享。 ... -
NekoHTML学习笔记
2010-11-29 21:18 1437NekoHTML学习笔记文章分 ... -
htmlparser使用指南
2010-11-29 19:41 1018转载:http://www.yeeach.com/2008 ...
相关推荐
在目录遍历爬虫中,我们可以用`requests.get()`函数发送GET请求到目标网站的不同URL,以探索其文件和目录。 4. **目录遍历爬虫原理** 目录遍历爬虫的基本思路是构造一系列URL,尝试访问目标网站的不同路径。通常从...
这个任务涉及到了“线程遍历网站文件夹及子文件夹下所有图片并生成图片URL”,这是一个典型的文件系统操作结合多线程处理的问题。下面将详细介绍这个知识点。 首先,我们需要理解“遍历文件夹及子文件夹下所有图片...
总之,这个压缩包中的代码旨在展示如何使用Python编写一个爬虫程序,遍历并抓取整个网站的URL。通过学习和理解这三个文件的实现,你可以了解到爬虫的基本工作原理和设计模式,为进一步的Web数据挖掘打下基础。
Delphi 遍历所有文件夹的函数详解 在 Delphi 编程中,遍历文件夹是一个非常实用的功能,特别是在与 Excel 操作结合时,可以完成对报表的数据合成和整理。下面,我们将详细剖析一个遍历所有文件夹的函数的实现。 ...
1. **目录遍历概念**:目录遍历攻击是一种常见的Web应用程序安全漏洞,攻击者尝试通过在URL中输入特定的路径或字符串来访问服务器上的非公开目录和文件。例如,他们可能会尝试使用“../”或“..%2f”等符号来“向上...
对于TreeView,我们可以创建一个函数,该函数接收当前节点作为参数,然后遍历其所有子节点,同时对每个子节点调用相同的函数。这样,无论树有多少层,都可以通过递归遍历完整个树结构。 在描述中提到的"数据表的...
本文将通过一个名为"GridviewBatchOperation"的压缩包文件中的例子,详细介绍如何使用JavaScript在客户端遍历GridView的所有控件,实现批量操作。 首先,了解JavaScript的基本语法是必要的。JavaScript是一种轻量级...
### C# 获取远程网页中的所有链接URL 在本篇文章中,我们将探讨如何使用C#语言来获取远程网页上的所有链接URL。此技术广泛应用于搜索引擎、爬虫程序以及其他需要收集网络资源的应用场景中。 #### 一、基础知识介绍...
综上所述,通过结合ASP.NET2.0的文件系统操作、数据绑定技术、动态图片URL生成以及HTTP处理程序的使用,可以有效地实现从文件夹中遍历所有图片,并在网页上展示或生成缩略图的功能。这种实现方式不仅提高了网站的...
3. 遍历文件:在`handleFiles`函数中,我们可以遍历`event.target.files`,这是一个FileList对象,包含了用户选择的所有文件。通过递归遍历,我们可以找到所有的HTML文件。 ```javascript function handleFiles...
遍历后,你会得到一个文件URL的数组或迭代器。对于每个URL,你可以使用`lastPathComponent`来获取文件名,以及`pathExtension`来获取文件的扩展名,从而判断文件类型。 5. 文件类型识别: 文件扩展名是识别文件...
java代码实例-二叉树的创建以及三种遍历+URL爬虫分析敏感词汇(超详细) java代码实例-二叉树的创建以及三种遍历+URL爬虫分析敏感词汇(超详细) java代码实例-二叉树的创建以及三种遍历+URL爬虫分析敏感词汇(超...
该工具将遍历URL路径以查找打开的目录。 如果找到,它将查找所有zip / txt / exe文件并下载。 这些文件可能包含网络钓鱼源代码,受害者日志以及可能的恶意软件。 您可以在文本文件中提供URL列表,或者默认情况下,...
connect-traversal 是 Connect 和 Express 框架的中间件,它允许使用 URL 遍历而不是 URL 调度。 遍历机制比 URL 调度更强大,并在 Rails (Ruby)、Pyramid (Python) 等流行框架中使用。 对于新资源的注册,只需...
store="({url: 'dright.json', autoLoad: true}) %>" loader="() %>" > 根节点" /> <script type="text/javascript" src="example4.js"></script> ``` 以上代码创建了一个TREE面板,设置了数据源,并加载了一个...
二叉树的遍历及其应用--期中上机考试.cpp
在学习和实践中,需要注意遵循网站的使用协议,尊重版权,不要进行非法的数据抓取。此外,对于动态加载或JavaScript渲染的内容,可能需要更复杂的方法,如使用Selenium等工具来模拟浏览器行为。 总的来说,“遍历...
JSTL的核心库主要包含用于控制流程、迭代、URL处理等的标签。例如,`<c:forEach>`标签是用于遍历集合的,它是JSTL中最常用的标签之一。 **2. `<c:forEach>`标签** `<c:forEach>`标签用于遍历任何可迭代的数据源,...
本代码用for语句循环,用fi判断,增加3个执行模块,最大执行范围根据a的值来界定,a值可自定义。
它允许攻击者通过构造特定的URL,访问到网站服务器上原本不应公开的目录和文件,从而可能导致敏感信息泄露、系统权限提升甚至整个服务器被控制。这个主题的资料集合包含了用Python快速编写网站遍历程序的教程和相关...