背景

最近公司需要抓取中国农业信息网(http://jgsb.agri.cn/controller?SERVICE_ID=REGISTRY_JCSJ_MRHQ_SHOW_SERVICE&recordperpage=15&newsearch=true&login_result_sign=nologin) 的数据。在 google 浏览器使用 F12 查看可以发现价格行情数据是嵌套在一个 flash 中的,点击下一页请求服务器,可以看到返回的数据格式是 application/x-amf ,浏览器无法正常解析该数据,接下来就需要用的抓包工具 charles(下载地址 : https://www.charlesproxy.com/download/) 了。

处理

运行抓包工具,在该页面点击 下一页,charles 中效果如图 :

可以看到比较重要的一些请求封装,然后就是使用 java 模拟 amf 请求了。

maven 依赖

        <!-- https://mvnrepository.com/artifact/org.apache.flex.blazeds/flex-messaging-core --><dependency><groupId>org.apache.flex.blazeds</groupId><artifactId>flex-messaging-core</artifactId><version>4.7.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.flex.blazeds/flex-messaging-common --><dependency><groupId>org.apache.flex.blazeds</groupId><artifactId>flex-messaging-common</artifactId><version>4.7.2</version></dependency>

封装请求

封装请求就是图中框起来的 content 部分。特别注意图中标红得两个包名,这里请求里面封装的包名必须对应起来。

com.itown.kas.pfsc.report.po.HqPara 对象 :

注意这里的包名必须和抓包里面的包名对应起来。

package com.itown.kas.pfsc.report.po;import lombok.Data;/*** HqPara** @author xh* @date 2020/5/19*/
@Data
public class HqPara {private String breedInfoDl;private String provice;private String breedInfo;private String marketInfo;}

封装 content 数据 :

    public static RemotingMessage getRemotingMessage() {// content 数组中的第一个对象RemotingMessage remotingMessage = new RemotingMessage();// 对应对象里面的各个参数remotingMessage.setSource(null);remotingMessage.setOperation("getHqSearchData");remotingMessage.setTimeToLive(0);remotingMessage.setTimestamp(0);Map<String, Object> headers = new HashMap<>();headers.put("DSId", UUID.randomUUID().toString());headers.put("DSEndpoint", null);remotingMessage.setHeaders(headers);// 对应对象里面的 body 对象// 数组中的第一个元素 new HqPara() ==> 对应该网页的搜索数据// 注意 HqPara 的包名必须对应起来,如果要搜索数据的话,在这个对象中 set 对应的值即可// 数组的第二个参数表示当前页// 数组的第三个参数表示每页大小// 注意合理有个坑!!!// 分页数据在请求中是字符串类型,这里也一定要用字符串类型,如果用 int 类型的话,结果是没有值的!!!!Object[] body = new Object[]{new HqPara(), "1", "15"};remotingMessage.setBody(body);remotingMessage.setClientId(UUID.randomUUID().toString());remotingMessage.setDestination("reportStatService");remotingMessage.setMessageId(UUID.randomUUID().toString());return remotingMessage;}

返回数据

抓包返回数据大概如下:

需要的具体数据大概是这样的 :

编写代码

import com.itown.kas.pfsc.report.po.HqPara;
import flex.messaging.io.ArrayCollection;
import flex.messaging.io.amf.ASObject;
import flex.messaging.io.amf.client.AMFConnection;
import flex.messaging.messages.RemotingMessage;import java.util.HashMap;
import java.util.Map;
import java.util.UUID;/*** SwfApp3** @author xh* @date 2020/5/19*/
public class SwfApp {public static void main(String[] args) throws Exception {String url = "http://jgsb.agri.cn/messagebroker/amf";RemotingMessage remotingMessage = getRemotingMessage();AMFConnection connection = new AMFConnection();connection.addHttpRequestHeader("Content-Type", "application/x-amf");connection.connect(url);connection.addAmfHeader("DSId", UUID.randomUUID().toString().replaceAll("-", ""));// 这里必须和返回值的包名对应起来// 这个包可以不用创建AMFConnection.registerAlias("DSK", "com.itown.kas.pfsc.report.po.PAuditMarketPrice");// call 方法的 command 对应请求中的 TargetObject call = connection.call(null, remotingMessage);// 解析返回值// flex.messaging.messages.AcknowledgeMessageflex.messaging.messages.AcknowledgeMessage message = (flex.messaging.messages.AcknowledgeMessage) call;ArrayCollection body = (ArrayCollection) message.getBody();ArrayCollection data = (ArrayCollection) body.get(0);for (Object column : data) {ASObject asObject = (ASObject) column;System.out.println(asObject);}Object curPage = body.get(1);Object totalPage = body.get(2);Object totalCount = body.get(3);System.out.println(curPage + " == " + totalPage + " == " + totalCount);}public static RemotingMessage getRemotingMessage() {// content 数组中的第一个对象RemotingMessage remotingMessage = new RemotingMessage();// 对应对象里面的各个参数remotingMessage.setSource(null);remotingMessage.setOperation("getHqSearchData");remotingMessage.setTimeToLive(0);remotingMessage.setTimestamp(0);Map<String, Object> headers = new HashMap<>();headers.put("DSId", UUID.randomUUID().toString());headers.put("DSEndpoint", null);remotingMessage.setHeaders(headers);// 对应对象里面的 body 对象// 数组中的第一个元素 new HqPara() ==> 对应该网页的搜索数据// 注意 HqPara 的包名必须对应起来,如果要搜索数据的话,在这个对象中 set 对应的值即可// 数组的第二个参数表示当前页// 数组的第三个参数表示每页大小// 注意合理有个坑!!!// 分页数据在请求中是字符串类型,这里也一定要用字符串类型,如果用 int 类型的话,结果是没有值的!!!!Object[] body = new Object[]{new HqPara(), "1", "15"};remotingMessage.setBody(body);remotingMessage.setClientId(UUID.randomUUID().toString());remotingMessage.setDestination("reportStatService");remotingMessage.setMessageId(UUID.randomUUID().toString());return remotingMessage;}}

运行效果

java 爬取 flash 里面的数据相关推荐

  1. java爬虫黑马百度云,Java爬虫小Demo java爬取百度风云榜数据

    Java爬虫小Demo java爬取百度风云榜数据 很简单的一个小例子,使用到了java的爬虫框架 jsoup ,一起啦看看实现的方法吧! 相关推荐:Python爬虫实战 python爬虫爬取百度风云 ...

  2. 使用java爬取网页上的数据

    要爬的网页:https://list.jd.com/list.html?cat=9987,653,655&page=1&sort=sort_rank_asc&trans=1&a ...

  3. python爬取flash数据_爬取flash数据

    关于html爬取数据的文章已经有很多了,我今天主要和大家交流的是如何爬取flash网页的数据.这方面资料相对比较少,主要是html5兴起后现在flash站很少了,不过用于技术研究还是可以尝试一下,这篇 ...

  4. 用java爬取学校数据_Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

  5. Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索

    Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索 一.资源 为什么接下来的代码中要使用el.getElementsByTa ...

  6. java 使用webmagic 爬虫框架爬取博客园数据

    java 使用webmagic 爬虫框架爬取博客园数据存入数据库 学习记录   webmagic简介: WebMagic是一个简单灵活的Java爬虫框架.你可以快速开发出一个高效.易维护的爬虫. ht ...

  7. 利用Java爬取基金网站的基金数据,快速筛选优质热门基金

    爬取数据源为天天基金网的页面基金数据 利用java爬取基金数据并简单筛选后的效果图 创建java maven项目,推荐用spring boot maven需要引入的jar包依赖 <!--lomb ...

  8. 【用Java爬取网页图片——爬虫爬取数据】

    用Java爬取网页图片--爬虫爬取数据 1.在创建项目中导入jsoup 2.创建一个保存下载图片的路径 3.使用URL读取网页路径,jsoup读取网页内容 4.利用属性标签获取图片连接块 5.因为该路 ...

  9. Java数据爬取——爬取携程酒店数据(二)

    在上篇文章Java数据爬取--爬取携程酒店数据(一)爬取所有地区后,继续根据地区数据爬取酒店数据 1.首先思考怎样根据地域获取地域酒店信息,那么我们看一下携程上是怎样获得的. 还是打开http://h ...

最新文章

  1. 内行的AI盛会——北京智源大会带你洞见未来!(含日程及限量优惠)
  2. [Python人工智能] 二.TensorFlow基础及一元直线预测案例
  3. IT兄弟连 Java语法教程 Java的发展历程
  4. Spring整合web开发
  5. html 边框轮廓,CSS半圈(边框,仅轮廓)
  6. 可编程ic卡 通用吗_8255可编程IC
  7. Docker学习总结(37)——Dockerfile编写的八条准则
  8. TIOBE 3 月编程语言排行榜:Ruby 重回前十,Kotlin 突围
  9. 计算机作业有相似度,抄袭检测系统对计算机类电子作业的影响分析
  10. 编程语言python入门-编程语言入门(以python为例)
  11. 物联网卡行业目前存在哪些问题
  12. 【更新】Essential Studio for Xamarin更新至2018 v4(二)
  13. 房地产软件信息化——CRM的“中海模式”穆利堂-movno1
  14. python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
  15. CTF学习之路-攻防世界:MISC,入门篇
  16. ActiveMQ系列(四)ActiveMQ核心功能持久化、事务、签收
  17. html修改按钮属性,button属性
  18. python实现指数增长
  19. impala中 alter table add partition 对HDFS文件权限的影响
  20. 【neotic-moveit】CHOMP Planner

热门文章

  1. 如果银行想开挂,RPA机器人舍我其谁?
  2. 博途位置型PID/PI控制器算法 (附SCL源代码)
  3. excel+导入oracle+工具,EXCEL导入ORACLE工具(Xls To Ora)下载 v1.9免费版-下载啦
  4. 软件项目的三项重要影响因素
  5. unity检测键盘的按键名称-JS
  6. matlab函数插值是什么意思,Matlab中插值函数汇总和使用说明
  7. 低代码平台风口已来!
  8. vi操作笔记及资料下载
  9. PLC-Recorder以2ms的高速采集西门子S7-1500数据的方法
  10. 在CorelDRAW2019创建对称绘图模式