
正文
只要听说过电脑的人都能看懂的网上pdf全书获取项目
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
作者:周奇
最近我要获取《概统》的教材自学防挂科(线代已死),于是我看到
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 canvasfunction 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 textvar 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 ctypesdef 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()








