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.
Beautiful Soup.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
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