DeadLinkHunter工具

news2024/11/15 5:09:17

一、背景

二月底的时候,提到一个文档中心的链接有效性问题,文档中心的某个超链接跳转后,页面内容是空的或者提示页面内容不存在。

分析一下可知,其实文档中心的每个页面都有很多不定位置、不定数量的超链接,每个超链接的页面又包含很多超链接,无限下钻的结果就会有很很多的链接。

这种数量庞大、位置不定的链接,人工测试,其实没办法覆盖全,点着点着就不知道自己在那里了,点击过那个页面了?点击过那个链接了?目前的测试,应该就是几个主要页面点一下,没问题就算通过了。

所以,需要一个工具可以将整个文档中心的链接爬取下来、去重、请求、存储、分析,找出那部分访问后页面是空的或者提示页面内容不存在的链接和该链接对应的父链接和文案,通过父链接和父链接的页面找到失效链接的文案,就能定位到失效链接。

二、工具特点和优势

互联网上搜索一下死链接工具巡查,其实有很多,但是真正能应用到项目中的,几乎没有,至少个人是没见过,或者有些需要付费的。因为实际项目中会更加复杂,比如:

1.首先提供一个站点的初始URL,站点的其它页面内容是需要登录后有权限才能获取的,而大部分死链接检查工具只能检查一些简单的URL,如 baidu.com。而 DeadLinkHunter工具可以通过添加cookie解决这个问题。

2.最核心的问题是,如何从初始URL站点跟踪获取全部链接。比较牛的大佬,可能自己用算法手撸一个,但需要保证获取整个站点所有链接的覆盖率和准确性,其实难度很大,当然,我不会[捂脸]。另外有些死链接巡查工具只能爬取一页或几页。而创建scrapy框架的大牛也考虑到了这个问题,而且,开源出来给我们用,就是scrapy框架的CrawlSpider类。DeadLinkHunter工具就是使用了scrapy框架的CrawlSpider类,从一个初始的URL,自动发现链接并跟踪它们,从而方便地爬取整个网站。(CrawlSpider的作者和Scrapy框架的作者是同一个人,他的名字是Pablo Hoffman)

3.现在互联网的前端页面,99%都使用了Ajax异步加载,使用Ajax异步加载的页面,直接请求url的返回是获取不到页面全部源码的,目前没有见过那个死链接检查工具是可以获取动态页面的源码的,包括scrapy框架,也是获取不到Ajax异步加载的页面的源码。所以,DeadLinkHunter工具才需要在scrapy中自定义selenium中间件去访问URL来获取源码,可以解决这个问题。

(tips:ajax异步加载指通过XMLHttpRequest对象向服务端发送请求,获取服务端返回的数据,然后通过JavaScript动态地将这些数据插入到当前页面中,而不需要重新刷新整个页面。这样可以避免页面的闪烁、卡顿等不良的用户体验,并且可以减少网络带宽的消耗,提高页面加载速度和性能)

4.发现一个失效链接后,如果想要修改怎么办,就需要知道这个链接是从那个页面的那个文案跳转的。我了解过的死链接巡检工具都没有这个功能的,功能强大些的可能就会把失效的链接返回给你,但是失效的链接是在那个页面那个文案点击跳转的是没有的,那就无法定位失效链接进行修复。DeadLinkHunter工具中截取了部分CrawlSpider源码进行重写,实现了这个功能,获取的每个链接都关联父链接、父链接文案,一起存储到db。(详细实现逻辑:CrawlSpider【获取当前访问链接的父链接和锚文本】代码逻辑)

5.DeadLinkHunter工具支持多个环境执行,把环境配置的相关信息存储到redis,在redis修改要执行的环境变量,就可以实现兼容跑多套不同的环境,和代码完全隔离;爬取的数据也存储到redis,redis基于内存,读写都会更快。

三、工具工作原理

1.使用的技术

py + scrapy + CrawlSpider + selenium + redis + pytest + allure + jenkins

2.架构图

架构图解析:

  • Scrapy Engine(引擎):  负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
  • Scheduler(调度器):  它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
  • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
  • Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
  • Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
  • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。例如:本工具增加自定义selenium组件。
  • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)。

简单点来说,架构图中,scrapy框架实现了如:请求、调度、去重、下载、响应....等功能,其中CrawlSpider(Scrapy框架中的一个子类,它继承了Scrapy.Spider类)是本工具实现的核心,与普通的Spider不同,CrawlSpider能够自动发现链接并跟踪它们,从而方便地爬取整个网站。另外,CrawlSpider还支持基于规则的过滤和提取数据(如何解析页面和如何使用XPath或CSS选择器来提取数据),这使得我们可以更加灵活地控制爬取的数据。(具体了解可以访问scrapy官网文档:Scrapy 2.11 documentation — Scrapy 2.11.0 documentation)

3.编写代码逻辑的节点

而架构图中,另外需要程序员编写代码逻辑的节点是:

