Ich bringe mir selbst ein grundlegendes Scraping bei und habe festgestellt, dass manchmal die URLs, die ich in meinen Code eingebe, 404 zurückgeben, wodurch der gesamte Rest meines Codes zusammengefasst wird.
Ich brauche also einen Test oben im Code, um zu überprüfen, ob die URL 404 zurückgibt oder nicht.
Dies scheint eine ziemlich einfache Aufgabe zu sein, aber Google gibt mir keine Antworten. Ich mache mir Sorgen, ich suche nach den falschen Sachen.
Ein Blog empfahl mir Folgendes:
$valid = @fsockopen($url, 80, $errno, $errstr, 30);
und testen Sie dann, ob $ gültig ist, wenn es leer ist oder nicht.
Aber ich denke, die URL, die mir Probleme bereitet, hat eine Umleitung, sodass $ valid für alle Werte leer ist. Oder vielleicht mache ich etwas anderes falsch.
Ich habe auch eine "Kopfanfrage" geprüft, aber ich habe noch keine tatsächlichen Codebeispiele gefunden, mit denen ich spielen oder ausprobieren kann.
Vorschläge? Und was ist das mit Locken?
quelle
curl_setopt($handle, CURLOPT_NOBODY, true);
bevor Sie ausführencurl_exec
Wenn Sie PHP5 ausführen, können Sie Folgendes verwenden:
Alternativ hat ein Benutzer mit php4 Folgendes beigetragen:
Beide hätten ein ähnliches Ergebnis wie:
Daher können Sie einfach überprüfen, ob die Header-Antwort in Ordnung war, z.
W3C-Codes und Definitionen
quelle
get_headers($https_url,1,443);
Ich bin sicher, dass es funktionieren wird, obwohl es nicht in der Standardfunktion enthaltenget_headers()
ist. Sie können es gerne testen und mit einem Status dafür antworten.Mit dem Code von strager können Sie auch CURLINFO_HTTP_CODE auf andere Codes überprüfen. Einige Websites melden keine 404, sondern leiten einfach auf eine benutzerdefinierte 404-Seite um und geben 302 (Weiterleitung) oder ähnliches zurück. Ich habe dies verwendet, um zu überprüfen, ob eine tatsächliche Datei (z. B. robots.txt) auf dem Server vorhanden ist oder nicht. Natürlich würde diese Art von Datei keine Umleitung verursachen, wenn sie existiert, aber wenn sie nicht vorhanden wäre, würde sie auf eine 404-Seite umleiten, die, wie ich bereits sagte, möglicherweise keinen 404-Code hat.
quelle
408 Request Timeout
, nicht eine404
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, FALSE);
Wie strager vorschlägt, sollten Sie cURL verwenden. Möglicherweise möchten Sie auch CURLOPT_NOBODY mit curl_setopt so einstellen , dass das Herunterladen der gesamten Seite übersprungen wird (Sie möchten nur die Überschriften).
quelle
Wenn Sie nach einer einfachsten Lösung suchen und die, die Sie auf einmal ausprobieren können, tun Sie dies auf PHP5
quelle
Ich habe diese Antwort hier gefunden :
Im Wesentlichen verwenden Sie die Methode "Datei abrufen von Inhalten", um die URL abzurufen, die die http-Antwortheadervariable automatisch mit dem Statuscode auffüllt.
quelle
Dies gibt Ihnen true, wenn die URL nicht 200 OK zurückgibt
quelle
Nachtrag, testete diese 3 Methoden unter Berücksichtigung der Leistung.
Das Ergebnis, zumindest in meiner Testumgebung:
Curl gewinnt
Dieser Test wird unter der Berücksichtigung durchgeführt, dass nur die Header (noBody) benötigt werden. Teste dich selbst:
quelle
Als zusätzlichen Hinweis auf die sehr akzeptierte Antwort:
Bei der Verwendung einer Variation der vorgeschlagenen Lösung wurden Fehler aufgrund der PHP-Einstellung 'max_execution_time' angezeigt. Also habe ich Folgendes getan:
Zuerst habe ich das Zeitlimit auf eine höhere Anzahl von Sekunden eingestellt, am Ende habe ich es auf den in den PHP-Einstellungen definierten Wert zurückgesetzt.
quelle
quelle
Hier ist eine kurze Lösung.
In Ihrem Fall können Sie zu dem wechseln
application/rdf+xml
, was Sie verwenden.quelle
Diese Funktion gibt den Statuscode einer URL in PHP 7 zurück:
Beispiel:
quelle
Sie können diesen Code auch verwenden, um den Status eines Links anzuzeigen:
quelle
Dies ist gerecht und ein Stück Code, Hoffnung funktioniert für Sie
quelle
Hier ist ein Weg!
Dieses einfache Skript fordert einfach die URL nach ihrem Quellcode an. Wenn die Anforderung erfolgreich abgeschlossen wurde, wird "URL Exists!" Ausgegeben. Wenn nicht, wird "URL existiert nicht!" Ausgegeben.
quelle