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

以房产透明网为例,该网站的一房一价数据就是通过flash显示,接下来将一步步介绍如何获取对应的数据。

特别声明,本文章仅做相关技术学习交流,数据版权为成都透明网,个人或企业请勿用于商业或非法用途,如该文章有不妥之处请联系本人删除。

我找了一个楼盘用浏览器自带的工具查看,可以看到返回的数据是乱码,如下图。

这个主要是返回的数据格式是application/x-amf,浏览器无法正常解析,接下来就需要用的抓包工具Charles了,这个工具没给钱的话30分钟会关闭,我觉得30分钟也够用了,目前一直忍受着。

1.首先打开Charles

2.打开透明网一房一价页面,点击一个单元后就可以看到请求的数据了

这里面比较重要的几个部分我都截取了一下,最后HOUSEITEMLIST,就我们需要处理的数据了。

3.可以看到通过抓包工具已经可以看到请求的数据了,接下来就需要用java模拟amf的请求。

org.apache.flex.blazeds

flex-messaging-core

4.7.2

org.apache.flex.blazeds

flex-messaging-common

4.7.2

先要引入这两个包,这个请求代码如下,部分参数我设置为******,如果需要测试自行粘贴对应的参数。

public static void main(String[] args) {

try {

URL urlObject = new URL("http://cd.funi.com/messagebroker/amf");

HttpURLConnection urlConnection = (HttpURLConnection) urlObject.openConnection();

urlConnection.setDoOutput(true);

urlConnection.setRequestProperty("Content-type", "application/x-amf;charset=gb2312");

urlConnection.setRequestProperty("Host", "cd.funi.com");

urlConnection.setRequestProperty("Origin", "http://user.funi.com");

urlConnection.setRequestProperty("Referer", "http://user.funi.com/resource/swf/house/FundateClient_www.swf?communityId=DAZXiSEGhWZLhWIrVooMiDNjk4UzP3et1CztbkK1SZrXmBDQfGR%2BAFaCxnPg5MFf&t=20181131/[[DYNAMIC]]/1");

urlConnection.setRequestProperty("Cookie", "pgv_pvi=9961606144; pgv_si=s9152640000; Hm_lvt_77be290eccb6ceb57b524a860b6faadc=1545658648,1545745229,1545917030,1546227366; Hm_lpvt_77be290eccb6ceb57b524a860b6faadc=1546227368");

OutputStream outputStream = urlConnection.getOutputStream();

SerializationContext serializationContext = new SerializationContext();

ActionContext actionContext = new ActionContext();

//构建请求信息(0-amf0 3-amf3)

ActionMessage requestMessage = new ActionMessage();

AmfTrace amfTrace = new AmfTrace();

RemotingMessage remotingMessage = new RemotingMessage();

remotingMessage.setOperation("***********************************");

remotingMessage.setSource(null);

remotingMessage.setClientId("FF66DFC9-B00D-2C39-E122-6B6752416543");

remotingMessage.setDestination("dEEDOCService");

remotingMessage.setMessageId("******************************");

remotingMessage.setHeader("DSEndpoint", "my-amf");

remotingMessage.setHeader("DSId", "*************************");

remotingMessage.setTimeToLive(0);

remotingMessage.setTimestamp(0);

remotingMessage.setBody(new Object[]{"kezlmwCvdjGPckPbY1SmeL3frogB2sfc7IgjBssaFJ2ihf5M93DgMgf5mIqLiWgMNvNwBsVQKuDfTympu4bAjLV9/3mGEHK+MfNqVZKTY0xC3uGOkDg+i2Pt9oTDxBm1xU5Cvmjmd/9mXzN/v3UOvSoqKlLNYy42g8uGAq+JFczhHpdRi7LBtP56E8OJaGq4VksJJnPhGLtMLt1T3wZZKzcV4MqJ2U7NTg7q5AmyCC89nvetx/5Gop8mUBe0tHQdSop8mhHerHn+n7y5O1BL3sRS8T3e1B9F2txtWzcNX0NBzDgAMpfa3AJAhaZ7yuhwd5VtLYD+KquXCUmxJAd/YSjjZGAYYomWjZqRMfO5x5cP/SH8AeI4BiKbTQ+2UygOvYCiTAzy+8GNG0oKpTDCnP2/j2CFhISaMutwAFTF7CZw6HCzJq+2iA8sVnNmCePQMieuZOyq7LG0PppzHRkQYGpUzGynN4FJ8Dz7TBXmuKu7bWJ7jlrYdHbsexEGhoI2fEh/hivzSuCaBfWojChwMQOrtiYKG/YYEgtxNmEUYVdDH5XUiFHVH0V3W+O16fluHZUoaJdvZ+Fbm9oJIB2cz1X9hQSOcs3Cc7i95hhJ0SdQGa1yMw7c2vJSWzbTKuc6rnFm8IDmR6qm6sEIUHRokN56IsDqS+ZHaXWNoOG4q0xR97tFCPlrURWxLcJX3tIJ4xl/imVVlifcAZX4/gXkykAGpM7tdGOy0J/hegAZqCY="});

MessageBody amfMessage = new MessageBody(null, "/3", new Object[]{remotingMessage});

requestMessage.addBody(amfMessage);

// Setup for AMF message serializer

actionContext.setRequestMessage(requestMessage);

ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();

AmfMessageSerializer amfMessageSerializer = new AmfMessageSerializer();

amfMessageSerializer.initialize(serializationContext, outBuffer, amfTrace);

amfMessageSerializer.writeMessage(requestMessage);

outBuffer.writeTo(outputStream);

outBuffer.flush();

outBuffer.close();

InputStream inputStream = urlConnection.getInputStream();

BufferedInputStream urlConnectionInputStream = new BufferedInputStream(inputStream);

serializationContext = new SerializationContext();

actionContext = new ActionContext();

ActionMessage message = new ActionMessage();

actionContext.setRequestMessage(message);

ClassAliasRegistry.getRegistry().registerAlias("DSK", "com.funi.frontend.dto.HouseTable");//需在项目中设置对应的类包名需一致

MessageDeserializer deserializer = new AmfMessageDeserializer();

deserializer.initialize(serializationContext, urlConnectionInputStream, amfTrace);

deserializer.readMessage(message, actionContext);

Object result = null;

for (MessageBody msg : (ArrayList) message.getBodies()) {

java.lang.String targetURI = msg.getTargetURI();

if (targetURI.endsWith(MessageIOConstants.RESULT_METHOD)) {

result = msg.getData();

AcknowledgeMessage acknowledgeMessage=(AcknowledgeMessage)result;

Object body = acknowledgeMessage.getBody();

ASObject asObject=(ASObject)body;

ArrayCollection houseitemlist =(ArrayCollection) asObject.get("HOUSEITEMLIST");

for (Object o : houseitemlist) {

HouseTable houseTable=(HouseTable)o;

System.out.println(DecodeUtils.decode(houseTable.getUnitNo()));

System.out.println(DecodeUtils.decode(houseTable.getUsage()));

System.out.println(DecodeUtils.decode(houseTable.getTotalArea()));

}

} else if (targetURI.endsWith(MessageIOConstants.STATUS_METHOD)) {

java.lang.String exMessage = "Server error";

result = exMessage;

}

}

} catch (Exception e) {

System.out.print("error");

}

}