Spider(程序)&CrawlSpider

  1. 定义巡查的站点的初始链接
  2. 配置CrawlSpider的发现链接并爬取规则
  3. 定义页面内容来判断页面是否存在和是否为死链接的
  4. 获取跳转到爬取到的链接的父链接 referer_url 和 父链接的文案 referer_url_text,详情:CrawlSpider【获取当前访问链接的父链接和锚文本】代码逻辑

1~3的知识都是CrawSpider的内容,就不赘述了,4是个人想法实现的。

Selenium 中间件

  1. 为了避免selenium的driver驱动、浏览器版本各种更新导致失败,就在ks上面起了一个docker部署的selenium,通过remote-selenium来访问scrapy的链接获取链接的源码。
  2. 使用selenium过程遇到一些问题,已解决具体可以看:【重启ks容器自动化】
  3. 然后在scrapy框架的middlewares.py文件的中间件类,添加selenium相关的代码。

将数据写入Redis

  • 在scrapy框架自带的pipelines.py添加redis的写入逻辑即可,这个也是scrapy框架和py-redis的内容,就不赘述了。
  • 在pipelines里面获取scrapy爬虫结束后的统计信息,详情:【scrapy pipelines】

Pytest&Allure进行断言输出结果报告

  •  获取链接的数据写入reids后,需要进行分析,哪些链接是失效链接,个人使用了pytest进行断言,allure进行报告展示,详情:【Pytest&Allure分析Redis的数据并动态生成testCase报告】

四、使用步骤和实际成果

使用步骤:
  • 连接redis终端,参考已经有的配置,进行添加、修改相关配置信息:

  • 在Jenkins点击后,巡查开始....

注:为了DeadLinkHunter工具更加灵活通用,Jenkins没有绑定任何配置信息,只是利用Jenkins的定时运行、报告在线展示。

把DeadLinkHunter工具的配置全部剥离放在redis,因为DeadLinkHunter工具获取到的数据是存到redis,那么只需要在redis同时配置好环境信息,就可以跑起来了,不需要强耦合Jenkins才能用。

最终效果:

报告链接:http://jenkins.iot-qa.org.com/view/org-scrapy/job/org-scrapy/35/allure/#

五、工具的局限性

DeadLinkHunter工具使用 Scrapy 和 Selenium 获取动态源码的方法,目前来看,是准确性最高的方法。但由于 Selenium 是通过浏览器驱动实现的,因此也有一些局限性:

Selenium 是基于浏览器自动化测试的技术,因此其性能和效率较差,相对于 Scrapy 自带的 HTTP 请求库来说,Selenium 的处理速度更加缓慢,无法满足高并发请求的需求。同时,使用 Selenium 还需要启动浏览器进行页面渲染,也会导致内存占用和 CPU 使用率的增加。

所以,文档中心巡查一次大概700多个页面,时间都会超过一小时。

六、相关资源

gitlab地址:git@gitlab.org.com:name/org-scrapy.git

Jenkins地址:http://jenkins.****.com/view/org-scrapy/job/org-scrapy/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1408815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS进阶-解构赋值(一)

扩展:解构赋值时Js特有的一种处理数据的方式,在Java中没有处理数据的方式 知识引入: 思考:在js中,在没有学习解构赋值之前,我们是如何获取数组的内容的? 以上要么不好记忆,要么书写麻…

css实现右边边框分割线 渐变色,边框四角样式

