一、问题描述

任务:要用工具全自动找出一个网站中的所有带某个特定图标的网页中所有死链。

死链就是失效的链接,错误的链接。对链接发送请求,返回的结果是4XX,5XX,例如404,502等等。如图1-1,这就是一个死链点击之后的页面。

图1-1

现在目标网站是东北师范大学官网。要用自动化程序找出目标网站中所有带有“有奖纠错”标志的网页中的死链,并生成死链信息报告。

“有奖纠错”标志如图1-2。

图1-2

二、工具准备

本次开发需要用到selenium坏境,所以需要安装selenium。

在PyCharm软件Terminal中输入:pip install selenium,即可完成安装。

三、技术路线

3.1 数据结构

  1. 用队列queue记录将要访问的链接。

  1. 队列queue每一个节点(链接)组成一个树形结构,如图3-1。

  1. 对树形结构采用BFS(广度优先遍历)方式遍历。

BFS遍历在此问题中应用如下。

图3-1

如图3-1,图中每一个节点都代表一个链接(链接a,链接b,链接c......)。

访问网站中所有的网页链接具体实现过程如下。

1)首先将链接a加入队列,此时队列queue中有元素a,即queue(a);

2)然后链接a出队(代表将要访问链接a),链接a网页中有链接b,c,所以将b、c加入queue,此时queue中有元素b、c,即queue(b,c);

3)接着链接b出队(访问链接b),链接b中有链接d、e、f,所以将d、e、f,加入queue,此时queue中有元素c、d、e、f,queue(c,d,e,f);

继续出队和进队操作,直到队列queue为空停止。

3.2 避免访问链接进入循环

用哈希表记录访问过的链接。每次访问前做判断。

哈希表以键值对的形式存储元素,并且键具有唯一性,访问哈希表中的元素可以直接根据键(Key)访问对应的值,因此查找速度快。哈希表存储元素的过程是先判断要存储的元素与已有元素的hashcode是不是相同,如果不相同则会直接存储。

函数代码如下。

# 函数功能:判断链接是否访问过
def judge(url):# 把访问过的节点放在hash表中if str(url) in hashList:return Trueelse:hashList[str(url)] = Truereturn False

3.3 有奖纠错标志

爬取网页中的图片,并判断是否有目标图片。

用Selenium中的库函数find_elements(),可以获取网页中所有的图片元素,然后判断这些图片中是否含有“有奖纠错”标志图片。

函数代码如下。

# 函数功能:检查网页中是否有“有奖纠错”标志
def check_logo(url):print(url)wb = webdriver.Chrome(options=options)wb.get(url)imgs = wb.find_elements(By.XPATH, '//img')flag = '无标志'for img in imgs:s = img.get_attribute('src')if s == func(url) + 'images/yjjc.png':flag = '有标志'if flag == '有标志':return Trueelse:return Falsewb.close()

3.4 status code

判断一个链接是否是死链需要两个步骤。

  1. 向链接发送请求。

  1. 判断返回的status code(状态码)。

记录死链,记录status code为4XX和5XX的死链,例如404, 502。

代码如下。

request = requests.head(url=u, timeout=1)
if request.status_code >= 400 and request.status_code < 600:listError.append(rootUrl)listError.append(url)listError.append(u)listError.append(t)listError.append(request.status_code)listAllError.append(listError)

四、架构图

自动化程序、selenium、浏览器、浏览器驱动、目标网站之间的工作原理如下。

  1. 自动化程序调用Selenium客户端的库函数(例如获取页面链接元素)。

  1. 然后Selenium客户端库会发送命令,把命令发送给浏览器的驱动程序(WebDriver)。

  1. 浏览器驱动程序(WebDriver)接收命令后,驱动浏览器去执行命令。

  1. 浏览器执行命令(打开网站网页等),然后再将命令结果返回给浏览器驱动(WebDriver)。

  1. 浏览器驱动程序获取命令执行的结果,再将结果返回给自动化程序。

  1. 程序再对返回结果做处理。

