当前位置:   article > 正文

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

js提取网页数据并保存到excel

目录

1、目标内容

2、观察网页结构

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

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

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


1、目标内容

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

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

2、观察网页结构

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

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

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

 

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

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

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

 

  1. // 引入alasql,可以用于数据处理,数据导出为Excel
  2. let alasqlScript = document.createElement('script');
  3. alasqlScript.src = "https://cdn.jsdelivr.net/npm/alasql@4.0.0/dist/alasql.min.js";
  4. document.body.appendChild(alasqlScript);
  5. // 存放最终的数据
  6. let resultArr = [];
  7. // 主要执行函数,当前页,总共需要多少页,回调函数(导出数据)
  8. function action(currentPage, needPage, callback){
  9. boxArr = document.querySelectorAll('tbody .qiu');
  10. line = document.querySelectorAll("tbody tr");
  11. for(let i = 0 ; i < boxArr.length ; i ++){
  12. let item = boxArr[i];
  13. // 构造单行数据对象
  14. let obj = {
  15. time:line[i].childNodes[1].innerText,
  16. ball_1:boxArr[i].childNodes[0].innerText,
  17. ball_2:boxArr[i].childNodes[1].innerText,
  18. ball_3:boxArr[i].childNodes[2].innerText,
  19. ball_4:boxArr[i].childNodes[3].innerText,
  20. ball_5:boxArr[i].childNodes[4].innerText,
  21. ball_6:boxArr[i].childNodes[5].innerText,
  22. ball_7:boxArr[i].childNodes[6].innerText,
  23. }
  24. resultArr.push(obj);
  25. };
  26. // 没有达到所需的数据数量要求,继续获取数据
  27. if(needPage > currentPage){
  28. // 自动触发点击事件,返回下一页的数据
  29. document.querySelector('.layui-laypage-next').click();
  30. // 等页面加载完后,在收集数据,放置页面加载过慢,数据没有回来或回来的是旧的数据
  31. setTimeout(()=>{
  32. action(currentPage + 1, needPage, callback);
  33. },100);
  34. }else{
  35. // 执行回调函数导出数据
  36. callback();
  37. }
  38. }
  39. // 获取 5 页的数据
  40. action(0, 4, ()=>{
  41. // 将resultArr中的数据输出成表格xls,表格名称为ballData.xls
  42. alasql('select * into XLS("ballData.xls",{headers:true}) from ?',[resultArr]);
  43. })

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

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

 

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

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

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

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

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

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

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

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

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

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

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

  1. let meta = document.createElement('meta');
  2. meta.httpEquiv = "Content-Security-Policy";
  3. meta.content = `default-src 'self';script-src 'self';object-src 'none';`;
  4. document.head.appendChild(meta);
  5. let alasqlScript = document.createElement('script');
  6. alasqlScript.src = "https://cdn.jsdelivr.net/npm/alasql@4.0.0/dist/alasql.min.js";
  7. document.body.appendChild(alasqlScript);
  8. alasql;

        

 

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

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号