Selenium 一坨寻找 404 页面的代码

hellohell · June 27, 2018 · Last by hellohell replied at June 29, 2018 · 2521 hits

这坨代码解决的问题:
公司主站做好了,哪些路由配置有问题,或者没资源,nginx搞错了,404, 5xx,挨个点?

下面进入不正经时间

  • 肯定是在造轮子,而且必须是方的.但wo孤落寡闻,在坛子上找了找,看到个c#工具

  • 写完了也没仔细测, 凑合能用,真是凑合能用

  • 只适用于特定的网站,不要指望改个网址就能用了. 一直认为开发出让所有人都能用的测试工具, 简直扯淡,等同于让所有人都幸福

  • 为啥不用request-html,这个...,暂时不会,没看;

  • 可以拓展:

    • 需要用户登录后去扫,会Se就成
    • 需要处理特殊超链接,比如不是写在<a href=xxx>那,像我们公司的网站的分页...
    • 404了,没准是网络不好,再抓一次
    • 愿意改成多线程多什么就去改吧

反正是凑合能用

效果图如下, 不好意思 扫了宜信的网站,抱歉.
代码如下:

#! /usr/bin/env python3
# coding=utf-8

import time
from urllib.parse import urljoin
from selenium import webdriver
from bs4 import BeautifulSoup
from logzero import logger

domain='https://www.yirendai.com/abc'
title404="您访问的页面不存在-宜人贷"

dr=webdriver.Firefox()

def scrap_url(url,orginal_url=None,scrap=True):
"""
a页面有b页面超链接,同时b页面有a页面超链接.访问a->解析出b->访问b->解析出a
->访问a,不对a页面再次解析,此时scrap=False
"""
status_code=200
try:
now=time.time()
dr.get(url)

#根据title判断/或者404页面文件都比较小
if dr.title==title404: status_code=404

html=dr.page_source
soup=BeautifulSoup(html,'html.parser')
except Exception as e:
dr.get_screenshot_as_base64('f{orginal_url}_to_{url}')
finally:
t='%.2f' %(time.time()-now)
if status_code==200:
mod="32m"
elif status_code==404:
mod="31m"
logger.debug(f'{orginal_url} to {url} \033[0;34m {t}s \033[0m '
f'\033[0;{mod}{status_code}\033[0m')

more_seeds=[]

#有些网站的站内的超链接不是href参数提供的,需要继续在if修改
# 有些还有外链,都是在这处理....
if scrap:
for a in soup.find_all(href=True):
if a['href'].startswith('/'):
more_seeds.append((urljoin(domain,a['href']),url))
return more_seeds

def main(domain):
seeds=scrap_url(domain)
old_urls=[]
while seeds:
seed,seeds=seeds[0],seeds[1:]
url,orginal_url=seed
if url not in old_urls:
more_seeds=scrap_url(url,orginal_url)
old_urls.append(url)
else:
more_seeds=scrap_url(url,orginal_url,False)
seeds.extend(more_seeds)

main(domain)

可耻的放上我的github: https://github.com/mixure/tools

最佳回复
  • 睡了一觉后改了改,新的可以去github获取;修改了计算访问时间,日志打印

  • 看到回帖说for循环搞定,插件搞定;

    • for 循环.愿意看路由的话,可以;
    • 插件应该都是当前页吧;另外试了试一楼提供的Check-My-Links,非<a herf=xxx>提供的入口不支持
  • 请提供个: 1.支持全站检查; 2支持非<a herf=xxx>获得链接的工具; wo确实不知道,@iqianxing

ps: 公司的分页代码

共收到 11 条回复 时间 点赞
Author only

1、这可以是一个for循环搞定的事情!
2、这也可以是一个chrome插件搞定的事情!
3、这已有许多工具支持!

河马 回复

https://www.cnblogs.com/ping-y/p/5897018.html
这和使用什么语言没什么关系.

  • 睡了一觉后改了改,新的可以去github获取;修改了计算访问时间,日志打印

  • 看到回帖说for循环搞定,插件搞定;

    • for 循环.愿意看路由的话,可以;
    • 插件应该都是当前页吧;另外试了试一楼提供的Check-My-Links,非<a herf=xxx>提供的入口不支持
  • 请提供个: 1.支持全站检查; 2支持非<a herf=xxx>获得链接的工具; wo确实不知道,@iqianxing

ps: 公司的分页代码

另外 咱们系统是依据啥来判断“最佳回复”的;@思寒大人😂 😂
这ror挺好玩啊


在Check-My-Links的选项中有这个选项,不知是否能解决非<a herf=xxx>的问题(我没找这样的例子网站,应该是我没用力找😂 )。
至于说全站点扫描,确实插件只能做当前页检查(能力有限😂 )

chen 回复

谢谢回复

chen 回复

使用cookie、本地存储便可解决问题,复杂一点来个jsonp跨域,将数据存库,插件完全有能力控制整个站点的访问

hellohell 回复

1、插件结合cookie、本地存储完全可以实现你的需求;
2、线上检查不仅仅是关注404,既然都爬取了一遍网站的所有链接,还可以做得更多!
3、开源网络爬虫非常多,先可以去了解一下

hellohell #11 · June 29, 2018 作者

我恨讨厌别人用感叹号回复我;

hellohell 关闭了讨论 29 Jun 02:12
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up