所以架构图,如图4-1。

图4-1

五、实验结果

如图5-1,是程序运行输出数结果的部分截图,截图中包括了表头(网站、网页、链接href、文本、错误号),和死链信息。

图5-1

附录A

完整代码。

import time, os, re
import requests
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
wd = webdriver.Chrome(options=options)
url = '目标网站'
listAllError = [] # 记录所有的错误信息
listError = [] # 记录一条错误信息  网站 网页 链接href 文本 错误号
hashList = {} #hash表,记录访问过的链接
queue = [] # 队列,记录即将访问的网页链接
queue.append(url)
columns = ["网站", "网页", "链接href", "文本", "错误号"] # 表头,死链信息
strNenu = 'nenu.edu'# 函数功能:获取网页所在网站
def func(url):x = re.split('/+', str(url))y = x[0] + '//' + x[1] + '/'return str(y)# 函数功能:检查带有“有奖纠错”标志的网站中异常链接
def check_bug(url):global listErrorglobal listAllErrorrootUrl = func(url) # 获取url所在网站try:wb = webdriver.Chrome(options=options)wb.get(url)# 获取所有的链接links = wb.find_elements(By.XPATH, "//a")for link in links:u = link.get_attribute('href')t = link.get_attribute('innerText')if t == '':continuetry:request = requests.head(url=u, timeout=1)if request.status_code >= 400 and request.status_code < 600:listError.append(rootUrl)listError.append(url)listError.append(u)listError.append(t)listError.append(request.status_code)listAllError.append(listError)listError = []dt = pd.DataFrame(listAllError, columns=columns)dt.to_excel("Bug.xlsx", index=0) # 将数据写入文件except:print()wb.close()except:print()wb.close()# 函数功能:检查网页中是否有“有奖纠错”标志
def check_logo(url):print(url)wb = webdriver.Chrome(options=options)wb.get(url)imgs = wb.find_elements(By.XPATH, '//img')flag = '无标志'for img in imgs:s = img.get_attribute('src')if s == func(url) + 'images/yjjc.png':flag = '有标志'if flag == '有标志':return Trueelse:return Falsewb.close()# 函数功能:判断链接是否访问过
def judge(url):# 把访问过的节点放在hash表中if str(url) in hashList:return Trueelse:hashList[str(url)] = Truereturn Falsedef check_link(link):# 如果访问过,退出函数if judge(link):returnif strNenu not in str(link):return# 不用了,已将把访问过的链接放在哈希表中了# listPass.append(link) # 这里存放已经遍历过的链接try:if check_logo(link):# 有标志,检查该网页中的死链接x = re.split('/+', str(link))# 是网站中的一个网页if x[2] != '':check_bug(link)except:print()wd.get(link)addresses = wd.find_elements(By.XPATH , '//a')for address in addresses:a = address.get_attribute('href')queue.append(a)# 启动开始
while True:check_link(queue.pop(0)) # 弹出队列中的第一个链接,,并访问if len(queue) == 0: # 队列为空,退出循环,结束程序break

