您的位置:首页 > 其它

百度文库资源文件分析

2010-12-07 13:31 162 查看
百度文库分析第一节

1. 分析百度文库的javascript
var DOC_INFO={ //文件信息
doc_id:"6b70ecc65fbfc77da269b19a" //文件编号
,cid:"64" //分类编号
,price:"0" //价格
,value_average:"6" //不清楚
,doc_size:"66.0KB" //文件大小
,doc_name:"销售谈判培训" //文件名
,doc_type:"doc" //文件类型
,url:http://wenku.baidu.com //站点名称
,wealth:parseInt("") //不清楚
,level:parseInt("") //不清楚
,isOrgDoc:"0" //不清楚
};

B=DOC_INFO.doc_type; //文件类型

var A=B=="txt"?"txtreader.swf":"reader.swf"; //通过文件类型确定阅读器
var I=B=="txt"?50:5; //通过文件类型确定每次加载页数
//通过文件类型确定数据文件所在域名地址
var C=B=="txt"?"http://wenku.baidu.com/play":"http://ai.wenku.baidu.com/play";

通过上面的信息,基本可以把握文库的数据文件信息,那么我们怎么获取这段JSON呢
第一步:抓取页面源文件。
第二步:正则替换源文件,用分组一替换整个文件,下面是正则表达式
BAIDU_DOC_INFO = @"^[/s/S]*DOC_INFO=(/{.*?})[/s/S]*$";

2. 获取资源文件
要获取资源文件,就必须先找到资源文件链接地址,百度的资源文件链接地址格式是怎么样子的呢,请继续下看

域名地址 + / +文件编号 + ?pn=x&rn= + 每次加载页数
例如: http://ai.wenku.baidu.com/play/6b70ecc65fbfc77da269b19a?pn=1&rn=5
链接地址格式的所有参数可以在上面的文件信息JSON获取到

其中Pn=x 表示加载的第几页 x从1开始,每次递增数为RN(每次加载页数)

现在知道文库资源文件的链接格式,可以下载所有的资源文件

3. 分析资源文件
下载下来的资源文件,是一个个SWF格式的数据文件,数据文件是有自己特定格式的。下面看数据文件格式

{"totalPage":"3","fromPage":"1","toPage":"3"} CWS xxxxx CWS xxx CWS xxx

从上面数据文件格式,我们可以发现规律 每个数据文件都是一个JSON开头 CWS表示swf文件的开始,下一个CWS表示上一个swf结束,下一个swf开始。每个数据文件有多少个CWS就表示有多少页
totalPage 总页数
fromPage 开始页数
toPage 本资源文件到达的页数

这三个参数有什么用呢,用处很大,在上面获取资源文件的时候是不知道总页数的,那么就定位不了pn的最大值,所以必须当PN=1(默认最小值)的时候得到最大值
这样通过总页数,和RN(每次加载页数)可以定位PN,接着循环下载数据
上面的方法可行,不过我不赞成用这种方法写,因为这个总要计算
我们可以用递归
定义一个方法
GetSWF(int fromPage){
……………………………….
If(toPage< totalPage)
GetSWF(toPage+1)
}

这样下载数据更简洁

那么我们怎么获取资源文件里面的JSON
试用下面的正则,获取第一分组(开始的一对大括号),我不支持用字符串长度去截取,虽然可行,看网上别人介绍的是最小多长,最大多长,这样不够灵活
BAIDU_DATA_HEADER = @"^(/{[/s/S]+?/})([/s/S]+)$"

得到了资源JSON 那么再怎么分离SWF文件呢
BAIDU_DATA_SWF = @"(CWS|FWS)/t[/s/S]*?(?=(CWS|FWS)/t|$)"
用上面的正则 百度文库的FLASH文件有两种分隔 CWS 和FWS,切记不能只用这两种分隔符去切割文件,因为文件里面可能还会存在CWS这样子的字符串,网上最流行的易读,就是字符串切割,所以下载文件的时候会出现白页,就是切割错误页面用16进制查看资源文件每一个CWS活FWS后面会跟一个09,也就ASCII表对应的制表符,在正则里面用 /t 表示制表符,所以用正则表达式匹配更完善
分离出每一个SWF 存储成 .swf临时文件

4. Swf文件生成JPG文件
用SWFToImage 这个ACTIVE组件非常简单,具体操作自己查相关资料
还可以用FFMPEG.exe 文件截图,这个是很早以前做视频转换时候用到的
自己抉择
SWFToImage 需要自己注册DLL,有时候中文路径还注册不上,对一下电脑盲如果要试用你给的程序,简直就是。。。。
FFMPEG虽然不需要注册,但是比较大,一下子就拉大了你程序的体积

5. JPG生成PDF
用iTextSharp,不过这个家伙也是个肥仔,有3M,我找了好久PDF文件格式,如果能自己拼字符串就好了,那样就可以控制自己程序在几百k大小了。如果有朋友知道介绍给看看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: