有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同!

本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据;(2)抓取网页Javascript返回的数据。

一、抓取原网页。

这个例子我们准备从http://ip.chinaz.com上抓取ip查询的结果:

第一步:打开这个网页,然后输入IP:111.142.55.73,点击查询按钮,就可以看到网页显示的结果:

第二步:查看网页源码,我们看到源码中有这么一段:

从这里可以看出,查询的结果,是重新请求一个网页之后显示的。

再看看查询之后的网页地址:

也就是说,我们只要访问形如这样的网址,就可以得到ip查询的结果,接下来看代码:

  1. public void captureHtml(String ip) throws Exception {
  2. String strURL = "http://ip.chinaz.com/?IP=" + ip;
  3. URL url = new URL(strURL);
  4. HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  5. InputStreamReader input = new InputStreamReader(httpConn
  6. .getInputStream(), "utf-8");
  7. BufferedReader bufReader = new BufferedReader(input);
  8. String line = "";
  9. StringBuilder contentBuf = new StringBuilder();
  10. while ((line = bufReader.readLine()) != null) {
  11. contentBuf.append(line);
  12. }
  13. String buf = contentBuf.toString();
  14. int beginIx = buf.indexOf("查询结果[");
  15. int endIx = buf.indexOf("上面四项依次显示的是");
  16. String result = buf.substring(beginIx, endIx);
  17. System.out.println("captureHtml()的结果:\n" + result);
  18. }

使用HttpURLConnection连接网站,用bufReader保存网页返回的数据,然后通过自定义的一个解析方式将结果显示出来。

这里我只是随便的解析了一下,要解析的非常准确的话自己需再处理。

解析结果如下:

captureHtml()的结果:
查询结果[1]: 111.142.55.73 ==>> 1871591241 ==>> 福建省漳州市 移动</strong><br />

二、抓取网页JavaScript返回的结果。

有时候网站为了保护自己的数据,并没有把数据直接放在网页源码中返回,而是采用异步的方式,用JS返回数据,这样可以避免搜索引擎等工具对网站数据的抓取。

首先看一下这个网页:

用第一种方式查看该网页的源码,却没有发现该运单的跟踪信息,因为它是通过JS的方式获取结果的。

但有时候我们很需要获取到JS的数据,这个时候要怎么办呢?

这个时候我们需要用到一个工具:HTTP Analyzer,这个工具可以截获Http的交互内容,我们通过这个工具来达到我们的目的。

首先点击Start按钮之后,它就开始监听网页的交互行为了。

我们打开网页:http://www.kiees.cn/sf.php ,可以看到HTTP Analyzer列出了所有该网页的请求数据以及结果:

为了更方便的查看JS的结果,我们先清空这些数据,然后再网页中输入快递单号:107818590577,点击查询按钮,然后查看HTTP Analyzer的结果:

这个就是点击查询按钮之后,HTTP Analyzer的结果,我们继续查看:

从上面两幅图中可以看出,HTTP Analyzer可以截获JS返回的数据,并在Response Content中显示,同时可以看到JS请求的网页地址。

既然如此,我们只要分析HTTP Analyzer的结果,然后模拟JS的行为就可获取到数据,即我们只要访问JS请求的网页地址来获取数据,当然前提是这些数据是没有经过加密的,我们记下JS请求的URL:http://www.kiees.cn/sf.php?wen=107818590577&channel=&rnd=0

然后让程序去请求这个网页的结果即可!

下面是代码:

  1. public void captureJavascript(String postid) throws Exception {
  2. String strURL = "http://www.kiees.cn/sf.php?wen=" + postid
  3. + "&channel=&rnd=0";
  4. URL url = new URL(strURL);
  5. HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  6. InputStreamReader input = new InputStreamReader(httpConn
  7. .getInputStream(), "utf-8");
  8. BufferedReader bufReader = new BufferedReader(input);
  9. String line = "";
  10. StringBuilder contentBuf = new StringBuilder();
  11. while ((line = bufReader.readLine()) != null) {
  12. contentBuf.append(line);
  13. }
  14. System.out.println("captureJavascript()的结果:\n" + contentBuf.toString());
  15. }

看到了吧,抓取JS的方式和前面抓取原网页的代码一模一样,我们只不过做了一个分析JS的过程。

下面是程序执行的结果:

captureJavascript()的结果:

