Die Überprüfung der defekten Verbindung von Hand ist nicht korrekt und nimmt Zeit in Anspruch. Externe Tools sind jedoch schwer auszuführen und können nicht in einer Entwicklungsumgebung ausgeführt werden. Also habe ich es selbst gemacht. Es unterstützt relative und absolute Links.
Beautiful Soup
.Es funktioniert 60% schneller als die unten beschriebene Python 2-Version mit nicht blockierenden HTTP-Anforderungen. Die Python2-Version befindet sich am Ende der Seite. Mit diesem Code werden 100 Links in 1-3 Sekunden bestätigt.
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):
"""
URL herunterladen und bs4 analysieren
Überprüfen Sie den Status aller Links
"""
#URL analysieren
o = urlparse(url)
host = o.netloc
#Holen Sie sich die angegebene URL und analysieren Sie sie
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] == '/':
#Relativer Link
test_url = 'http://{}{}'.format(host, href)
test_urls.append(test_url)
elif host in href:
#Absoluter Link und gleiche Domain
test_urls.append(href)
else:
#Testen Sie keine externen Site-Links
print('IGNORE:{}'.format(href))
#Deduplizierung
test_urls = list(set(test_urls))
for test_url in test_urls:
print(test_url)
#Überprüfen Sie, ob die Verbindung aktiv ist, indem Sie asynchron ausgeführt werden
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([check_url(url) for url in test_urls]))
async def check_url(url):
"""
Überprüfen Sie die URL asynchron und überprüfen Sie, ob HTTP STATUS 200 antwortet
:param url: str
"""
response = await aiohttp.request('GET', url)
status_code = response.status
assert status_code == 200, '{}:{}'.format(str(status_code), url)
response.close()
Ausführungsmethode
>>>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):
"""
URL herunterladen und bs4 analysieren
Überprüfen Sie den Status aller Links
"""
#URL analysieren
o = urlparse(url)
host = o.netloc
#Holen Sie sich die angegebene URL und analysieren Sie sie
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] == '/':
#Relativer Link
test_url = 'http://{}{}'.format(host, href)
test_urls.append(test_url)
elif host in href:
#Absoluter Link und gleiche Domain
test_urls.append(href)
else:
#Testen Sie keine externen Site-Links
print('IGNORE:{}'.format(href))
#Deduplizierung
test_urls = list(set(test_urls))
for test_url in test_urls:
print(test_url)
#Überprüfen Sie, ob der Link aktiv ist
response = requests.get(test_url, timeout=2)
assert response.status_code == 200
Recommended Posts