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