[PYTHON] Code de test pour vérifier les liens brisés dans la page

La vérification manuelle du lien cassé n'est pas précise et prend du temps. Cependant, les outils externes sont lourds à exécuter et ne peuvent pas être exécutés dans un environnement de développement. Alors je l'ai fait moi-même. Il prend en charge les liens relatifs et les liens absolus.

Flux de fonctionnement de l'outil de vérification de lien rompu

  1. HTTP OBTENEZ l'URL spécifiée et analysez-la avec Beautiful Soup.
  2. Classer les liens en liens de sites externes, liens relatifs et liens absolus
  3. Extrayez l'URL de destination des liens du même domaine dans la page
  4. Éliminer les doubles emplois Envoyez une requête HTTP à l'URL liée générée en 5.4 et confirmez que l'état HTTP est 200.

Version asynchrone / attente de Python 3.5

Il fonctionne 60% plus vite que la version Python 2 décrite ci-dessous avec des requêtes HTTP non bloquantes. La version Python2 est au bas de la page. Avec ce code, 100 liens seront confirmés en 1-3 secondes.

tests_url.py


# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

import random
from urllib.parse import urlparse

from bs4 import BeautifulSoup
import requests
import asyncio
import aiohttp
from module.site.site import Site


def tests_urls():
    urls = [
        "http://www.disney.co.jp/home.html",
        "http://starwars.disney.co.jp/home.html"
    ]

    for test_url in urls:
        parse_and_request(test_url)


def parse_and_request(url):
    """
Télécharger l'URL et analyser bs4
Vérifiez l'état de tous les liens
    """
    #Analyser l'URL
    o = urlparse(url)
    host = o.netloc

    #OBTENIR et analyser l'URL spécifiée
    response = requests.get(url, timeout=2)
    assert response.status_code == 200
    soup = BeautifulSoup(response.text, "lxml")
    test_urls = []
    for a in soup.find_all("a"):
        href = a.get("href")
        if href[0] == '#':
            pass
        elif href[0] == '/':
            #Lien relatif
            test_url = 'http://{}{}'.format(host, href)
            test_urls.append(test_url)
        elif host in href:
            #Lien absolu et même domaine
            test_urls.append(href)
        else:
            #Ne testez pas les liens de sites externes
            print('IGNORE:{}'.format(href))

    #Déduplication
    test_urls = list(set(test_urls))
    for test_url in test_urls:
        print(test_url)

    #Vérifiez si le lien est actif en s'exécutant de manière asynchrone
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait([check_url(url) for url in test_urls]))


async def check_url(url):
    """
Vérifiez l'URL de manière asynchrone et vérifiez que HTTP STATUS répond 200
    :param url: str
    """
    response = await aiohttp.request('GET', url)
    status_code = response.status
    assert status_code == 200, '{}:{}'.format(str(status_code), url)
    response.close()

Méthode d'exécution


>>>py.test tests_url.py

Version de la série Python 2

tests_url.py


# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

from urllib.parse import urlparse

from bs4 import BeautifulSoup
import requests


def tests_urls():
    urls = [
        "http://www.disney.co.jp/home.html",
        "http://starwars.disney.co.jp/home.html"
    ]

    for test_url in urls:
        parse_and_request(test_url)


def parse_and_request(url):
    """
Télécharger l'URL et analyser bs4
Vérifiez l'état de tous les liens
    """
    #Analyser l'URL
    o = urlparse(url)
    host = o.netloc

    #OBTENIR et analyser l'URL spécifiée
    response = requests.get(url, timeout=2)
    assert response.status_code == 200
    soup = BeautifulSoup(response.text, "lxml")
    test_urls = []
    for a in soup.find_all("a"):
        href = a.get("href")
        if href[0] == '#':
            pass
        elif href[0] == '/':
            #Lien relatif
            test_url = 'http://{}{}'.format(host, href)
            test_urls.append(test_url)
        elif host in href:
            #Lien absolu et même domaine
            test_urls.append(href)
        else:
            #Ne testez pas les liens de sites externes
            print('IGNORE:{}'.format(href))

    #Déduplication
    test_urls = list(set(test_urls))
    for test_url in test_urls:
        print(test_url)

        #Vérifiez si le lien est actif
        response = requests.get(test_url, timeout=2)
        assert response.status_code == 200

