[PYTHON] Testcode, um auf der Seite nach defekten Links zu suchen

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.

Betriebsablauf des Werkzeugs zur Überprüfung defekter Verbindungen

  1. HTTP Holen Sie sich die angegebene URL und analysieren Sie sie mit Beautiful Soup.
  2. Klassifizieren Sie Links in externe Site-Links, relative Links und absolute Links
  3. Extrahieren Sie die Ziel-URL aus den Links derselben Domain auf der Seite
  4. Beseitigen Sie Doppelarbeit Stellen Sie eine HTTP-Anfrage an die in 5.4 generierte verknüpfte URL und bestätigen Sie, dass der HTTP-Status 200 ist.

Python 3.5 async / warte Version

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

Version der Python 2-Serie

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

Testcode, um auf der Seite nach defekten Links zu suchen
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Überprüfen Sie, ob in Java BigQuery-Tabellen vorhanden sind
[Für Anfänger] Web-Scraping mit Python "Greifen Sie auf die URL auf der Seite zu, um den Inhalt abzurufen."
Ich habe versucht, den für TensorFlow geschriebenen Code nach Theano zu portieren
[Python] So überprüfen Sie, ob der Schlüssel im Wörterbuch vorhanden ist
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
Für die Prüfung G-Test 2020 # 2
Tool zum Überprüfen des Codestils
Testcode zur Bewertung von Dekorateuren
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Lassen Sie uns den Code des in Python [VS Code] geschriebenen automatischen E2E-Tests statisch überprüfen und formatieren.
Ich kann mich mit Django 3 nicht auf der Admin-Seite anmelden
Überprüfen Sie den Code mit flake8
Referenz Referenz für diejenigen, die mit Rhinoceros / Grasshopper codieren möchten
Aktivieren Sie die Schaltfläche Überprüfen in Tkinter, damit der Eintrag bearbeitet werden kann
Ich habe eine Funktion erstellt, um zu überprüfen, ob der Webhook vorerst in Lambda empfangen wird
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
[Für Anfänger] So implementieren Sie O'reilly-Beispielcode in Google Colab
So implementieren Sie Java-Code im Hintergrund von Red Hat (Linux ONE)
So überprüfen Sie die Speichergröße einer Variablen in Python
Erklären Sie detailliert den magischen Code für IQ Bot-Tabellenelemente
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
[TensorFlow 2] So überprüfen Sie den Inhalt von Tensor im Diagrammmodus
LINEbot-Entwicklung möchte ich den Betrieb in der lokalen Umgebung überprüfen
Überprüfen Sie den Speicherschutz von Linux Kern mit Code für ARM
Ich möchte den G-Test in einem Monat Tag 1 bestehen
Holen Sie sich die der Netzwerkschnittstelle zugewiesene IPv4-Adresse in Code (Linux)
Programmieren, um in der Welt zu kämpfen ~ 5-1
Programmierung, um in der Welt zu kämpfen ~ 5-5,5-6
Überprüfen Sie Python auf Speicherlecks
Programmieren, um in der Welt zu kämpfen 5-3
Suchen Sie mit Python nach externen Befehlen
Programmierung für den Kampf in der Welt - Kapitel 4
Im Python-Befehl zeigt Python auf Python3.8
Schreiben Sie Selentestcode in Python
Überprüfen Sie die Datenzusammenfassung in CASTable
Probieren Sie Cython in kürzester Zeit aus
So führen Sie TensorFlow 1.0-Code in 2.0 aus
Programmieren, um in der Welt zu kämpfen ~ 5-2
So überprüfen Sie automatisch, ob der in Google Colaboratory geschriebene Code dem Python-Codierungsstandard "pep8" entspricht.
Wie man für den Deep Learning Association G-Test (für Anfänger) lernt [Version 2020]
Annäherungserklärung für Anfänger, um in Kaggle Titanic_3 unter den besten 1,5% (0,83732) zu sein
Hinzufügen von Kv-Sprachsyntax-Highlights zu Spyder in Python IDE
So überprüfen Sie die lokale GAE über den iPhone-Browser im selben LAN
Klicken Sie auf die Selenium-Links, um die Elemente der einzelnen Seiten abzurufen
Codebeispiel zum Abrufen von oauth_token und oauth_token_secret der Twitter-API in Python 2.7
Annäherungserklärung für Anfänger, um in Kaggle Titanic_1 unter den besten 1,5% (0,83732) zu sein
Zum ersten Mal in Numpy werde ich es von Zeit zu Zeit aktualisieren
Wechseln Sie das zu ladende Modul für jede Ausführungsumgebung in Python
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 6 Verbessern Sie den Python-Code
Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein
Zeigen Sie den Implementierungsquellcode in iPython an
Überprüfen Sie das Verhalten des Zerstörers in Python
So überprüfen Sie die Version von Django
Schreiben Sie den Test in die Python-Dokumentzeichenfolge