在浏览器控制台抓取网站数据,并导出为Excel文件(引出内容安全策略CSP)

5 篇文章 0 订阅
3 篇文章 0 订阅

目录

1、目标内容

2、观察网页结构

3、在浏览器控制台实现数据的爬取和下载

4、禁止加载外部脚本文件(CSP)

5、关于CSP更多的内容 参考:


1、目标内容

        目标网站为某彩票网站;获取每一期的 开奖日期 和 开奖号码,整理数据为 表格 格式,再导出为 Excel 表格。

        一页的内容有55 - 26 + 1 = 30项数据,计划获取五页的数据。

2、观察网页结构

         开奖日期的文档结构可以使用 tbody > tr > 第二个 childNode 来获取到;

        中奖号码(每个中奖数字)可以使用 .qiu > .qiu-item-small 依次得到;

        观察页面底部下一页的事件处理。

 

        发现点击某页或者点击下一页时,不改变地址路径,而是执行一段js代码重新渲染表格的内容。则此时为了获取各个页面的数据,可以获取到指定页的元素或下一页的原,然后构造触发点击事件,就能达到效果。

         这里使用获取下一页的元素,然后依次构造并触发点击事件以获取到连续几页的数据内容。

3、在浏览器控制台实现数据的爬取和下载

 

// 引入alasql,可以用于数据处理,数据导出为Excel
let alasqlScript = document.createElement('script');
alasqlScript.src = "https://cdn.jsdelivr.net/npm/alasql@4.0.0/dist/alasql.min.js";
document.body.appendChild(alasqlScript);

// 存放最终的数据
let resultArr = [];

// 主要执行函数,当前页,总共需要多少页,回调函数(导出数据)
function action(currentPage, needPage, callback){
  	boxArr = document.querySelectorAll('tbody .qiu');
    line = document.querySelectorAll("tbody tr");

    for(let i = 0 ; i < boxArr.length ; i ++){
        let item = boxArr[i];
      	// 构造单行数据对象
        let obj = {
            time:line[i].childNodes[1].innerText,
            ball_1:boxArr[i].childNodes[0].innerText,
            ball_2:boxArr[i].childNodes[1].innerText,
            ball_3:boxArr[i].childNodes[2].innerText,
            ball_4:boxArr[i].childNodes[3].innerText,
            ball_5:boxArr[i].childNodes[4].innerText,
            ball_6:boxArr[i].childNodes[5].innerText,
            ball_7:boxArr[i].childNodes[6].innerText,
        }
        resultArr.push(obj);
    };
  	// 没有达到所需的数据数量要求,继续获取数据
  	if(needPage > currentPage){
      	// 自动触发点击事件,返回下一页的数据
      	document.querySelector('.layui-laypage-next').click();
      	// 等页面加载完后,在收集数据,放置页面加载过慢,数据没有回来或回来的是旧的数据
      	setTimeout(()=>{
		    action(currentPage + 1, needPage, callback);
        },100);
    }else{
      	// 执行回调函数导出数据
        callback();
    }
  	
}

// 获取 5 页的数据
action(0, 4, ()=>{
    // 将resultArr中的数据输出成表格xls,表格名称为ballData.xls
  	alasql('select * into XLS("ballData.xls",{headers:true}) from ?',[resultArr]);
})

        点击执行代码,将弹窗表格下载的目标地址,选择位置进行存放。

        打开表格文件并信任该表格的内容。

 

4、禁止加载外部脚本文件(CSP)

        回顾上面在浏览器控制台抓取网页数据并保存到本地的方式,一个关键的部分是加载了外部的JS文件,即导入了 alasql 这个库来帮助我们把数据整理并保存到本地。

        当然,也可以不引入其他的库,拿到最终的 resultData 后,直接在控制台输出,然后手动地复制黏贴到本地的文件中。不过这样也可能会比较繁琐。

        如何禁止用户在控制台引入外部的脚步文件来限制用户的自由?可以在网站中配置CSP(内容安全策略)来实现。

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行。它的实现和执行全部由浏览器完成,开发者只需提供配置。

        配置CSP有两种方式,一种是通过通过响应头设置 Content-Security-Policy 的方式,另一种是在网页的 meta 标签中进行配置,两种方法是等效的。

        对于第一种,设置响应头的方式(如 Nginx 配置,后端返回的响应头配置等):

// 只能加载当前域名的js文件,不信任任何的插件资源
Content-Security-Policy: script-src 'self'; object-src 'none';

        对于第二种,是前端在开发网页时进行的配置。

// 只允许加载当前域名下的脚步文件,运行加载任何图片资源
// default-src 设置各个配置选项的默认值, * 为允许任何资源,该配置的优先级最低
<meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self'; img-src *;">

        手动为该网站设置<meta>标签,并配置 CSP 策略,然后再与控制台中进行简单尝试:

let meta = document.createElement('meta');
meta.httpEquiv = "Content-Security-Policy";
meta.content = `default-src 'self';script-src 'self';object-src 'none';`;
document.head.appendChild(meta);


let alasqlScript = document.createElement('script');
alasqlScript.src = "https://cdn.jsdelivr.net/npm/alasql@4.0.0/dist/alasql.min.js";
document.body.appendChild(alasqlScript);

alasql;

        

 

5、关于CSP更多的内容 参考:

[1] HTTP中的CSP ( Content Security Policy )内容安全策略 - 掘金

[2] Web内容安全策略浅析 - 知乎

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bodyHealthy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值