分割线 代码 .data-item:first-of-type {border-right: 2px solid;border-image: linear-gradient(to top,rgba(0, 0, 0, 0.1) 0%,rgba(81, 110, 197, 0.76) 50%,rgba(0, 0, 0, 0.1) 100%)1;padding: 15px 0;}四角边框样式 代码 .chart-box {cursor: pointer;background: line…

SSM项目集成Spring Security 4.X版本(使用spring-security.xml 配置文件方式)

目录 前言 实战开发: 一、Spring Security整合到SSM项目 1. pom文件引入包 2. web.xml 配置 3. 添加 spring-security.xml 文件 二、Spring Security实战应用 1. 项目结构 2. pom文件引入 3. web.xml 配置 4. Spring 配置 applicationContext.xml 5. sp…

PCB【过孔】

1、钻孔的费用通常占PCB制板费用的30%到40%,过孔钻孔(drill hole) 钻孔周围的焊盘区,这两部分的尺寸大小决定了过孔的大小。过孔越小,其自身的寄生电容也越小。在高速电路中希望越小越好。孔内径原则上要求0.2mm&#…

C4.5决策树的基本建模流程

C4.5决策树的基本建模流程 作为ID3算法的升级版,C4.5在三个方面对ID3进行了优化: (1)它引入了信息值(information value)的概念来修正信息熵的计算结果,以抑制ID3更偏向于选择具有更多分类水平…

内网穿透、远程桌面、VPN的理解

最近在研究内网穿透的相关技术,然后回想起一些相关的技术,比如说要远程桌面公司的电脑,VPN连入内网等。然后想着在此处记录一下,各个的区别,这个纯粹是从技术层面的理解,此处不详细解释怎么去实现或者用什么…

深度学习中RGB影像图的直方图均衡化python代码and对图片中指定部分做基于掩模的特定区域直方图均衡化

深度学习很重要的预处理步骤 就是需要对做直方图均衡化 其中主要分成灰度图以及RGB图的直方图均衡化 这俩的方法和代码不同 想要去看具体原理的朋友可以查看下面这篇博客的内容 写的很详细颜色直方图均衡化(https://www.cnblogs.com/wancy/p/17668345.html) 我们这个场景中会用…

C/C++ - 编程语法特性

目录 标准控制台框架 输入输出对象 命名空间 标准控制台框架 头文件 ​#include <iostream>​​ 告诉编译器我们要使用iostream库尖括号中的名字指定了某个头文件(header) 入口函数 ​int main(void)​​ 返回 ​return 0;​​ 输出语句 ​std::cout << "H…

生产力工具|卸载并重装Anaconda3

一、Anaconda3卸载 &#xff08;一&#xff09;官方方案一&#xff08;Uninstall-Anaconda3-不能删除配置文件&#xff09; 官方推荐的方案是两种&#xff0c;一种是直接在Anaconda的安装路径下&#xff0c;双击&#xff1a; &#xff08;可以在搜索栏或者使用everything里面搜…

一站式VR全景婚礼的优势表现在哪里?

你是否想过&#xff0c;婚礼也可以用一种全新的方式呈现&#xff0c;VR全景婚礼让每位用户沉浸式体验婚礼现场感。现在很多年轻人&#xff0c;都想让自己的婚礼与众不同&#xff0c;而VR全景婚礼也是未来发展的方向之一。 很多婚庆公司开通了VR婚礼这一服务&#xff0c;就是通过…

BACnet转MQTT网关BA113

随着通讯技术和控制技术的发展&#xff0c;为了实现楼宇的高效、智能化管理&#xff0c;集中监控管理已成为楼宇智能管理发展的必然趋势。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中…

如何利用streamlit 將 gemini pro vision 進行圖片內容介紹

如何利用streamlit 將 gemini pro vision 進行圖片內容介紹 1.安裝pip install google-generativeai 2.至 gemini pro 取 api key 3.撰寫如下文章:(方法一) import json import requests import base64 import streamlit as st 讀取圖片檔案&#xff0c;並轉換成 Base64 編…

76.Go分布式ID总览

文章目录 简介一&#xff1a;UUID二、雪花算法三&#xff1a;Leaf-snowflake四&#xff1a;数据库自增ID五&#xff1a;使用Redis实现分布式ID生成六&#xff1a;使用数据库分段&#xff08;Leaf-segment&#xff09;七 &#xff1a;增强版Leaf-segment八&#xff1a;Tinyid九&…

浅学JAVAFX布局

JAVAFX FlowPane布局 Flowpane是一个容器。它在一行上排列连续的子组件&#xff0c;并且如果当前行填充满了以后&#xff0c;则自动将子组件向下推到一行 public class FlowPanedemo extends Application {Overridepublic void start(Stage stage) throws Exception {stage.s…

C++入门篇章1(C++是如何解决C语言不能解决的问题的)

目录 1.C关键字(以C98为例)2.命名空间2.1 命名空间定义2.2命名空间使用 3.C输入&输出4.缺省参数4.1缺省参数概念4.2 缺省参数分类 5. 函数重载5.1函数重载概念5.2 C支持函数重载的原理--名字修饰(name Mangling) 1.C关键字(以C98为例) C总计63个关键字&#xff0c;C语言32…

go api(get post传参,数据库,redis) 测试

介绍&#xff1a;分别测试get请求&#xff0c;post请求&#xff0c;请求链接数据库&#xff0c;以及redis操作。 1.api代码 package mainimport (_ "database/sql""encoding/json""github.com/gin-gonic/gin""go-test/com.zs/database&quo…

【RT-DETR有效改进】交叉形窗口网络 | CSWinTransformer(附代码 + 修改教程)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

【GitHub项目推荐--一款美观的开源社区系统】【转载】

推荐一款开源社区系统&#xff0c;该系统基于主流的 Java Web 技术栈&#xff0c;如果你是一名 Java 新手掌握了基本 JavaEE 框架知识&#xff0c;可以拿本项目作为练手项目。 开源社区系统功能还算完善包含发布帖子、发布评论、私信、系统通知、点赞、关注、搜索、用户设置、…

ToDesk/向日葵的MAC远程鼠标控制不了?如何解决

不知道各位使用Mac电脑的小伙伴们&#xff0c;在日常进行跨设备远控操作时是否曾遇到过远程鼠标控制不了的问题&#xff1f;其实这是因为有项系统权限没有开设导致的&#xff0c;本篇文章木木小编就给大家逐步教学一下针对该问题如何解决才有效&#xff01; 当通过ToDesk远程连…

vue中图片不显示问题 - vue中静态资源加载

文章目录 vue中图片不显示问题静态资源URL 转换规则webpack 静态资源处理 图片不显示问题问题描述解决办法1&#xff1a;使用require引入require is not defined 解决办法2&#xff1a;使用import引入解决办法3&#xff1a;将图片放进公共文件夹static或public vue中图片不显示…