Selenium 一坨寻找 404 页面的代码

hellohell · 2018年06月27日 · 最后由 hellohell 回复于 2018年06月29日 · 2542 次阅读

这坨代码解决的问题:
公司主站做好了,哪些路由配置有问题,或者没资源,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 条回复 时间 点赞
仅楼主可见

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

ASFKJHKJ 回复

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 关闭了讨论 06月29日 02:12
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册