packagecom.funi.frontend.dto;public classHouseTable {privateBoolean isMortgage;privateString status;privateString roomNo;privateString listWaterPrice;privateString typeHouse;privateString huxId;privateString buildingNo;privateString fitmentPrice;privateString floorNo;privateString listPrice;privateBoolean isSealUp;privateString usage;privateString totalArea;privateObject houseTableList;privateObject phase;privateString unitNo;privateString buildingId;privateString communityId;publicBoolean getMortgage() {returnisMortgage;

}public voidsetMortgage(Boolean mortgage) {

isMortgage=mortgage;

}publicString getStatus() {returnstatus;

}public voidsetStatus(String status) {this.status =status;

}publicString getRoomNo() {returnroomNo;

}public voidsetRoomNo(String roomNo) {this.roomNo =roomNo;

}publicString getListWaterPrice() {returnlistWaterPrice;

}public voidsetListWaterPrice(String listWaterPrice) {this.listWaterPrice =listWaterPrice;

}publicString getTypeHouse() {returntypeHouse;

}public voidsetTypeHouse(String typeHouse) {this.typeHouse =typeHouse;

}publicString getHuxId() {returnhuxId;

}public voidsetHuxId(String huxId) {this.huxId =huxId;

}publicString getBuildingNo() {returnbuildingNo;

}public voidsetBuildingNo(String buildingNo) {this.buildingNo =buildingNo;

}publicString getFitmentPrice() {returnfitmentPrice;

}public voidsetFitmentPrice(String fitmentPrice) {this.fitmentPrice =fitmentPrice;

}publicString getFloorNo() {returnfloorNo;

}public voidsetFloorNo(String floorNo) {this.floorNo =floorNo;

}publicString getListPrice() {returnlistPrice;

}public voidsetListPrice(String listPrice) {this.listPrice =listPrice;

}publicBoolean getSealUp() {returnisSealUp;

}public voidsetSealUp(Boolean sealUp) {

isSealUp=sealUp;

}publicString getUsage() {returnusage;

}public voidsetUsage(String usage) {this.usage =usage;

}publicString getTotalArea() {returntotalArea;

}public voidsetTotalArea(String totalArea) {this.totalArea =totalArea;

}publicObject getHouseTableList() {returnhouseTableList;

}public voidsetHouseTableList(Object houseTableList) {this.houseTableList =houseTableList;

}publicObject getPhase() {returnphase;

}public voidsetPhase(Object phase) {this.phase =phase;

}publicString getUnitNo() {returnunitNo;

}public voidsetUnitNo(String unitNo) {this.unitNo =unitNo;

}publicString getBuildingId() {returnbuildingId;

}public voidsetBuildingId(String buildingId) {this.buildingId =buildingId;

}publicString getCommunityId() {returncommunityId;

}public voidsetCommunityId(String communityId) {this.communityId =communityId;

}

}

