作者:周奇

最近我要获取《概统》的教材自学防挂科(线代已死),于是我看到

htt链ps:/链/max链.book接118接.com接/html/2018/0407/160495927.shtm

这里有东北大学的教材。

我想获取这个pdf,然鹅要20块,我又穷。

但我想,“所见即所得”,“凡走过必留下痕迹”,你只要放在页面上,肯定要被我得到。

看到它请求的是图片,有点难受,不过图片也凑合着看。

所以我在下面就要介绍这个“只要听说过电脑的人都能看懂的”网上pdf全书获取项目(其实是大量图片的获取

项目),为“信息民主化的幻象”续命……

js代码分三部分。

1:把需求图片转为允许跨域的图片(不然canvas会出错),并批量生成canvas标签

2:把HTMLcollection的伪数组转化为js数组,并排序生成的js数组

3:扫上面得到的数组,每个图片都转为dataUrl(base64的字符串)并写入p标签。

最后在Chrome的HTML面板上找到这个p标签,右键copy element即可。

js:

//使用备注:每次只改part 1 for循环的循环变量的i,且part1必须单独执行(因为canvas被dom记录需要时间,冷却一下再执行part2 3)

  1. //part 1 : obtain canvas
  2.  
  3. function imgTagtoCanvas(src,i) {
  4.  
  5. //js没有引用传递。。。
  6.  
  7. var img = new Image();
  8.  
  9. img.setAttribute('crossOrigin', 'anonymous'); //必须在加载前设置允许跨域,吼则:Tainted canvases may not be exported
  10.  
  11. var canvas = document.createElement("canvas"); //创建canvas元素
  12.  
  13. img.src = src;
  14.  
  15. //图片加载完毕
  16.  
  17. img.onload = function () {
  18.  
  19. canvas.width = img.width;
  20.  
  21. canvas.height = img.height;
  22.  
  23. canvas.className = "cs"+i.toString();
  24.  
  25. canvas.getContext("2d").drawImage(img,0,0,img.width,img.height); //将图片绘制到canvas中
  26.  
  27. document.head.append(canvas);
  28.  
  29. }
  30.  
  31. }
  32.  
  33. var Imgs = document.querySelector("#ctn").getElementsByTagName("img");
  34.  
  35. console.log(Imgs.length);
  36.  
  37. for(var i=0;i<Imgs.length;i++){
  38.  
  39. imgTagtoCanvas(Imgs[i].src,i);
  40.  
  41. }
  42.  
  43. //part 2 : obtain dataUrl as text
  44.  
  45. var canvases = document.getElementsByTagName("canvas");
  46.  
  47. console.log(canvases.length);
  48.  
  49. //要先把arraylike转化为array再排序,排序是因为xhr请求返回的时间不同导致了顺序混乱
  50.  
  51. var makeArray = function(obj){
  52.  
  53. var res = [];
  54.  
  55. for(var i=0,len=obj.length; i<len; i++){
  56.  
  57. res.push(obj[i]);
  58.  
  59. }
  60.  
  61. return res;
  62.  
  63. }
  64.  
  65. function sortCanvas(a,b)
  66.  
  67. {
  68.  
  69. return parseInt(a.className.split("cs")[1]) - parseInt(b.className.split("cs")[1]);
  70.  
  71. }
  72.  
  73. canvases = makeArray(canvases);
  74.  
  75. canvases.sort(sortCanvas);
  76.  
  77. //part 3 : obtain dataUrl as text
  78.  
  79. //var textArea = document.createElement("textarea");
  80.  
  81. //textArea.style.background = 'transparent';
  82.  
  83. var p = document.createElement("p");
  84.  
  85. for(var i=0;i<canvases.length;i++){
  86.  
  87. var dataUrl = canvases[i].toDataURL('image/'+'jpeg');
  88.  
  89. var txt = dataUrl.split(",")[1] + "\n";
  90.  
  91. //textArea.value += txt;
  92.  
  93. p.innerText += txt;
  94.  
  95. }
  96.  
  97. document.body.appendChild(p);

python代码仅仅是把那个字符串里每一个base64串分离出来,然后还原出图片。在imgs.txt里

只需把复制的字符串的最前面的<p>和最后面的</p>删掉

  1. import os
  2. #import pwd
  3. import stat
  4. import sys
  5. import base64
  6. import ctypes
  7.  
  8. def main():
  9. txtf = open('imgs.txt','r')
  10. lines = txtf.readline().split("<br>")
  11. #print(lines[-1]) #test shows that there is no "\n"
  12. x = 141
  13. for line in lines:
  14. if len(line) <= 0:
  15. continue
  16. else:
  17. #以下几行是打补丁,61是初值
  18. #if x-61 < 2:
  19. #x += 1
  20. #continue
  21. print(len(line))
  22. x += 1
  23. imgobj = base64.b64decode(line)
  24. imgf = open('p%d.jpg' % x,'wb')
  25. imgf.write(imgobj)
  26. imgf.close()
  27. txtf.close()
  28.  
  29. main()