<div class="results"><div id="ali-itu-wl-result" class="ali-itu-wl-result"><h2 class="logisTitle">运单<span class="mail-no">【107818590577】</span>的跟踪信息</h2><div class="trace_result"><ul><li><span class="time">2012-07-16 15:46:00</span><span class="info">已收件 </span></li><li><span class="time">2012-07-16 16:03:00</span><span class="info">快件在 广州\t,准备送往下一站广州集散中心 </span></li><li><span class="time">2012-07-16 19:33:00</span><span class="info">快件在 广州集散中心,准备送往下一站佛山集散中心 </span></li><li><span class="time">2012-07-17 01:56:00</span><span class="info">快件在 佛山集散中心\t,准备送往下一站佛山 </span></li><li><span class="time">2012-07-17 09:41:00</span><span class="info">正在派件.. </span></li><li><span class="time">2012-07-17 11:28:00</span><span class="info">派件已签收 </span></li><li><span class="time">2012-07-17 11:28:00</span><span class="info">签收人是:已签收 </span></li></ul><div></div></div></div>  </div>

这些数据就是JS返回的结果了,我们的目的达到了!

希望本文能够对需要的朋友有一点帮助,需要程序源码的,请点击这里下载

Java抓取网页数据(原网页+Javascript返回数据)的更多相关文章

  1. java抓取动态生成的网页

    最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到).刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分布式爬虫框架 ...

  2. java 抓取网页图片

    import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Out ...

  3. Fiddler: 如何抓取HTTPS协议的网页

    作者:韦玮  转载请注明出处 Fiddler默认只能抓取HTTP协议的网页,不能抓取HTTPS协议的网页,而我们很多时候,都需要抓HTTPS协议的网页,比如抓淘宝数据等.今天,韦玮老师会为大家讲解如何 ...

  4. Fiddler如何抓取HTTPS协议的网页

    Fiddler默认只能抓取HTTP协议的网页,不能抓取HTTPS协议的网页,而我们很多时候,都需要抓HTTPS协议的网页,比如抓淘宝数据等.今天,韦玮老师会为大家讲解如何使用Fiddler抓取HTTP ...

  5. 如何让Python爬虫一天抓取100万张网页

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王平 源自:猿人学Python PS:如有需要Python学习资料的 ...

  6. 使用Fiddler抓取微信饿了么小程序数据

    使用Fiddler抓取微信饿了么小程序数据 准备 一部装载Android 7.0以下的手机:此处使用华为荣耀5x 微信小程序7.0以下版本:此处为6.6.7.此处可通过豌豆荚应用下载. 安装好的Fid ...

  7. C#串口通信—向串口发送数据,同步接收返回数据

    最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接 ...

  8. Java抓取网页数据(原来的页面+Javascript返回数据)

    转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因为种种原因,我们须要採集某个站点的数据,但因为不同 ...

  9. java抓取网页数据,登录之后抓取数据。

    最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...

随机推荐

  1. settings.xml

    <settings> <!--本地仓库.该值表示构建系统本地仓库的路径.其默认值为~/.m2/repository,windows:C:/Users/Administrator/.m ...

  2. IO流认识

    处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写能力.  BufferedWriter/BufferedReader(缓冲流)是处理流中的一种 OutputS ...

  3. ACM题目————Robot Motion

    Description A robot has been programmed to follow the instructions in its path. Instructions for the ...

  4. python实现删除文件与目录的方法

    os.remove(path) 删除文件 path. 如果path是一个目录, 抛出 OSError错误.如果要删除目录,请使用rmdir().os.rmdir()只能删除空目录 remove() 同 ...

  5. maven 手动安装jar到仓库的命令

    mvn install:install-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.6.0 -Dpackaging=jar -Dfile ...

  6. 关于IllegalMonitorStateException异常

    关于IllegalMonitorStateException异常: api中的解释  另请参见: Object.notify(), Object.notifyAll(), Object.wait(), ...

  7. 第十二届浙江省大学生程序设计大赛-Lunch Time 分类: 比赛 2015-06-26 14:30 5人阅读 评论(0) 收藏

    Lunch Time Time Limit: 2 Seconds Memory Limit: 65536 KB The 999th Zhejiang Provincial Collegiate Pro ...

  8. python中给for循环增加索引

    for index, item in enumerate(Foo()): print "index: ", index, " item: ",item 用enu ...

  9. Resilio(BtSync)搭建

    Resilio(原名:BtSync)介绍 同步是使用PC和Mac,NAS,甚至服务器之间传输文件的最好方法.创建自己的私有云.连接设备和同步文件安全,不发送他们在第三方服务器.我们不限制你的速度和存储 ...

  10. LoadRunner使用之变量关联

    性能测试LR小结之参数关联(LoadRunner11.0) 关联对于LR是经常需要用到的,本章使用简单登录来介绍关联功能. 1.       Q:何为关联? 所谓的关联就是把脚本中某些写死的代码(ha ...