最近找一些国外的压力容器方面的资料。美帝在这方面耕耘上百年,各种文档标准非常齐全。当然买肯定是买不起的了,那怎么办?经过一番搜索,doc88上面东西不少。阅读还是可以的,但是想弄下来。怎么办?
### 摸索
- 小试牛刀F12
![image.png](https://upload-images.jianshu.io/upload_images/3797605-7c41a0089ed7f908.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这里先看看html中的结构,比如说用图片显示单个页面,然而并没有啊。我再去sources面板下去找找有没有相关的脚本。我发现mu.js这个脚本好像与PDF相关。PDFiumJS是个什么东西?貌似好像也许跟PDF有关系。作为一个只懂得二级C的机械汉子,把这研究出来怎么排版pdf估计是不可能。源代码分析的路子算是走不通了。
![mu.js](https://upload-images.jianshu.io/upload_images/3797605-d1b8328128ec3b59.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 一头雾水
既然我看文旦的时候是动态加载的,那么网络返回的数据要直接是PDF页面,那不很妙么。
![网络请求](https://upload-images.jianshu.io/upload_images/3797605-27642600fafc7eac.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![数据返回](https://upload-images.jianshu.io/upload_images/3797605-77196f3bd0dcaa90.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
看这返回的数据看是看不懂的,ebt是个什么数据,也搞不懂。
- 柳暗花明
再看一眼html吧。这里发现一个问题,所有内容显示应该是画在Canvas。为啥说应该是呢?因为前面html中,我既没有看到排版的div css等,也没有找到图片。在各页中只有canvas,而且其尺寸相当大。那怎么把Canvas画的内容弄出来呢?一顿搜索,貌似可行。
![发现Canvas](https://upload-images.jianshu.io/upload_images/3797605-0770dad09893864e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 实现
- 胜利在望
这里我先用选择子获取canvas,这里获取了很多。取一个``canvas``调用``toDataURL``函数,返回的数据是``base64``编码的。
```
array_c = document.querySelectorAll('canvas')
a = array_c[0]
a.toDataURL()
```
![image.png](https://upload-images.jianshu.io/upload_images/3797605-99b4d3c67a962fcf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
找个网站测试一下图片对不对!记得要把编码前面``data:image/png;base64,``删除。
![image.png](https://upload-images.jianshu.io/upload_images/3797605-37a3b3fd1ca476f4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 大步流星
能获取图片那么这已经是非常大的进步了,接下来我们应该考虑把图片弄下来。这里不能只弄一张图片,而是应该把所有图片弄下来,做成一个PDF文档。怎么在浏览器里面合成PDF这个真不会。我想到另一个方法就是把图片发送到我自己的服务器上。当然这个服务器就是本地服务器。作为有点入门Python水平的菜鸟,能会的web框架也就是Flask了。
服务器端代码:
```
from flask import request, Flask
import io
import os
from flask_cors import CORS
from PIL import Image
import base64
app = Flask(__name__)
CORS(app)
@app.route('/')
def index():
return 'Index Page'
image_dir = 'images'
@app.route('/hook', methods=['POST'])
def hook():
#data = request.form
#print(data['name'])
prefix = 'data:image/png;base64,'
data = request.get_json()
base64_data= data['image']
image_id = data['id']
base64_data = base64_data.replace(prefix,'')
img_data = base64.b64decode(base64_data)
#image = Image.open(io.BytesIO(img_data))
# with open('image.txt','w') as f:
# f.write(base64_data)
path = os.path.join(image_dir,image_id+'.png')
with open(path,'wb') as f:
f.write(img_data)
return 'success'
if __name__=='__main__':
小程序 - 让APP加速RUN!(debug=True)
```
脚本代码(这些代码运行在浏览器的控制台):
```
function sendPages(){
cs = document.querySelectorAll('canvas')
cs.forEach((c)=>{
data = {"image":c.toDataURL(),"id":c.id}
fetch("http://127.0.0.1:5000/hook",{"mode":"cors","headers":{"Content-Type": "application/json"},"method":"POST","body":JSON.stringify(data)})
})
}
```
这些代码写了多久,咱是高手,所以写了10个小时(网易+B站+微博+搜索)。光这个CORS就让我郁闷了半天,只好B站蹉跎。咱只知道跨域会出现问题,但不知道跨域服务器也需要支持才行。
- 结尾
难道就这样行了么,显然还有很多问题。咱先不说这脚本要按F12然后到console运行的问题。如果我打开一个页数比较多的文档,那么开始肯定不会展开所有文档。我得点击继续阅读才行。还有一个非常重要的问题,文档是动态加载的。某个页面的文档被显示过才能加载,有点拗口。其实就是你得先看一遍文档,当然一秒也行,只要加载了就行。那我为了弄一个300页的文档,足足一个小时看文档。一页一秒,五分钟不就行了么。开玩笑,咱哪能这么集中精力。一页一页这么看,这是人干的事情么,只是为了翻页加载而已。所以这里得改。预知后事,请听下回倒腾。