获取本公司页面所有图片地址,刷cdn

由于双十一等大活动,公司的活动页面在很多人访问的时候,需要把图片刷入cdn中,减少用户请求等待时间,减小服务器压力。所有需要获取我们的11个活动页面的所有图片,如果通过chrome调试台一个个的抓不现实(而且图片有懒加载,要页面滚动到具体位置,才加载)。所以后面自己写了一个页面,输入目标页面,通过iframe嵌入本页面,加载完成后获取目标页面的所有图片地址;

!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            margin: 15px 0;
        }
        
        input {
            width: 300px;
        }
        
        textarea {
            width: 80%;
            height: 500px;
        }
    </style>
</head>
<div>
    <input type="text" id="gets" placeholder="输入需要获取的网站" style="vertical-align: top;">
</div>
<div>
    <button>点击获取</button>
</div>
<div>
    <textarea></textarea>
</div>
<body>
    <script>
        document.querySelector('button').onclick = function() {
            var iframe = document.createElement("iframe");
            iframe.src = document.querySelector('input').value;
            iframe.style.width = "50%";
            iframe.style.height = "300px";
            if (iframe.attachEvent) {
                iframe.attachEvent("onload", function() {
                    getImgSrc();
                });
            } else {
                iframe.onload = function() {
                    getImgSrc();
                };
            }
            document.body.appendChild(iframe);
        }
        function getImgSrc() {
            var str = document.querySelector('iframe').contentWindow.document.querySelector('html').innerHTML; // 获取html所有string

            var arr = [];
            var reg = /http.+(\.jpg|\.png|\.bmp|\.jpeg|\.gif|\.webp)/g
            var temp;
            while (temp = reg.exec(str)) {
                arr.push(temp[0])
            }
            arr = Array.from(new Set(arr))    // 去重
            document.querySelector('textarea').value = arr.join('\n');
        }
    </script>
</body>
</html>

由于都是获取本公司的网站下的图片地址,所以不存在跨域。而且不会含有js文件,js中的图片链接也可以获取到

(如果不是存在跨域问题,in a frame because it set 'X-Frame-Options' to 'deny',只有把页面下载到本地,然后自己把js加到下载页面底部,再页面加载完成后,获取本页面所有图片)

        window.onload = function() {
            var arr = [];
            var str = document.querySelector('html').innerHTML;
            var reg = /http.+(\.jpg|\.png|\.bmp|\.jpeg|\.gif|\.webp)/g   
            var temp;
            while (temp = reg.exec(str)) {
                arr.push(temp[0])
            }
            arr = Array.from(new Set(arr))
            console.log('图片地址',arr)

        }
    </script>

当然有可能地址是相对于目标页面的相对路径。所以正则中的http可能需要更改一下,然后arr中的每一项也需要拼接上目标网站的域名。

2019-01-18

今天闲下来觉得用node解决一下抓取的跨域问题。

首先 通用要有node,然后安装依赖。创建js. 启动服务。KO;

var http = require('http');
var url = require('url');
var cheerio = require('cheerio');  // 类似于jquery

function download(url, callback) {
    http.get(url, function(res) {
        var data = '';
        res.on('data', function(chunk) {
            data += chunk;
        })
        res.on('end', function() {
            callback(data)
        })
    }).on('error', function() {
        callback(null)
    })
}


http.createServer(function(req, res) {
    console.log('启动服务')
    res.writeHead(200, { 'Content-Type': 'text/plain' });

    // 解析 url 参数
    var params = url.parse(req.url, true).query;
    var urls = params.url;
    download(urls, function(data) {
        if (data) {
            var $ = cheerio.load(data);
            var str = $('html').html()
            var arr = [];
            var reg = /http.+?(\.jpg|\.png|\.bmp|\.jpeg|\.gif|\.webp)/g

            var temp;

            while (temp = reg.exec(str)) {
                arr.push(temp[0])
            }

            arr = Array.from(new Set(arr))

            var txt = arr.join(`
`);
          
            console.log("done");
        } else {
            console.log('error')
        }

        res.end(txt);
    })


}).listen(3000);

启动服务后,访问的http://localhost:3000?url=http://test.html

就可以得到返回的数据了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。