`

正则表达式解析出页面所有链接,并得到链接的内容

阅读更多
Main类的main方法得到所有链接,此方法是带链接状态的
package com.logistics;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;

public class Main1 {

	/**
	 * @param args
	 * @throws IOException
	 * @throws ClientProtocolException
	 */
	public static void main(String[] args) throws Exception {
		 // Create and initialize HTTP parameters  
        HttpParams params = new BasicHttpParams();  
        ConnManagerParams.setMaxTotalConnections(params, 10);  
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
  
        // Create and initialize scheme registry  
        SchemeRegistry schemeRegistry = new SchemeRegistry();  
        schemeRegistry.register(  
                new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));  
  
        ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);  
		HttpClient client = new DefaultHttpClient(cm, params);
		HttpGet get = new HttpGet("http://localhost:8080/docs/");
		HttpResponse response = client.execute(get);
		HttpEntity entity = response.getEntity();
		byte[] b = new byte[1024];
		ByteArrayOutputStream stream = new ByteArrayOutputStream();
		if (entity != null) {
			InputStream is = entity.getContent();
			while (is.read(b) != -1) {
				stream.write(b);
			}
		}
		Pattern pattern = Pattern.compile("\\w+\\.html");
		Matcher matcher = pattern.matcher(stream.toString("utf-8"));
		ArrayList<String> list=new ArrayList<String>();
		while (matcher.find()) {
			list.add("http://localhost:8080/docs/"+matcher.group());
		}
		for (int i = 0; i < list.size(); i++) {
			new SpiderThread(client, new HttpGet(list.get(i)), i + 1).run();
		}
	}
}


然后使用线程得到链接内容
package com.logistics;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

public class SpiderThread extends Thread {
	 private final HttpClient httpClient;  
     private final HttpContext context;  
     private final HttpGet httpGet;  
     private final int id;  

     public SpiderThread(HttpClient httpClient, HttpGet httpGet, int id) {  
         this.httpClient = httpClient;  
         this.context = new BasicHttpContext();  
         this.httpGet = httpGet;  
         this.id = id;  
     }  

     /** 
      * Executes the GetMethod and prints some status information. 
      */  
     @Override  
     public void run() {  
    	Long start = System.currentTimeMillis();
         try {  
             HttpResponse response = httpClient.execute(httpGet);  
             HttpEntity entity = response.getEntity();  
             if (entity != null) {  
                 byte[] bytes = EntityUtils.toByteArray(entity);  
//                 System.out.println(new String(bytes,"utf-8"));  
                 System.out.println(httpGet.getURI().getPath());  
             }  
         } catch (Exception e) {  
             httpGet.abort();  
             System.out.println(id + " - error: " + e);  
         }  
         Long end = System.currentTimeMillis();
 		System.out.println(id +"  --  用时:"+(end-start));
     }  
}
0
1
分享到:
评论
8 楼 wxq594808632 2012-01-11  
legend9999 写道
杨胜寒 写道
legend9999 写道
杨胜寒 写道
legend9999 写道
杨胜寒 写道
不知道楼主做这样一个东西是干什么用的,说真的,一点价值都没有。
既然是用HttpClient,那为什么不采用HtmlParser或其他网页解析器来解析网页呢?且不说正则匹配的效率有多低,网页中的链接可不会都是html后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。

那为什么不采用HtmlParser或其他网页解析器来解析网页呢?
这类网页解析器也是用正则来匹配的吧!

那你未免太小看Apache的工程师们了,


那他们用什么来匹配 

你不应该这么问,应为HtmlParser不是为了抽取页面链接而生的,它主要是用来解析或纠正html的。如果楼主对网页解析感兴趣,可以查查HtmlParser的资料,因为它应该是当前java语言中最好的网页解析组件了

HtmlParser
这个东东在现在的项目中也使用了,用来抓取页面,做日志了!


相比HtmlParser,我更推荐jsoup
7 楼 legend9999 2012-01-10  
杨胜寒 写道
legend9999 写道
杨胜寒 写道
legend9999 写道
杨胜寒 写道
不知道楼主做这样一个东西是干什么用的,说真的,一点价值都没有。
既然是用HttpClient,那为什么不采用HtmlParser或其他网页解析器来解析网页呢?且不说正则匹配的效率有多低,网页中的链接可不会都是html后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。

那为什么不采用HtmlParser或其他网页解析器来解析网页呢?
这类网页解析器也是用正则来匹配的吧!

那你未免太小看Apache的工程师们了,


那他们用什么来匹配 

你不应该这么问,应为HtmlParser不是为了抽取页面链接而生的,它主要是用来解析或纠正html的。如果楼主对网页解析感兴趣,可以查查HtmlParser的资料,因为它应该是当前java语言中最好的网页解析组件了

HtmlParser
这个东东在现在的项目中也使用了,用来抓取页面,做日志了!
6 楼 杨胜寒 2012-01-10  
legend9999 写道
杨胜寒 写道
legend9999 写道
杨胜寒 写道
不知道楼主做这样一个东西是干什么用的,说真的,一点价值都没有。
既然是用HttpClient,那为什么不采用HtmlParser或其他网页解析器来解析网页呢?且不说正则匹配的效率有多低,网页中的链接可不会都是html后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。

那为什么不采用HtmlParser或其他网页解析器来解析网页呢?
这类网页解析器也是用正则来匹配的吧!

那你未免太小看Apache的工程师们了,


那他们用什么来匹配 

你不应该这么问,应为HtmlParser不是为了抽取页面链接而生的,它主要是用来解析或纠正html的。如果楼主对网页解析感兴趣,可以查查HtmlParser的资料,因为它应该是当前java语言中最好的网页解析组件了
5 楼 legend9999 2012-01-10  
杨胜寒 写道
legend9999 写道
杨胜寒 写道
不知道楼主做这样一个东西是干什么用的,说真的,一点价值都没有。
既然是用HttpClient,那为什么不采用HtmlParser或其他网页解析器来解析网页呢?且不说正则匹配的效率有多低,网页中的链接可不会都是html后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。

那为什么不采用HtmlParser或其他网页解析器来解析网页呢?
这类网页解析器也是用正则来匹配的吧!

那你未免太小看Apache的工程师们了,


那他们用什么来匹配 
4 楼 杨胜寒 2012-01-10  
legend9999 写道
杨胜寒 写道
不知道楼主做这样一个东西是干什么用的,说真的,一点价值都没有。
既然是用HttpClient,那为什么不采用HtmlParser或其他网页解析器来解析网页呢?且不说正则匹配的效率有多低,网页中的链接可不会都是html后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。

那为什么不采用HtmlParser或其他网页解析器来解析网页呢?
这类网页解析器也是用正则来匹配的吧!

那你未免太小看Apache的工程师们了,
3 楼 legend9999 2012-01-10  
杨胜寒 写道
不知道楼主做这样一个东西是干什么用的,说真的,一点价值都没有。
既然是用HttpClient,那为什么不采用HtmlParser或其他网页解析器来解析网页呢?且不说正则匹配的效率有多低,网页中的链接可不会都是html后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。

那为什么不采用HtmlParser或其他网页解析器来解析网页呢?
这类网页解析器也是用正则来匹配的吧!
2 楼 legend9999 2012-01-10  
杨胜寒 写道
不知道楼主做这样一个东西是干什么用的,说真的,一点价值都没有。
既然是用HttpClient,那为什么不采用HtmlParser或其他网页解析器来解析网页呢?且不说正则匹配的效率有多低,网页中的链接可不会都是html后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。


这是前一段时间,一个朋友想让我帮他抓页面的数据,好2000多分页,还要登录进去才行,就给他弄了个这。没考虑什么速度问题。
1 楼 杨胜寒 2012-01-10  
不知道楼主做这样一个东西是干什么用的,说真的,一点价值都没有。
既然是用HttpClient,那为什么不采用HtmlParser或其他网页解析器来解析网页呢?且不说正则匹配的效率有多低,网页中的链接可不会都是html后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。

相关推荐

    VB用正则表达式提取网页中的链接

    在Web页面中,链接通常以`&lt;a href="..."&gt;`的形式存在,通过正则表达式的匹配功能,可以精确识别并捕获这些链接地址,从而实现对网页内容的深度解析和数据提取。 ### 描述解读:“VB用正则表达式提取网页中的链接” ...

    页面静态化的正则表达式

    正则表达式可以用于从动态页面的源代码中提取特定部分,例如标题、正文或图片链接。例如,`(.*?)&lt;\/title&gt;`可以用于提取页面的标签内容。 3. **URL重写** 使用如Apache或Nginx等服务器的URL重写规则,可以将用户...

    精通正则表达式基于.NET ASP PHP JSP JavaScript

    RegexApplication/Default.aspx 正则表达式类的应用 RegexApplication/GetPageHtmlData.aspx 获取网页的内容 第10章(/10/) ASPNETValidator/Compare.aspx 比较验证 ASPNETValidator/...

    C#.Net使用正则表达式抓取百度百家文章列表

    本示例主要讲解如何使用C#.NET结合正则表达式来抓取并解析百度百家的文章列表。下面将详细阐述相关知识点。 1. **C#语言基础**: C#是一种面向对象的编程语言,由微软开发,广泛应用于Windows平台上的应用程序开发...

    Regulex-JavaScript正则表达式解析和可视化工具

    Regulex是一款强大的JavaScript工具,专门用于正则表达式的解析和可视化。在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,广泛应用于数据验证、搜索、替换等场景。然而,由于其语法复杂,...

    常用正则表达式PDF

    ### 常用正则表达式知识点解析 #### 一、正则表达式的定义与应用场景 正则表达式是一种强大的文本处理工具,它通过一种描述性的语言来匹配、查找、替换等操作一系列为了执行模式匹配而编写的字符组合。在实际开发...

    正则表达式提取html中的所有的Email地址

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。在本案例中,我们关注的是如何使用C#编程语言来编写正则表达式,从HTML文档中提取所有的电子邮件地址。下面将...

    url正则表达式

    博文链接给出的是一个ITEYE上的博客,由pengwenchao分享的关于URL正则表达式的内容。虽然没有直接提供具体的文章内容,但我们可以根据常见的URL结构和正则表达式基础来探讨这个主题。 1. **URL的基本结构** URL...

    正则表达式经典实例

    标题中提到的“正则表达式经典实例”,意味着接下来的内容将会围绕正则表达式的使用案例、方法和技巧展开。正则表达式是一种文本处理工具,广泛应用于计算机科学领域中的字符串搜索、替换、解析等各种场景。它通过...

    网址正则表达式匹配方法

    #### 正则表达式解析 `checkfiles`正则表达式的具体形式如下: ```javascript /((^http)|(^https)|(^ftp)):\/\/(\\w)+\.(\\w)+/ ``` - `((^http)|(^https)|(^ftp))`:这部分定义了网址的协议部分,即`http`、`...

    RegularExpressionTest_正则表达式工具.7z

    1. RegularExpressionTest.dll:这是主程序的动态链接库文件,包含了正则表达式测试工具的核心功能。 2. Interop.ADODB.dll:这是与ActiveX Data Objects (ADO)交互的组件,可能用于读取或处理数据源,例如在测试...

    Python-使用正则表达式和requests抓取猫眼TOP100的电影信息

    然而,实际网页结构可能更复杂,可能需要更精确的正则表达式或结合BeautifulSoup解析。 在进行网络爬虫时,还需注意以下几点: 1. **遵守robots.txt**:尊重网站的爬虫规则,不要爬取禁止爬取的页面。 2. **设置...

    正则表达式详解2(值得收藏)

    根据给定文件的信息,我们可以深入探讨正则表达式的应用与实践,特别是在Web日志解析、IP地址匹配以及HTML页面元素的提取等方面。正则表达式是一种强大的文本处理工具,能够帮助我们在复杂的数据集中查找、替换或...

    用正则表达式写的网络蜘蛛

    在C#环境下,结合HTTP请求、HTML解析和正则表达式,我们可以构建出针对特定任务(如获取淘宝商家名称)的定制化爬虫。然而,使用时要注意遵循网站的robots.txt规则,尊重数据隐私,以及避免对服务器造成过大的压力。

    正则表达式经典实例(高清)

    计算机精品学习资料大放送.html可能是一个链接到更多学习资源的页面,其中可能包含其他关于正则表达式的教程、练习和工具,有助于进一步提升你的正则表达式能力。 总的来说,掌握正则表达式是每个IT从业者必备的...

    4.3_信息过滤规则-正则表达式1

    因此,使用正则表达式能更灵活地定位并提取特定的元素或数据,即使网页布局和内容有所变化。 在正则表达式中,数量词有两种模式:贪婪模式和非贪婪模式。贪婪模式会尽可能多地匹配字符,而非贪婪模式则尽可能少地...

    regular正则表达式(regular expression).chm

    `regular.chm`文档很可能会详细介绍这些内容,包括实例解析和常见问题解答,对于学习和提升正则表达式技能非常有帮助。在阅读和实践过程中,应结合实际场景多加练习,才能真正掌握这一强大的工具。

    python爬虫;正则表达式爬虫

    例如,通过CSS选择器或方法(如`find_all()`和`get_text()`)来定位和提取信息,这通常比正则表达式更直观且健壮。 最后,当爬取的数据积累到一定程度时,可以使用`pandas.DataFrame`将数据组织成表格格式,便于...

    Python 正则表达式爬虫使用案例解析

    使用正则表达式匹配并提取网页源代码中感兴趣的部分,如特定格式的文本、图片链接等。 8. 关于编码的注意事项: 文中指出,html.decode("gbk")的方法并不是通用的,具体使用哪种编码解码方法取决于网页的实际编码...

Global site tag (gtag.js) - Google Analytics