作者:周奇

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

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)

//part 1 : obtain canvas

function imgTagtoCanvas(src,i) {

    //js没有引用传递。。。

    var img = new Image();

    img.setAttribute('crossOrigin', 'anonymous'); //必须在加载前设置允许跨域,吼则:Tainted canvases may not be exported

    var canvas = document.createElement("canvas"); //创建canvas元素

    img.src = src;

    //图片加载完毕

    img.onload = function () {

        canvas.width = img.width;

        canvas.height = img.height;

        canvas.className = "cs"+i.toString();

        canvas.getContext("2d").drawImage(img,0,0,img.width,img.height); //将图片绘制到canvas中

        document.head.append(canvas);

    }

}

var Imgs = document.querySelector("#ctn").getElementsByTagName("img");

console.log(Imgs.length);

for(var i=0;i<Imgs.length;i++){

    imgTagtoCanvas(Imgs[i].src,i);

}

//part 2 : obtain dataUrl as text

var canvases = document.getElementsByTagName("canvas");

console.log(canvases.length);

//要先把arraylike转化为array再排序,排序是因为xhr请求返回的时间不同导致了顺序混乱

var makeArray = function(obj){

    var res = [];

    for(var i=0,len=obj.length; i<len; i++){

        res.push(obj[i]);

    }

    return res;

}

function sortCanvas(a,b)

{

    return parseInt(a.className.split("cs")[1]) - parseInt(b.className.split("cs")[1]);

}

canvases = makeArray(canvases);

canvases.sort(sortCanvas);

//part 3 : obtain dataUrl as text

//var textArea = document.createElement("textarea");

//textArea.style.background = 'transparent';

var p = document.createElement("p");

for(var i=0;i<canvases.length;i++){

    var dataUrl = canvases[i].toDataURL('image/'+'jpeg');

    var txt = dataUrl.split(",")[1] + "\n";

    //textArea.value += txt;

    p.innerText += txt;

}

document.body.appendChild(p);

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

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

import os
#import pwd
import stat
import sys
import base64
import ctypes def main():
txtf = open('imgs.txt','r')
lines = txtf.readline().split("<br>")
#print(lines[-1]) #test shows that there is no "\n"
x = 141
for line in lines:
if len(line) <= 0:
continue
else:
#以下几行是打补丁,61是初值
#if x-61 < 2:
#x += 1
#continue
print(len(line))
x += 1
imgobj = base64.b64decode(line)
imgf = open('p%d.jpg' % x,'wb')
imgf.write(imgobj)
imgf.close()
txtf.close() 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. 用户数从 0 到亿,我的 K8s 踩坑血泪史

    作者 | 平名 阿里服务端开发技术专家 导读:容器服务 Kubernetes 是目前炙手可热的云原生基础设施,作者过去一年上线了一个用户数极速增长的应用:该应用一个月内日活用户从零至四千万,用户数从零 ...

  2. Monad 在实际开发中的应用

    版权归作者所有,任何形式转载请联系作者. 作者:tison(来自豆瓣) 来源:https://www.douban.com/note/733279598/ Monad 在实际开发中的应用 不同的人会从 ...

  3. 为什么有了Compose和Swarm,还会有Kubernetes的出现?

    一.k8s设计思想更先进 k8s的主要设置思想,是从更宏观的角度,以统一的方式来定义任务之间的各种关系 1.k8s的核心功能图 2.k8s的全局架构图 kube-apiserver:API服务 Kub ...

  4. Foxmail管理多个邮箱

    使用Foxmail管理邮箱还是很方便的. 1. 下载Foxmail. 2. 双击,输入想关联的邮箱名称和密码,收取邮件即可. 3. 如果想关联多个账号,可点击Foxmail右上角的菜单栏,选择账户管理 ...

  5. atcoder C - Snuke and Spells(模拟+思维)

    题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_c 题解:就是简单的模拟一下就行.看一下代码就能理解 #include <iostream& ...

  6. poj2528 Mayor's posters(线段树区间修改+特殊离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  7. hdu 5961 传递(暴力搜索)

    我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全 ...

  8. CF982C Cut 'em all! DFS 树 * 二十一

     Cut 'em all! time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. Codeforce Round #574(Div.2)

                                                                                                        ...

  10. 【Redis】主从复制

    一.概述 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从 ...