Uczę się podstawowych zasad skrobania i odkryłem, że czasami adresy URL, które wprowadzam do mojego kodu, zwracają 404, co powoduje utratę całej reszty kodu.
Więc potrzebuję testu na górze kodu, aby sprawdzić, czy adres URL zwraca 404, czy nie.
Wydawałoby się to dość prostym zadaniem, ale Google nie daje mi żadnych odpowiedzi. Martwię się, że szukam niewłaściwych rzeczy.
Jeden blog polecił mi to:
$valid = @fsockopen($url, 80, $errno, $errstr, 30);
a następnie sprawdź, czy $ ważne, jeśli jest puste, czy nie.
Ale myślę, że adres URL, który sprawia mi problemy, ma przekierowanie, więc $ valid jest puste dla wszystkich wartości. A może robię coś złego.
Przyjrzałem się również „żądaniu głównemu”, ale nie znalazłem jeszcze żadnych przykładów kodu, którymi mógłbym się bawić lub wypróbować.
Propozycje? A o co chodzi z curl?
źródło
curl_setopt($handle, CURLOPT_NOBODY, true);
przed uruchomieniemcurl_exec
Jeśli masz uruchomione php5, możesz użyć:
Alternatywnie w przypadku php4 użytkownik dodał:
Oba miałyby wynik podobny do:
Dlatego możesz po prostu sprawdzić, czy odpowiedź nagłówka była OK, np .:
Kody i definicje W3C
źródło
get_headers($https_url,1,443);
jestem pewien, że będzie działać, chociaż nie jest w standardowejget_headers()
funkcji. Zapraszam do przetestowania i nadania statusu.Za pomocą kodu stragera możesz również sprawdzić CURLINFO_HTTP_CODE pod kątem innych kodów. Niektóre witryny nie zgłaszają błędu 404, a raczej po prostu przekierowują na niestandardową stronę 404 i zwracają 302 (przekierowanie) lub coś podobnego. Użyłem tego do sprawdzenia, czy rzeczywisty plik (np. Robots.txt) istnieje na serwerze, czy nie. Oczywiście ten rodzaj pliku nie spowodowałby przekierowania, gdyby istniał, ale gdyby nie, przekierowałby do strony 404, która, jak powiedziałem wcześniej, może nie mieć kodu 404.
źródło
408 Request Timeout
, a nie404
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, FALSE);
Jak sugeruje strager, przyjrzyj się używaniu cURL. Możesz również być zainteresowany ustawieniem CURLOPT_NOBODY za pomocą curl_setopt, aby pomijał pobieranie całej strony (chcesz tylko nagłówków).
źródło
Jeśli szukasz najłatwiejszego rozwiązania i tego, które możesz wypróbować za jednym razem, php5 zrób
źródło
Znalazłem tę odpowiedź tutaj :
Zasadniczo do pobierania adresu URL służy metoda „pobierz zawartość pliku”, która automatycznie wypełnia zmienną nagłówka odpowiedzi http kodem stanu.
źródło
To da ci prawdę, jeśli url nie zwraca 200 OK
źródło
addendum; przetestowałem te 3 metody pod kątem wydajności.
Wynik, przynajmniej w moim środowisku testowym:
Curl wygrywa
Ten test jest wykonywany z uwzględnieniem, że potrzebne są tylko nagłówki (noBody). Sprawdź się:
źródło
Jako dodatkowa wskazówka do świetnie przyjętej odpowiedzi:
Podczas korzystania z odmiany proponowanego rozwiązania otrzymałem błędy z powodu ustawienia php „max_execution_time”. Oto co zrobiłem:
Najpierw ustawiłem limit czasu na większą liczbę sekund, na koniec ustawiłem go z powrotem na wartość zdefiniowaną w ustawieniach php.
źródło
źródło
Oto krótkie rozwiązanie.
W twoim przypadku możesz zmienić
application/rdf+xml
to, czego używasz.źródło
Ta funkcja zwraca kod stanu adresu URL w PHP 7:
Przykład:
źródło
Możesz również użyć tego kodu, aby zobaczyć stan dowolnego linku:
źródło
to tylko kawałek kodu, nadzieja działa dla Ciebie
źródło
Oto sposób!
Ten prosty skrypt po prostu wysyła żądanie do adresu URL w celu uzyskania kodu źródłowego. Jeśli żądanie zakończy się pomyślnie, wyświetli komunikat „URL istnieje!”. Jeśli nie, wyświetli komunikat „URL nie istnieje!”.
źródło