最后获取到对应数据后用base64解密一下即可。

特别声明,本文章仅做相关技术学习交流,数据版权为成都透明网,个人或企业请勿用于商业或非法用途,如该文章有不妥之处请联系本人删除。

喜欢java开发的可以加我qq3369245209,后面会建立一个java开发高级群,下期将介绍如何爬取app数据。

python爬取flash数据_爬取flash数据相关推荐

  1. python爬取客流数据_爬取首都机场客流量数据,从GIS的角度尝试分析建设大兴机场的必要性...

    Hello, 大家好!我是James. 上一节我们整理好了北京的行政区和街道办矢量数据,估计跃跃欲试的小伙伴太热情,爬取的网站被玩坏了几天,学习可以,但是不要过多尝试了哈 然后在文章的最后,我们惊奇的 ...

  2. python爬虫爬取今日头条_爬取今日头条头条号文章数据

    0,背景介绍 最近想爬取一些今日头条的文章浏览数据,分析哪些头条号做的好,那些做的不好. 今日头条 比如上图的阅读数,评论数以及文章标题,通过这些数据进行分析. 于是展开了艰难的爬虫探索之旅 第一目标 ...

  3. python爬取文献代码_爬取Pubmed文献及影响因子并尝试下载的脚本

    Abstract 本脚本实现了通过Biopython爬取pubmed文献资料,并通过scholarscope爬取影响因子数据,最后尝试通过sci-hub下载文献,三位一体的方法. Introducti ...

  4. java爬取彩票数据_爬取彩票信息(有空试下)

    暂且不说,彩票预测是否靠谱?彩票预测也分人而异,江湖上骗术很多,有些甚至会误以为彩票预测的准确度可以很高,这些操盘手法,让不知原理的彩民心甘情愿地掏钱买料. 在彩票预测上,也有正儿八经去研究" ...

  5. python电商项目介绍_电商大数据项目-推荐系统实战(一)

    本项目是基于Spark MLLib的大数据电商推荐系统项目,使用了scala语言和java语言.基于python语言的推荐系统项目会另外写一篇博客.在阅读本博客以前,需要有以下基础: 1.linux的 ...

  6. python创建类统计属性_轻松创建统计数据的Python包

    python创建类统计属性 介绍 (Introduction) Sometimes you may need a distribution figure for your slide or class ...

  7. mysql查询两个表中的不同数据_如何实现大数据在多工作表中精准查询

    大家好,今日继续讲解VBA数据库解决方案,今日讲解第40讲:利用ADO实现同一文件的多个工作表精确查询.其实这讲的内容利用我之前讲解的知识点也可以自己完成.这里只是拿出来让大家再熟悉一下EXCEL的A ...

  8. 数据透视表怎么刷新数据_数据模型的Excel数据透视表刷新错误

    数据透视表怎么刷新数据 A simple data change can cause a strange pivot table refresh error, if you added the dat ...

  9. udacity开源的数据_评论:Udacity数据分析师纳米学位计划

    udacity开源的数据 by David Venturi 大卫·文图里(David Venturi) 评论:Udacity数据分析师纳米学位计划 (Review: Udacity Data Anal ...

  10. 清掉数据_学习之大数据项目笔记第七篇【数仓模块-日志预处理篇】

    1 需求说明 1.1 清洗过滤 1)去除json数据体中的废弃字段(这是前端开发人员在埋点设计方案变更后遗留的无用字段): "email" "phoneNbr" ...

