作者:周奇

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

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. C#开发BIMFACE系列8 服务端API之获取文件上传状态信息

    系列目录     [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...

  2. Java多线程的中断原理和 interrupt() 几个方法简介

    上节讲到,线程被 wait() 通知后进入等待池,可以由本线程的 interrupt() 方法解救,使本线程可以去重新竞争锁等等.是如何实现的呢? 实际上,中断仅仅是在线程对象做一个标记而已,称为中断 ...

  3. docker使用nginx反向代理springboot

    docker运行nginx容器 快速安装运行 docker-hub文档 https://hub.docker.com/_/nginx 拉取nginx1.6.0 docker pull nginx:1. ...

  4. Gym - 101667H - Rock Paper Scissors FFT 求区间相同个数

    Gym - 101667H:https://vjudge.net/problem/Gym-101667H 参考:https://blog.csdn.net/weixin_37517391/articl ...

  5. atcode E - guruguru(思维+前缀)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 题解:一道思维题.不容易想到类似区间求和具体看一下代码. #include <iostr ...

  6. codeforces 735C. Tennis Championship(贪心)

    题目链接 http://codeforces.com/contest/735/problem/C 题意:给你一个数n表示有几个人比赛问最多能赢几局,要求两个比赛的人得分不能相差超过1即得分为2的只能和 ...

  7. Codeforces Round #381 (Div. 2) C. Alyona and mex(无语)

    题目链接 http://codeforces.com/contest/740/problem/C 题意:有一串数字,给你m个区间求每一个区间内不含有的最小的数,输出全部中最小的那个尽量使得这个最小值最 ...

  8. Codeforces Round #383 (Div. 2) C. Arpa's loud Owf and Mehrdad's evil plan(dfs+数学思想)

    题目链接:http://codeforces.com/contest/742/problem/C 题意:题目比较难理解,起码我是理解了好久,就是给你n个位置每个位置标着一个数表示这个位置下一步能到哪个 ...

  9. requests + BeautifulSoup + json

    requests: response.text      以 unicode 格式显示响应的文本 response.content    以 二进制 格式显示响应的文本 BeautiSoup: sou ...

  10. 初玩Docker

    Docker 和VM的区别 Docker就是类似于一个打包好的环境,相关的服务都安装在里面,可以直接使用的. VM就相当于另外一套独立的系统,独立的IP,虚拟硬件. 要使用就需要单独构建一套才可以. ...