爬虫,找出网站中的死链相关推荐

  1. html%3ca%3e标签中有变量,经过代码审计找出网站中的XSS漏洞实战(三)

    1.背景 笔者此前录制了一套XSS的视频教程,在漏洞案例一节中讲解手工挖掘.工具挖掘.代码审计三部份内容,准备将内容用文章的形式再次写一此,前两篇已经写完,内容有一些关联性,其中手工XSS挖掘篇地址为 ...

  2. 通过Web安全工具Burp suite找出网站中的XSS漏洞实战(二) 1

    一.背景 笔者6月份在慕课网录制视频教程XSS跨站漏洞 加强Web安全,里面需要讲到很多实战案例,在漏洞挖掘案例中分为了手工挖掘.工具挖掘.代码审计三部分内容,手工挖掘篇参考地址为快速找出网站中可能存 ...

  3. 网站出现大量死链时该如何进行处理?

    网站在运行的过程中,由于更新或者改版等网站难免会出现一些死链等问题,导致用户浏览网站不方便,也给优化人员带来了一些优化困扰.一般网站出现死链的原因就是人为的操作失误,要不就是程序本身的问题了.下面就带 ...

  4. 网站服务器出现的链接错误,网站页面出现死链是哪些原因导致的?

    网站死链大家都知道对于网站有较大的影响,一个站点存在着过多的死链是可能会导致网站降权,严重还会被K站,所以网站必须减少死链接情况出现.死链接是开始有效网站,过一段时间成为无效网站.到底哪些情况,导致死 ...

  5. 算法期中1007. 怪兽训练 (找出有向图中所有的强连通分量的Kosaraju算法)

    Description 贝爷的人生乐趣之一就是约战马会长. 他知道马会长喜欢和怪兽对决,于是他训练了N只怪兽,并对怪兽用0到N-1的整数进行编号. 贝爷训练怪兽的方式是让它们一对一互殴. 两只怪兽互殴 ...

  6. java数组出现次数最多的数_找出数组中出现次数最多的那个数——主元素问题...

    方法一:以空间换时间,可以定义一个计数数组int count[101],用来对数组中数字出现的次数进行计数(只能针对数组中数字的范围1~100),count数组中最大的元素对应的下标,即为出现次数最多 ...

  7. 找出数组中重复的数字---多思路

    问题:找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...

  8. 如何找出R中加载的软件包版本?

    本文翻译自:How to find out which package version is loaded in R? I am in a process of figuring out how to ...

  9. 找出重复的数java_剑指offer:1.找出数组中重复的数(java版)

    数组中重复的数: 题目:找出数组中重复的数, 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的. 也不知道每个数字重复几次.请找 ...

最新文章

  1. 多表连接时USING和ON的区别,USING会去掉重复列,ON显示重复列。
  2. 规范化编程:ANSI和UNICODE的使用
  3. c语言将一个实型变量f=55.5678,《C语言程序设计》第2章2 常量和变量
  4. C++socket编程(三):3.4 listen监听
  5. 配置node.js默认的npm安装目录
  6. 20190601:第一个JDBC程序
  7. [NLP]OpenNLP命名实体识别(NameFinder)的使用
  8. 民营银行是怎样炼成的:优中选优最终挑选出5家
  9. 直线型一阶倒立摆1---概念篇
  10. 数学建模——指派问题
  11. 算法笔记---自底向上的赫夫曼编码
  12. 计算机打印怎样添加PDF格式,将PDF打印机添加到计算机后如何将Excel打印为PDF
  13. 【23种设计模式】【单例模式】
  14. 【清华大学陈渝】第二章 启动、中断、异常和系统调用
  15. cmd 如何打开资源管理器
  16. 邮箱中已发出的电子邮件发错了怎么撤回?
  17. Windows 10与微软公有云Azure
  18. Redis——Redis持久化
  19. 【OpenGL学习笔记⑤】——纹理变换【glm配置+两张图片交替渐变变换 + 纹理平移 + 实现雪花飘落】
  20. python使用mysql实例教程_Python操作Mysql实例代码教程(查询手册)

热门文章

  1. ICCV2021 Group-Free 3D Object Detection via Transformers
  2. 财商密码——《富爸爸.穷爸爸》读后感
  3. 阿里 菜鸟网络(一面)
  4. 我放弃了成为一个全栈开发工程师的理想
  5. 我的前端学习之CSS基础--选择器、字体、非布局样式、背景
  6. ecology报错 License文件上传出错!
  7. 机械制图及计算机绘图试题库,机械制图及计算机绘图试题库(下).doc
  8. POCO库下访问HTTPS获取返回的JSON数据
  9. 电脑窗口颜色设置---保护眼睛
  10. paddle gaussian_blur2d