最新文章

  1. 基于Sobel计算图像梯度图
  2. linux AS 5 DNS 配置中的小错误
  3. mysql数据库备份报错145_mysql数据库导出时报错mysqldump: Got error: 145的解决方法
  4. awk,sed,grep运用正则与扩展正则
  5. linux环境变量设置错误后,如何恢复
  6. JS_鼠标移入移出渐变效果(类似css3中的transition或animation和@keyframes)
  7. 一张图告诉你什么是系统架构师
  8. matlab cell,fix,floor,round取整的几种方式
  9. 前端学习(2061):vue的mvvm
  10. 共享存储及SAN(iscsi)配置
  11. kafka生产数据时的应答机制(ACK)
  12. 的电路接法_基本震荡电路知多少,汇总几种震荡电路的接法!
  13. git使用git push 命令跳出remote: Permission to Aname denied to usernameB 的问题
  14. cmake mysql 参数_MySQL cmake编译时这些参数是什么意思?-问答-阿里云开发者社区-阿里云...
  15. 01 Nginx的高并发处理
  16. 短视频图像处理 OpenGL ES 实践
  17. jQuery 5 条件选择器
  18. cocos2d-x 学习笔记——瓦片地图TiledMap
  19. XP3 Dumper GUI
  20. Linux查看最后一页日志,linux常用查看文件或日志命令

热门文章

  1. 职场攻略:每天淘汰自己的不足
  2. VS 2005 命令行cl编译配置 Notepad++设置
  3. 用Python词云看电影--生而为人,对不起
  4. Android.mk调用bin/shell
  5. (Android)java虚拟机和Dalvik虚拟机的区别
  6. 深度学习自学(二十三):CAFFE-TF环境安装问题-兼容多个CUDA
  7. 使用Redis构建简单的社交网站
  8. 找出你的windows子系统(WSL)的安装位置
  9. 阿里云服务器ECS和腾讯云服务器如何安装宝塔面板?
  10. layui select change事件_一道2020年全国生物学联赛试题背后的“眼齿鸟事件”