只要听说过电脑的人都能看懂的网上pdf全书获取项目的更多相关文章

  1. 小学生都能看懂的FFT!!!

    小学生都能看懂的FFT!!! 前言 在创新实践重心偷偷看了一天FFT资料后,我终于看懂了一点.为了给大家提供一份简单易懂的学习资料,同时也方便自己以后复习,我决定动手写这份学习笔记. 食用指南: 本篇 ...

  2. 55张图吃透Nacos,妹子都能看懂!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第1篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  3. 机器学习敲门砖:任何人都能看懂的TensorFlow介绍

    机器学习敲门砖:任何人都能看懂的TensorFlow介绍 http://www.jiqizhixin.com/article/1440

  4. 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)

    一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...

  5. log4j漏洞的产生原因和解决方案,小白都能看懂!!!!

    核弹级bug Log4j,相信很多人都有所耳闻了,这两天很多读者都在问我关于这个bug的原理等一些问题,今天咱们就专门写一篇文章,一起聊一聊这个核弹级别的bug的产生原理以及怎么防止 产生原因 其实这 ...

  6. Unity 打包发布Android新手教学 (小白都能看懂的教学 ) [转]

    版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 扫码关注微信公众号,获取最新资源 最近在Unity的有些交流群里,发现好多Unity开发 ...

  7. 小学生都能看懂的数位dp

    前言 数位dp其实很久前就知道了,也做过几道和其他算法混在一起的题目,其实通过手玩是能做的 但毕竟是种算法,还是系统学下比较好(节省手玩时间) 模板题 P2602 [ZJOI2010]数字计数 化简题 ...

  8. 小白都能看懂的tcp三次握手

    众所周知,TCP在建立连接时需要经过三次握手.许多初学者经常对这个过程感到混乱:SYN是干什么的,怎么一会儿是1一会儿是0?怎么既有大写的ACK又有小写的ack?为什么ACK在第二次握手才开始出现?初 ...

  9. 这是一篇每个人都能读懂的最小生成树文章(Kruskal)

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题的第19篇文章,我们一起来看看最小生成树. 我们先不讲算法的原理,也不讲一些七七八八的概念,因为对于初学者来说,看到 ...

随机推荐

  1. javaScript 基础知识汇总(五)

    1.垃圾回收 JavaScript 的内存管理是自动的,不能强制执行或者阻止执行 可达性 JavaScript中主要的内存管理概念是可达性. 什么是可达性? 定义一个对象 let user = { n ...

  2. mongodb 启动 WARNING: soft rlimits too low, transparent_hugepage/enabled is 'always'. never

    今天启动mongodb的时候,之前一直没注意,今天发现又warning,想整一整. 下面是告警 2019-09-05T12:00:55.271+0800 I CONTROL [initandliste ...

  3. 2019nc#3

    题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A Graph Games 点击查看 进入讨论 18/292 未通过 B Crazy Binary String 点击查看 1107/3615 ...

  4. 【EDU68 E】 Count The Rectangles 数据结构算几何

    CF # 题意 总共有5000条线段,这些线段要么水平,要么垂直,问这些线段组成了多少矩形. # 思路 这是一个n*n*(log)的思路 自己一开始想着枚举两条垂直边,想着怎么把水平的边插入,再进行冗 ...

  5. 杭电2018暑假多校第一场 D Distinct Values hdu6301 贪心

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. 【LeetCode】[0001] 【两数之和】

    题目描述 思路分析 Java代码 代码链接 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标.你可以假设每种输入只会对 ...

  7. 每天学会一点点(HashMap实现原理及源码分析)

    HashMap实现原理及源码分析   哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希 ...

  8. Android-WebView支持input file启用相机/选取照片

    webview要调起input-file拍照或者选取文件功能,可以在webview.setWebChromeClient方法中重写指定的方法,来拦截webview的input事件,并做我们相应的操作. ...

  9. 洛谷 P1091合唱队列

    吾王剑之所指,吾等心之所向                           ——<Fate/stay night> 题目:https://www.luogu.org/problem/P ...

  10. fireFox模拟 post请求、上传插件,火狐浏览器中文postman插件

    ApiPost是一个支持团队协作,支持模拟POST.GET.PUT等常见请求,并可直接生成文档的API调试.管理工具. 它拥有以下功能特性: 1.文档管理ApiPost不仅可以快速生成接口文档,还支持 ...