不少朋友反映,Hawk的手气不错,好像没法处理动态页面。其实很容易,比其他软件都容易,让我慢慢道来。

1. 什么是动态页面

很多网站,在刷新的时候会返回页面的全部内容,但实际上只需要更新一部分,这样可大大节约带宽。这种方式一般叫ajax,服务器传递xml或者json到浏览器,浏览器的js代码执行,并将这些数据渲染到页面上。

所以,真正获取数据的url,不一定是你在浏览器上看到的,而且里面会涉及到一些js调用,本质上,js启动了一些新的web请求来获取数据,只要你能模拟这些web请求(我们称之为隐藏请求),就能同样获取json格式的数据。

2.通过嗅探来获取隐藏请求

通过浏览器和抓包工具,可以获取这些隐藏请求,但这需要对web请求的原理比较熟悉,不适合于初学者,但是!Hawk可以采用自动嗅探的方式来进行。

Json处理

Json是最为常见的数据传输格式,也是一棵树。里面包含键值对(字典)和数组,详细信息可以参考文档。

步骤1: 将Json合法化

有时候,网站传过来的json并不是非常合法的json,一些带回调的地址返回的数据,会是如下的形式:

var datas=此处是json;

此时就需要通过字符首尾抽取,或正则表达式和字符串分割等方法,把真正合法的json提取出来。

步骤2: 将字符串转换为文档

上一步获取的结果,依然是个字符串,你需要将其转换为json。 拖入json转换器即可。常见的json有三种模式,我们依次讲解。

  • 类型1:

数据可能位于'data'字段。此处,json转换器应当选择“不进行转换”,转换器本身就不进行任何操作,而是将该json作为整体传到新列里。

之后使用python转换器,脚本内容填写value['data']. value就是当前列所对应的内容,后面的部分是获取其data。 如果嵌套的更深,你可能需要 value['data1']['data2']

{
'total':12
'data':
[
{ 'key':'value'}
{ 'key':'value'}
]
}
  • 类型2:

这种类型比较少见,是一种纯键值对的字典,我们通常想做的操作,是把内部的键值对都列出来,比如新添key1,key2两个列,内容是value。

方法很简单,json转换器选择"单文档"模式即可。不需要python转换器。

{
'key1':'value'
'key2':'value'
}

类型3:

[

{ 'key':'value'}

{ 'key':'value'}

]

json选择器选择“文档列表”模式即可,不需要python转换器。

所以,看出来了么?json和python转换器的三种工作模式都是一个意思,当你要处理一个数组,就选择文档列表,一个字典,就选择单文档,如果还要取内部更深的信息,就选择不进行转换

json在Hawk的表示问题

由于Hawk的可视化列表中,只能显示字符串和数字,而Json是一棵树,在Hawk中就很难显示.后期会考虑对这块做优化。

如果显示System.Object[], 这表示是一个数组。

如果显示System.Generic.Dictionary... 表示为字典。 也就是文档。

这一块设计得确实非常糟糕,对于一般人来说理解起来太匪夷所思,也是我做得不够好的地方。。。希望能帮到大家。

用python转换器处理Json


案例. 专利网站的ajax实例

步骤1:嗅探

我们以某政府网站的专利检索为例来说明如何使用:

http://www.pss-system.gov.cn/sipopublicsearch/patentsearch/showNavigationClassifyNum-showBasicClassifyNumPageByIPC.shtml?params=D7B3D1618C9AC685055FF6612F62529676324C8B6E7F92197ECA1C4E4212C394

示例图如下:



不论你点什么样的下拉菜单,url是不变的。我们可以断定这是一个ajax页面。

现在的目标是,通过一个分类号,如D01B1/00,来获取它的中文含义和英文含义,也就是右边的内容:

我们启动Hawk,新建一个网页采集器,把刚才的那串url拷贝到网页采集器的地址栏里,发现获取的数据根本不包含这些中文含义。

怎么办呢?

你可以用嗅探,我们将天然或人造的线或纤维作为关键字,填写到网页采集器的内容筛选里:

之后点击开始。然后在你的浏览器上点击下拉菜单,展开分类号。发现Hawk已经成功嗅探到了字段:

此时,打开请求属性,就能看到真正请求的相关信息:



这是一次Post请求, (真实地址)url

http://www.pss-system.gov.cn/sipopublicsearch/patentsearch/showNavigationClassifyNumAC!searchChildrenOfClassifyNum.do

post的内容是classifyNum=D01

有了这些,我们把这个采集器命名为专利查询,下一步就好办了。

步骤2: 数据清洗流

