html数据抓取,httpclient 抓取html数据

package com.hoperun.webos.servlet;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.HttpStatus;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import com.hoperun.webos.pojo.Entity;

import com.thoughtworks.xstream.XStream;

public class WidgetServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private List categoryArray = new ArrayList();

public WidgetServlet() {

super();

// 待办事宜

categoryArray.add("dbsy");

// 待阅事宜

categoryArray.add("dysy");

// 邮件

categoryArray.add("yj");

}

@Override

protected void service(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

// 请求参数在数组中的下标

int index = 0;

// 获取要提取的信息分类

String param = request.getParameter("category");

index = categoryArray.indexOf(param);

// 参数值大于等于零

if (index >= 0) {

Document doc = getDocument();

// 解析class=txt_12_black的节点,

// 总共为八个结果,我们只需要前六个,根据index的值来选择要解析的element,计算公式为2*i+1

Elements elements = doc.select(".txt_12_black");

Element element = elements.get(2 * index + 1);

// 详细解析

List result = detailParse(element);

// 将结果写到response中

response.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=utf-8");

String finalResult = toXML(result);

// 将result转化为xml格式

response.getWriter().write(finalResult);

}

}

/** 获取url所返回的页面数据 */

private Document getDocument() {

Document doc = null;

HttpClient httpClient = new DefaultHttpClient();

HttpGet httpGet = new HttpGet(

"http://10.20.107.102:8080/res/FrmRight_01.htm");

try {

HttpResponse httpResponse = httpClient.execute(httpGet);

// 返回成功

if (HttpStatus.SC_OK == httpResponse.getStatusLine()

.getStatusCode()) {

// 得到输入流

HttpEntity httpEntity = httpResponse.getEntity();

InputStream is = httpEntity.getContent();

// 解析为html文档

doc = Jsoup.parse(is, "gb2312", "http://10.20.107.102:8080");

}

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return doc;

}

/** 对element进行详细解析 */

private List detailParse(Element element) {

// 返回的结果实体集

List array = new ArrayList();

Elements elem = element.children();

// 返回记录的分类

String category = null;

for (Element temp : elem) {

// elem直接子元素的标签为tbody

if ("tbody".equals(temp.tagName())) {

Elements tbChild = temp.children();

Element categoryElement = null;

// 当他的直接子元素有两个时,第二个为该记录集合的分类信息,否则记录的分类信息位于第四个直接记录中

if (tbChild.size() == 2) {

categoryElement = tbChild.get(1);

category = categoryElement.text();

}

} else if ("a".equals(temp.tagName())) { // elem直接子元素的标签为a

Entity entity = new Entity();

// 记录项前面是否有选择框

int flag = 0;

Elements as = temp.child(0).child(0).child(0).children();

// 当第一个直接子元素的文本值为空时,则第一个直接子元素为选择框

if (null == as.get(0).text() || "".equals(as.get(0).text())) {

flag = 1;

}

entity.setData1(as.get(0 + flag).text());

entity.setDate2(as.get(1 + flag).text());

entity.setData3(as.get(2 + flag).text());

// 处理待阅事宜前面的选择框

if (as.size() == 4 && flag == 0) {

// 该记录的分类信息位于第四个直接子元素

entity.setData4(as.get(3).text());

} else {

// 该记录的分类信息是分类集合中的一条,所以分类信息位于tbody中

entity.setData4(category);

}

// 格式化地址

String href = temp.attr("href");

entity.setData5("http://10.20.107.102:8080" + formatURL(href));

array.add(entity);

} else if ("tr".equals(temp.tagName())) { // elem直接子元素的标签为tr

// 标签里面包含该记录的分类信息

category = temp.text();

}

}

return array;

}

/** 将result转化为xml格式 */

private String toXML(List array) {

XStream xstream = new XStream();

xstream.alias("item", Entity.class);

if (null == array) {

array = new ArrayList();

}

return xstream.toXML(array);

}

/** 格式化地址 */

private String formatURL(String href) {

int startIndex = href.indexOf("\'");

int endIndex = href.lastIndexOf("\'");

return href.substring(startIndex + 1, endIndex);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
压缩包中含有多个文档,从了解httpclient到应用。 httpClient 1httpClint 1.1简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。 下载地址:  http://hc.apache.org/downloads.cgi 1.2特性 1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1 2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。 3. 支持HTTPS协议。 4. 通过Http代理建立透明的连接。 5. 利用CONNECT方法通过Http代理建立隧道的https连接。 6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。 7. 插件式的自定义认证方案。 8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。 9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。 10. 自动处理Set-Cookie中的Cookie。 11. 插件式的自定义Cookie策略。 12. Request的输出流可以避免流中内容直接缓冲到socket服务器。 13. Response的输入流可以有效的从socket服务器直接读取相应内容。 14. 在http1.0和http1.1中利用KeepAlive保持持久连接。 15. 直接获取服务器发送的response code和 headers。 16. 设置连接超时的能力。 17. 实验性的支持http1.1 response caching。 18. 源代码基于Apache License 可免费获取。 1.3版本 org.apache.http.impl.client.HttpClients 与 org.apache.commons.httpclient.HttpClient目前后者已被废弃,apache已不再支持。 一般而言,使用HttpClient均需导入httpclient.jar与httpclient-core.jar2个包。 1.4使用方法与步骤 开发环境:需要 使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。 1.创建HttpClient对象。 HttpClient client = new HttpClient(); 2.创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。 //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的 http换成https HttpMethod method = new GetMethod("http://www.baidu.com"); //使用POST方法 HttpMethod method = new PostMethod("http://java.sun.com";); 3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。 3.调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。 client.executeMethod(method); 5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。 6. 释放连接。无论执行方法是否成功,都必须释放连接 //打印服务器返回的状态 System.out.println(method.getStatusLine()); //打印返回的信息 System.out.println(method.getResponseBodyAsString(

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值