it-swarm.com.de

Python prüfen, ob eine Website existiert

Ich wollte überprüfen, ob eine bestimmte Website existiert. Dies ist, was ich mache:

user_agent = 'Mozilla/20.0.1 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent':user_agent }
link = "http://www.abc.com"
req = urllib2.Request(link, headers = headers)
page = urllib2.urlopen(req).read() - ERROR 402 generated here!

Wenn die Seite nicht existiert (Fehler 402 oder was auch immer andere Fehler), was kann ich in der Zeile page = ... tun, um sicherzustellen, dass die gerade gelesene Seite beendet wird?

45
James Hallen

Sie können HEAD anstelle von GET verwenden. Es wird nur der Header heruntergeladen, nicht jedoch der Inhalt. Dann können Sie den Antwortstatus in den Kopfzeilen überprüfen.

import httplib
c = httplib.HTTPConnection('www.example.com')
c.request("HEAD", '')
if c.getresponse().status == 200:
   print('web site exists')

oder Sie können urllib2 verwenden

import urllib2
try:
    urllib2.urlopen('http://www.example.com/some_page')
except urllib2.HTTPError, e:
    print(e.code)
except urllib2.URLError, e:
    print(e.args)

oder Sie können requests verwenden

import requests
request = requests.get('http://www.example.com')
if request.status_code == 200:
    print('Web site exists')
else:
    print('Web site does not exist') 
84
Adem Öztaş

Es ist besser zu prüfen, ob der Statuscode <400 ist, als wäre es hier . Was bedeuten Statuscodes (aus wikipedia ):

  • 1xx - informativ
  • 2xx - erfolg
  • 3xx - Weiterleitung
  • 4xx - Clientfehler
  • 5xx - Serverfehler

Wenn Sie prüfen möchten, ob die Seite vorhanden ist und nicht die gesamte Seite herunterladen möchte, sollten Sie Head Request verwenden:

import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert int(resp[0]['status']) < 400

genommen von dieser Antwort .

Wenn Sie die gesamte Seite herunterladen möchten, stellen Sie einfach eine normale Anfrage und überprüfen Sie den Statuscode. Beispiel mit request :

import requests

response = requests.get('http://google.com')
assert response.status_code < 400

Siehe auch ähnliche Themen:

Hoffentlich hilft das.

32
alecxe
from urllib2 import Request, urlopen, HTTPError, URLError

user_agent = 'Mozilla/20.0.1 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent':user_agent }
link = "http://www.abc.com/"
req = Request(link, headers = headers)
try:
        page_open = urlopen(req)
except HTTPError, e:
        print e.code
except URLError, e:
        print e.reason
else:
        print 'ok'

Um den Kommentar von unutbu zu beantworten:

Da die Standard-Handler Weiterleitungen (Codes im Bereich von 300) und Codes im Bereich von 100 bis 299 für Erfolg verwenden, werden normalerweise nur Fehlercodes im Bereich von 400 bis 599 angezeigt. Quelle

8
keas

code:

a="http://www.example.com"
try:    
    print urllib.urlopen(a)
except:
    print a+"  site does not exist"
4
Raj

Es gibt eine ausgezeichnete Antwort von @Adem Öztaş für die Verwendung mit httplib und urllib2. Wenn es sich bei requests ausschließlich um die Existenz von Ressourcen handelt, kann die Antwort im Fall einer großen Existenz von Ressourcen verbessert werden.

Die vorherige Antwort für requests schlug ungefähr Folgendes vor:

def uri_exists_get(uri: str) -> bool:
    try:
        response = requests.get(uri)
        try:
            response.raise_for_status()
            return True
        except requests.exceptions.HTTPError:
            return False
    except requests.exceptions.ConnectionError:
        return False

requests.get versucht, die gesamte Ressource auf einmal abzurufen. Bei großen Mediendateien würde das obige Snippet daher versuchen, die gesamten Medien in den Speicher zu ziehen. Um dies zu lösen, können wir die Antwort streamen.

def uri_exists_stream(uri: str) -> bool:
    try:
        with requests.get(uri, stream=True) as response:
            try:
                response.raise_for_status()
                return True
            except requests.exceptions.HTTPError:
                return False
    except requests.exceptions.ConnectionError:
        return False

Ich habe die obigen Snippets mit angehängten Timern für zwei Webressourcen ausgeführt:

1) http://bbb3d.renderfarming.net/download.html , eine sehr leichte HTML-Seite

2) http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4 , eine Videodatei mit angemessener Größe

Timing-Ergebnisse unten:

uri_exists_get("http://bbb3d.renderfarming.net/download.html")
# Completed in: 0:00:00.611239

uri_exists_stream("http://bbb3d.renderfarming.net/download.html")
# Completed in: 0:00:00.000007

uri_exists_get("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4")
# Completed in: 0:01:12.813224

uri_exists_stream("http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4")
# Completed in: 0:00:00.000007

Als letzte Anmerkung: Diese Funktion funktioniert auch für den Fall, dass der Ressourcen-Host nicht existiert. Beispielsweise "http://abcdefghblahblah.com/test.mp4" gibt False zurück.

3
Maxfield

Probier diese:: 

import urllib2  
website='https://www.allyourmusic.com'  
try:  
    response = urllib2.urlopen(website)  
    if response.code==200:  
        print("site exists!")  
    else:  
        print("site doesn't exists!")  
except urllib2.HTTPError, e:  
    print(e.code)  
except urllib2.URLError, e:  
    print(e.args)  
0
Vishal
def isok(mypath):
    try:
        thepage = urllib.request.urlopen(mypath)
    except HTTPError as e:
        return 0
    except URLError as e:
        return 0
    else:
        return 1
0
DiegoPacheco