`
legend9999
  • 浏览: 30657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
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后缀的,且有绝对路径和相对路径的区分,以楼主的算法,玩玩还可以。

相关推荐

    2023年美赛特等奖论文-F-2305794-解密.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文

    亚太经社会:2024年亚太贸易便利化报告.pdf

    亚太经社会:2024年亚太贸易便利化报告.pdf

    消费者价格指数下的年通货膨胀率(1960-2021年).xls

    消费者价格指数(CPI):按消费者价格指数衡量的通货膨胀反映出普通消费者在指定时间间隔(如年度)内购买固定或变动的一篮子货物和服务的成本的年百分比变化。通常采用拉斯佩尔公式进行计算。

    node-v8.10.0-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    网页制作基础学习--HTML+CSS常用代码.txt

    网页制作基础学习--HTML+CSS常用代码

    IEC TS 60364-8-3-2020 低压电气装置.第8-3部分:功能方面.生产用户电气装置的操作.pdf

    IEC TS 60364-8-3-2020 低压电气装置.第8-3部分:功能方面.生产用户电气装置的操作.pdf

    智能制造数字化供应链全栈解决方案.pptx

    智能制造数字化供应链全栈解决方案.pptx

    yolov5训练自己的数据集.docx

    yolov5训练自己的数据集

    Windows 10系统上安装和配置Tomcat的步骤

    附件是Windows 10系统上安装和配置Tomcat的步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    2018美赛O奖论文C题合集.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文

    超级实用简洁的反色软件,支持部分区域反色!!

    超级实用简洁的反色软件,支持部分区域反色!! 界面简洁,易于使用! 源码可以联系

    2024年中国NAD+抗衰补剂行业研究报告.docx

    2024年中国NAD+抗衰补剂行业研究报告

    高德地图API+Python解决租房问题内含源码和设计文档.md

    高德地图API+Python解决租房问题内含源码和设计文档.md

    QYResearch:2023年前10大壁纸刀企业占据全球39%的市场份额.docx

    QYResearch:2023年前10大壁纸刀企业占据全球39%的市场份额.docx

    广东工业大学-数据库简答题考试试题回忆版以及答案解析.doc

    此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。

    node-v9.11.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    MVIMG_20240506_214323.jpg

    MVIMG_20240506_214323.jpg

    2023年美赛特等奖论文-B-2318300-解密.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文

    数据库课程设计的概要介绍与分析

    数据库是计算机科学中的一个核心领域,它用于存储、管理和检索数据。随着信息技术的发展,数据库技术已经渗透到我们日常生活的方方面面,从简单的网站用户信息管理到复杂的企业级数据仓库系统,无一不彰显其重要性。以下是一个关于数据库的综合资源描述,旨在为初学者和专业人士提供一个全面的视角。 ### 1. 数据库基础 数据库的基础知识包括了解数据模型、数据库管理系统(DBMS)以及SQL语言等。数据模型主要有关系型模型(如MySQL、Oracle)、非关系型模型(NoSQL,如MongoDB、Cassandra)等。关系型数据库遵循ACID特性(原子性、一致性、隔离性、持久性),适用于需要高度一致性的场景;而非关系型数据库则以灵活的schema设计和高可扩展性见长,适用于大数据处理和实时Web应用。 ### 2. 学习资源 - **在线课程**:Coursera、edX、Udacity等平台提供了多门数据库相关的课程,涵盖从入门到高级的各种主题,比如Stanford大学的《数据库系统概念》课程。 - **书籍**:《数据库系统概论》(Silberschatz, Korth, Sudarsha

    《统计与数据分析基础》03数据处理.pptx

    《统计与数据分析基础》03数据处理

Global site tag (gtag.js) - Google Analytics