zoukankan      html  css  js  c++  java
  • 只要听说过电脑的人都能看懂的网上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 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] + "
    ";
    
        //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 "
    "
        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()
  • 相关阅读:
    SDUT2482二叉排序树
    POJ 3278Catch That Cow
    SDUT2140图结构练习——判断给定图是否存在合法拓扑序列
    SDUT2142数据结构实验之图论二:基于邻接表的广度优先搜索遍历
    SDUT2141数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
    SDUT1466双向队列
    搜索
    搜索
    贪心算法
    贪心算法
  • 原文地址:https://www.cnblogs.com/dynmi/p/11590104.html
Copyright © 2011-2022 走看看