2016-03-23 8 views
0

Ich versuche, einen Code zu schreiben, der den HTML-Code von einer Website erhält, die der Benutzer eingibt. Ich muss dies schreiben, ohne urllib oder andere Bibliotheken dieser Art zu verwenden.Python HTTP GET. "Falsche Anfrage"

from socket import * 


url = (input("Please enter url: ")) 
host=gethostbyname(url) 

clientSocket = socket(AF_INET, SOCK_STREAM) 
clientSocket.connect((host,80)) 

clientSocket.send(("GET " + host + "HTTP/1.1\n\n").encode("UTF-8")) 

file = clientSocket.recv(1024) 
print("The html code: ", file.decode("UTF-8")) 
clientSocket.close() 

Der Code läuft gut. Allerdings, wenn ich Eingabe eine Website wie „www.stackoverflow.com“ Ich habe eine „schlechte Anfrage“ Antwort vom Host erhalten:

The html code: HTTP/1.1 400 Bad Request 

Date: Wed, 23 Mar 2016 16:14:27 GMT 

Content-Type: text/html 

Content-Length: 177 

Connection: close 

Server: -nginx 

CF-RAY: - 



<html> 

<head><title>400 Bad Request</title></head> 

<body bgcolor="white"> 

<center><h1>400 Bad Request</h1></center> 

<hr><center>cloudflare-nginx</center> 

</body> 

</html> 

Was die richtige Anfrage, um den tatsächlichen HTML-Code wäre zu bekommen aus der Server. Danke

Antwort

1

Ein Hostname ist kein URL. Ihr Skript scheint nur nach einem Hostnamen zu fragen, da Sie gethostbyname() verwenden. Die Anforderung GET erwartet, dass ein URI für das erste Argument angezeigt wird. Sie müssen außerdem Zeilenumbrüche mit Ihren Zeilenvorschüben senden, und Sie benötigen zwei, um die GET-Anfrage zu beenden. Sie sollten so etwas wie:

clientSocket.send(("GET/HTTP/1.1\r\n\r\n").encode("UTF-8")) 

Auch wenn alles, was Sie tun möchten, ist eine URL herunterladen, eine Bibliothek wie urllib2 verwenden, die Sorge für alle HTTP-Protokoll Details für Sie nimmt. Zum Beispiel:

0

Sie sprechen nicht HTTP/1.1, aber Sie sagen so in der ersten Zeile.

Zu allererst das Token folgenden GET muss ein absoluter Pfad auf dem Server sein; Beginnen Sie also mit /.

Zweitens muss eine HTTP/1.1 Anfrage die Host: Header enthalten.

Und drittens Ihre einfache Client sollte wohl sagen Connection: close da sie nicht gestückelt Verbindungen verarbeiten.


könnten Sie haben mehr Erfolg mit dem folgenden Skript:

from socket import * 

host = gethostbyname('stackoverflow.com') 
clientSocket = socket(AF_INET, SOCK_STREAM) 
clientSocket.connect((host,80)) 
clientSocket.send((
    "GET/HTTP/1.1\r\n" 
    "Host: stackoverflow.com\r\n" 
    "Connection: close\r\n\r\n").encode('utf-8')) 

file = clientSocket.recv(1024) 
print("The html code: ", file.decode("UTF-8")) 
clientSocket.close() 
+0

Thank you! Mein Professor verlangt jedoch, dass der Benutzer die URL eingibt, anstatt dass ich sie dort habe. Dies ist der Punkt, an dem ich Probleme habe, weil verschiedene Seiten unterschiedliche Pfade haben und ich nicht wissen würde, wie man sie verallgemeinern könnte. – JulianP

+0

dann verwenden Sie "URL parse", um es zu Komponenten –

+0

zu entschuldigen, meine Ignoranz, aber ich bin mir nicht sicher, wie man das macht. Ich bin nur im Intro zum Networking und mein Professor ist nicht sehr hilfreich. Alles, was ich bis jetzt gemacht habe, habe ich durch meine eigenen Recherchen bekommen, aber ich fühle mich wie in einer Straßensperre, weil ich nicht viel weiß. – JulianP