Recommended Posts

Code de test pour vérifier les liens brisés dans la page
Je veux écrire en Python! (1) Vérification du format de code
Vérifier l'existence de tables BigQuery en Java
[Pour les débutants] Web scraping avec Python "Accédez à l'URL de la page pour obtenir le contenu"
J'ai essayé de porter le code écrit pour TensorFlow sur Theano
[python] Comment vérifier si la clé existe dans le dictionnaire
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
Pour se préparer au test G 2020 # 2
Outil pour vérifier le style de code
Code de test pour évaluer les décorateurs
J'ai essayé de résumer le code souvent utilisé dans Pandas
Vérifions et formons statiquement le code du test automatique E2E écrit en Python [VS Code]
Je n'arrive pas à me connecter à la page d'administration avec Django 3
Vérifiez le code avec flake8
Référence de référence pour ceux qui veulent coder avec Rhinoceros / Grasshopper
Cochez le bouton Vérifier dans Tkinter pour autoriser la modification de l'entrée
J'ai créé une fonction pour vérifier si le webhook est reçu dans Lambda pour le moment
Comment définir la résolution de sortie pour chaque image clé dans Blender
[Pour les débutants] Comment implémenter l'exemple de code O'reilly dans Google Colab
Comment implémenter du code Java en arrière-plan de Red Hat (Linux ONE)
Comment vérifier la taille de la mémoire d'une variable en Python
Expliquez en détail le code magique des éléments de table IQ Bot
J'ai écrit le code pour écrire le code Brainf * ck en python
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
[TensorFlow 2] Comment vérifier le contenu de Tensor en mode graphique
Développement LINEbot, je souhaite vérifier le fonctionnement dans l'environnement local
Vérifiez la protection de la mémoire de Linux Kerne avec le code pour ARM
Je veux réussir le test G dans un mois Jour 1
Obtenez l'adresse IPv4 attribuée à l'interface réseau dans le code (Linux)
Programmation pour combattre dans le monde ~ 5-1
Programmation pour combattre dans le monde ~ 5-5,5-6
Rechercher les fuites de mémoire dans Python
Programmer pour combattre dans le monde 5-3
Rechercher des commandes externes avec python
Programmation pour combattre dans le monde - Chapitre 4
Dans la commande python, python pointe vers python3.8
Ecrire le code de test du sélénium en python
Vérifiez le résumé des données dans CASTable
Essayez Cython dans les plus brefs délais
Comment exécuter du code TensorFlow 1.0 en 2.0
Programmation pour combattre dans le monde ~ 5-2
Comment vérifier automatiquement si le code que vous avez écrit dans Google Colaboratory correspond à la norme de codage python "pep8"
Comment étudier pour le test G de Deep Learning Association (pour les débutants) [version 2020]
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_3
Ajouter des points forts de la syntaxe du langage Kv à Spyder dans Python IDE
Comment vérifier le GAE local à partir du navigateur iPhone dans le même LAN
Cliquez sur les liens Selenium afin d'obtenir les éléments des pages individuelles
Exemple de code pour obtenir oauth_token et oauth_token_secret de l'API Twitter en Python 2.7
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_1
Pour la première fois dans Numpy, je vais le mettre à jour de temps en temps
Changer le module à charger pour chaque environnement d'exécution en Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 6 Améliorer le code Python
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_2
Afficher le code source de l'implémentation dans iPython
Vérifiez le comportement du destroyer en Python
Comment vérifier la version de Django
Ecrire le test dans la docstring python