-
java网页抓取问题20
在这个网站中:http://wwwapps.ups.com/WebTracking/track?HTMLVersion=5.0&loc=zh_CN&Requester=UPSHome&WBPM_lid=homepage%2Fct1.html_pnl_trk&trackNums=H8947154378&track.x=%E8%BF%BD%E8%B8%AA
需要抓取:页面中的运输进程的部分 该运输进程 查看源码为一个div层 (<div class="secBody" >) 点击层厚URL地址改变为:http://wwwapps.ups.com/WebTracking/detail 因为抓取的信息需要 第一个链接中的H8947154378 参数 所以URL改变后就不知道怎么抓取了
通过普通抓取 只能抓取到 层中的第一条数据和最后一条数据 火狐和其他浏览器查看第一个页面的源码也只有div中第一条数据和最后一条
public String getPageContent(String strUrl, String strPostRequest,int maxLength) {
// 读取结果网页
StringBuffer buffer = new StringBuffer();
System.setProperty("sun.net.client.defaultConnectTimeout", "5000");
System.setProperty("sun.net.client.defaultReadTimeout", "5000");
try {
URL newUrl = new URL(strUrl);
HttpURLConnection hConnect = (HttpURLConnection) newUrl.openConnection();
// POST方式的额外数据
if (strPostRequest.length() > 0) {
hConnect.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(hConnect.getOutputStream());
out.write(strPostRequest);
out.flush();
out.close();
}
// 读取内容
BufferedReader rd = new BufferedReader(new InputStreamReader(hConnect.getInputStream(),"utf-8"));
int ch;
for (int length = 0; (ch = rd.read()) > -1 && (maxLength <= 0 || length < maxLength); length++)
buffer.append((char) ch);
String s = buffer.toString();
s.replaceAll("//&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "");
System.out.println(s);
rd.close();
hConnect.disconnect();
return buffer.toString().trim();
} catch (Exception e) {
return "错误:读取网页失败!";
//
}
}
public static void main(String[] args) {
String url = "http://wwwapps.ups.com/WebTracking/track?HTMLVersion=5.0&loc=zh_CN&Requester=UPSHome&WBPM_lid=homepage%2Fct1.html_pnl_trk&trackNums=H8947154378&track.x=%E8%BF%BD%E8%B8%AA";
String url2 = "http://wwwapps.ups.com/WebTracking/detail";
Test p = new Test();
p.getPageContent(url, "post", 100500);
Test3 p3 = new Test3();
p3.getPageContent(url2, "post", 100500);
System.out.print("已经执行!");
}
上面是我写的普通抓取办法
想请教大家 是否有其他解决办法 没有公开的API接口2012年6月21日 16:42
4个答案 按时间排序 按投票排序
-
采纳的答案
这里是使用HttpClient和nekohtml的完整实现,能够完整抓取出来运输进程一览:
public class UpsDetail { private static final String HTML_TACK_HTML = "html/tack.html"; private static final String HTML_DETAIL_HTML = "html/detail.html"; private static String url1 = "http://wwwapps.ups.com/WebTracking/track?HTMLVersion=5.0&loc=zh_CN&Requester=UPSHome&WBPM_lid=homepage%2Fct1.html_pnl_trk&trackNums=H8947154378&track.x=%E8%BF%BD%E8%B8%AA"; private static String url2 = "http://wwwapps.ups.com/WebTracking/detail"; public static void main(String[] args) { try { //抓取追踪信息页面HTML getHtml(url1, HTML_TACK_HTML, null); //获取 抓取运输进程页面HTML时 需要的参数 Map<String, String> data = getHiddenValue(HTML_TACK_HTML); //抓取运输进程页面HTML getHtml(url2, HTML_DETAIL_HTML, data); //获取运输进程 List<DetailBean> list = getDetailList(HTML_DETAIL_HTML); //打印详细的运输进程 DetailBean bean = null; System.out.println("地点" + "\t" + "日期" + "\t" + "当地时间" + "\t" + "处理"); for (int i = 0; i < list.size(); i++) { bean = list.get(i); System.out.println(bean.getLocation() + "\t" + bean.getDate() + "\t" + bean.getTime() + "\t" + bean.getOperation()); } } catch (Exception e) { e.printStackTrace(); } } private static List<DetailBean> getDetailList(String html) throws Exception { List<DetailBean> list = new ArrayList<DetailBean>(); DOMParser parser = new DOMParser(); parser.parse(html); Node node = parser.getDocument(); Node tb = XPathAPI.selectSingleNode(node, "//TABLE[@class='dataTable']"); NodeList tdlist = XPathAPI.selectNodeList(tb, "//TR/TD"); int line = 0; while (line < tdlist.getLength() / 4) { DetailBean bean = new DetailBean(); bean.setLocation(deleteSpace(tdlist.item(line * 4 + 0).getTextContent())); bean.setDate(deleteSpace(tdlist.item(line * 4 + 1).getTextContent())); bean.setTime(deleteSpace(tdlist.item(line * 4 + 2).getTextContent())); bean.setOperation(deleteSpace(tdlist.item(line * 4 + 3).getTextContent())); line++; list.add(bean); } return list; } private static Map<String, String> getHiddenValue(String html) throws Exception { Map<String, String> data = new HashMap<String, String>(); List<String> params = new ArrayList<String>(); params.add("loc".toLowerCase()); params.add("USER_HISTORY_LIST".toLowerCase()); params.add("progressIsLoaded".toLowerCase()); params.add("refresh_sii".toLowerCase()); params.add("showSpPkgProg1".toLowerCase()); params.add("datakey".toLowerCase()); params.add("HIDDEN_FIELD_SESSION".toLowerCase()); params.add("trackNums".toLowerCase()); DOMParser parser = new DOMParser(); parser.parse(html); Node node = parser.getDocument(); NodeList nodeList = XPathAPI.selectNodeList(node, "//INPUT"); for (int i = 0; i < nodeList.getLength(); i++) { Element e = (Element) nodeList.item(i); if ("hidden".equalsIgnoreCase(e.getAttribute("type")) && params.contains(e.getAttribute("name").toLowerCase())) { data.put(e.getAttribute("name"), e.getAttribute("value")); } } System.out.println("订单编号:" + data.get("trackNums")); return data; } private static void getHtml(String url, String filename, Map<String, String> data) throws Exception { //创建一个客户端 DefaultHttpClient client = new DefaultHttpClient(); HttpResponse res = null; if (data == null) { //创建一个get方法 HttpGet get = new HttpGet(url); //执行请求 res = client.execute(get); } else { client.setRedirectStrategy(new DefaultRedirectStrategy() { public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) { boolean isRedirect = false; try { isRedirect = super.isRedirected(request, response, context); } catch (ProtocolException e) { e.printStackTrace(); } if (!isRedirect) { int responseCode = response.getStatusLine().getStatusCode(); if (responseCode == 301 || responseCode == 302) { return true; } } return isRedirect; } }); //作成post参数Entity List<NameValuePair> formparams = new ArrayList<NameValuePair>(); Iterator i = data.keySet().iterator(); while(i.hasNext()) { String key = (String)i.next(); formparams.add(new BasicNameValuePair(key, data.get(key))); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8"); //创建一个post方法 HttpPost post = new HttpPost(url); //设置post参数 post.setEntity(entity); //执行请求 res = client.execute(post); } //获取完整的StatusLine・・・「HTTP/1.1 200 OK」 System.out.println(res.getStatusLine().toString()); //获取返回内容 if (res.getEntity() != null) { String result = EntityUtils.toString(res.getEntity()); //System.out.println(result); //生成HTML文件保存到本地(测试用可以不保存直接解析) createHtmlFile(filename, result); } //关闭流 EntityUtils.consume(res.getEntity()); //关闭连接 client.getConnectionManager().shutdown(); } private static void createHtmlFile(String filename, String data) throws Exception { File file = new File(filename); OutputStream os = new FileOutputStream(file); os.write(data.getBytes("UTF-8")); os.close(); } private static String deleteSpace(String in) { Pattern pattern = Pattern.compile("\\s*|\t|\r|\n"); Matcher re = pattern.matcher(in); return re.replaceAll(""); } }
其中用到的DetailBeanpublic class DetailBean { //地点 private String location; //日期 private String date; //当地时间 private String time; //处理 private String operation; public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getOperation() { return operation; } public void setOperation(String operation) { this.operation = operation; } }
2012年6月22日 11:15
-
注意运输进程点击后提交的是POST请求,
虽然这个网址http://wwwapps.ups.com/WebTracking/detail后面没参数了,但他是POST请求,里面藏着2个cookie要传给网站。
UPS_SHARED_SESSION:
webappcommon.cclamp.usb.acceptsCookie
我想H8947154378 参数已经通过session/cookie藏在里面了。所以你要在第一个网页先找到以上两个cookie参数。并通过POST方式提交给第二个网页。
建议用firebug监控每次提交网页的动作(GET,POST)到底传哪些参数给网站,以及网站返回给你哪些信息(set-cookie)
单用JDK搞定这类工作会很累,建议用一些第三方类包,比如httpclient抓网页,htmlparser解析html(建议前2个),或者用webharvest搞定(但这个是写xml,初学者会比较累)。可选用的开源包很多,比自己写来的方便多了。
同时建议了解一下http协议,不然做这类东西会云里雾里,知其然不知其所以然。了解了http协议,你就知道为什么要这样GET,POST了,cookie,session的作用。2012年6月22日 11:34
相关推荐
Java网页抓取数据是互联网数据挖掘的一个重要领域,它允许开发者通过编程方式获取网页上的信息,从而实现自动化分析、监控或构建智能应用。在Java中,我们通常使用HTTP客户端库和HTML解析工具来实现这一目标。本文将...
Java网页抓取是一种技术,主要用于从互联网上自动提取或获取数据。这个"java网页抓取demo"项目提供了实现这一功能的实例代码。项目中的jar包是实现网页抓取的关键依赖库,包括Apache Commons Logging和HTTP Client。...
Java网页抓取数据是互联网开发中的一个重要技能,它允许开发者从网页中提取所需的信息,如新闻、产品数据或用户评论,以供进一步分析或利用。本主题主要涵盖以下几个关键知识点: 1. **网络请求库**:在Java中,...
在这个Java实现网页抓取的项目中,我们将探讨如何利用Java编程语言来抓取网页内容。下面将详细介绍这个过程涉及的关键知识点。 1. **网络基础知识**:首先,理解HTTP协议是必要的,它是互联网上应用最广泛的一种...
Java抓取https网页数据,解决peer not authenticated异常。导入eclipse就能运行,带有所用的jar包(commons-httpclient-3.1.jar,commons-logging.jar,httpclient-4.2.5.jar,httpcore-4.2.4.jar)
java抓取网页数据,主要用于抓取手机号和身份证查询网站的数据。
java程序,能进行简单的网页抓取,及数据抓取,里面还有火车采集器的内容
本文将详细讨论如何使用Java语言来抓取网页数据,包括两种主要方法:直接抓取原网页内容和处理网页中的JavaScript返回数据。 首先,让我们探讨**抓取原网页**的方法。在Java中,我们可以使用`java.net.URL`类来建立...
在“java抓取网页数据”这个主题中,我们将深入探讨如何利用Java来抓取并处理互联网上的信息。 首先,我们要了解什么是网络爬虫。网络爬虫(Web Crawler)是自动遍历互联网的程序,通过抓取网页内容并存储在本地,...
java简单的抓取网页内容的程序java简单的抓取网页内容的程序java简单的抓取网页内容的程序java简单的抓取网页内容的程序java简单的抓取网页内容的程序java简单的抓取网页内容的程序java简单的抓取网页内容的程序java...
在Java编程语言中,抓取网页内容是一项常见的任务,尤其对于...通过以上步骤,你可以在Java中实现简单的网页抓取。随着经验的积累,你可以逐渐掌握更复杂的技术,如数据存储、分布式爬虫等,进一步提升网页抓取的能力。
Java网页抓取是一个常见的任务,用于从网页上提取结构化数据,例如HTML文档中的文本、链接、图片等信息。在Java领域,Jsoup是一个非常流行的库,它提供了强大的功能来解析、操纵和提取HTML内容。Jsoup包全指的是包含...
java抓取网页java工具类java抓取网页java工具类
Java 抓取网页内容三种方式 Java 抓取网页内容是指使用 Java 语言从互联网上抓取网页内容的过程。抓取网页内容是数据爬虫和网络爬虫的基础,它广泛应用于数据挖掘、信息检索、机器学习等领域。本文将介绍使用 Java...
Java网络爬虫是一种自动化程序,用于从互联网上抓取大量数据。它的工作原理是模拟浏览器发送HTTP请求到服务器,接收响应,并解析返回的HTML或XML文档以提取所需信息。在这个过程中,HttpClient是一个常用的Java库,...
本文是一份关于使用Java语言进行网页数据抓取的教程,主要介绍了使用Apache HttpClient这个库来完成网络请求和数据获取的操作。Apache HttpClient是一个支持HTTP协议的客户端工具,被广泛应用于Java爬虫开发中,帮助...
简单Java爬虫,抓取网页内容,让你了解爬虫机制,熟悉网络编程
Java作为一种广泛应用的编程语言,提供了多种库来实现网页抓取。本篇将重点讲解如何利用HTMLParser库在Java中抓取网页数据。 HTMLParser是Java的一个开源库,专门用于解析HTML文档,提取其中的数据。它的设计目标是...
而Java作为一种广泛使用的编程语言,在网页抓取方面有着强大的功能。 #### Java抓取网页数据的实现方式 要实现Java抓取网页数据,我们需要关注以下几个关键点: 1. **确定目标URL**:明确需要抓取哪个网站的数据。...
### Java抓取网站数据知识点详解 #### 一、概述 在现代互联网开发中,抓取网站数据是一项重要的技能。无论是进行市场调研、竞品分析还是数据挖掘,掌握如何使用Java来抓取数据都是十分必要的。本篇文章将详细介绍...