此处我简单描述一下,你可以新建一个数据清洗,生成所有要查询的专利号的ID。这个相对容易。比如拖入从文本生成

再拖入合并多列,把这一串ID转换为要post的一列数据:

再拖入添加新列,因为要让网页采集器访问那个真实数据的url,所以把上面提到的真实地址填进去:

见证奇迹的时刻到了,拖入从爬虫转换到刚才的url列,之后如下配置:

由于post数据要从post列读入,所以用方括号括起来,像这样[post].

出现了这样的结果:

这是个Json,因此我们拖入转换为json到content列:并将生成模式改为单文档,因为这只是一个字典,而不是字典数组:

你会发现只有一列有值:



是个数组。那么,再拖入python转换器,生成模式配置为文档列表:

你要的数据就都有了:

点评:这种请求,虽然可以用Hawk来配置,不过还是建议使用python,能获取更大的灵活性

案例2:未完待续

Hawk 3.1 动态页面,ajax,瀑布流的更多相关文章

  1. [Stephen]页面实现瀑布流源码

    项目中使用到的瀑布流代码 @using tZ.Pms.Biz @using tZ.Mvc.Base @model IPageInfo @{ ViewBag.Title = Model.WebTitle ...

  2. 原生ajax瀑布流demo

    最近听朋友们说起瀑布流挺多的,自己就去研究下了,一个简单的原生demo,分享给大家... 简单分为三个文档,有详细的注释:img:ajax.php:demo.php 其中img文件夹中放入图片 1.j ...

  3. web页面和小程序页面实现瀑布流效果

    小程序实现瀑布流效果,和web页面差不多,都要经过以下步骤: 1).加载图片,获取图片的宽高度: 2).根据页面需要显示几列计算每列的宽度: 3).根据图片真实宽度和每列的宽度比,计算出图片需要显示的 ...

  4. Ajax——瀑布流

    基本概念 1.宽度是一致的,高度上参差不齐 2.新增内容优先放置在最矮的地方 核心难点 1.用一个数组存储每列的高度值 2.新值添加到值最小索引上,每次替换更新数组 插件使用 1.$.fn.exten ...

  5. jQuery ajax瀑布流加载静态的列表页面

    1.加载一行数据 <script> //滚动加载事件 var Loadurl = "{$url}"; if(window.location.href !== Loadu ...

  6. ajax 瀑布流 demo

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. ajax 瀑布流实现

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Django模板语言中的自定义方法filter过滤器实现web网页的瀑布流

    模板语言自定义方法介绍 自定义方法注意事项 Django中有simple_tag 和 filter 两种自定义方法,之前也提到过,需要注意的是 扩展目录名称必须是templatetags templa ...

  9. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...

随机推荐

  1. MySQL慢查询日志总结

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志 ...

  2. html5地理位置定位功能小析

    Geolocationd 基本原理1.GPS    GPS基本原理是测量出已知位置的卫星到用户接收机之间的距离,然后综合多颗卫星的数据就可知道接收机的具体位置.适用于具备GPS功能的设备(1)优点:在 ...

  3. Angularjs ng-if和ng-show的区别

    ng-if:判断条件,为true时向html中插入节点,否则从html中移除节点: ng-show: 简单的显示和隐藏(display) 坑点:ng-if会创建一个新的作用域(scope),如果内部元 ...

  4. RecyclerView的介绍与使用

    一.什么是RecyclerView 新的视图控件,是Android-support-v7-21版本中新增的一个Widgets,官方对于它的介绍则是:RecyclerView是ListView的升级版本 ...

  5. 前端开发神器sublime Text

    实用的sublime插件集合 – sublime必备插件 前言 入前端领域开始,就学着使用sublime,一直用起来很顺手,速度是我最欣赏的,快的没有编辑器可以匹敌.还是废话不多扯,入正题.好多有多少 ...

  6. Java 用LinkdeList实现52张扑克牌

    用LinkdeList实现52张扑克牌(不含大小王)的洗牌功能.提示:花色 ,和数字分别用数组存储. import java.util.LinkedList; import java.util.Ran ...

  7. 深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  8. C# RabbitMq .net 使用

    本文转载来自 [http://www.cnblogs.com/yangecnu/p/Introduce-RabbitMQ.html]写的很详细. 文件安装包官方DEMO下载地址是:http://pan ...

  9. 使用java反射机制编写Student类并保存

    定义Student类 package org; public class Student { private String _name = null; ; ; public Student() { } ...

  10. 使用NServiceBus开发分布式应用

    系列主题:基于消息的软件架构模型演变 NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)--企业服务总线.NSe ...