toma de python GET

De los otros mensajes en el desbordamiento de stack esto debería estar funcionando

import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.cnn.com" , 80)) s.sendall("GET / HTTP/1.1\r\n") print s.recv(4096) s.close 

pero por alguna razón simplemente se cuelga (en recv ) y nunca se imprime. Sé que una solicitud a www.cnn.com fragmentará sus datos, pero al menos debería leer algo de recv , ¿verdad?

PD: Sé que esta no es la mejor manera de hacerlo y que existen bibliotecas como httplib y urllib2 , pero no puedo usarlas para este proyecto (es para la escuela). Tengo que usar la librería socket

Olvidó enviar una línea en blanco después de su línea de solicitud:

 s.sendall("GET / HTTP/1.1\r\n\r\n") 

Además, HTTP 1.1 especifica que debe agregar el campo de encabezado de Host como se documenta en la sección de Host en el RFC de HTTP 1.1 .

 s.sendall("GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n") 

Su código es casi correcto, pero necesita enviar 2 \r\n secuencias para satisfacer el protocolo HTTP.

Una solicitud GET válida se verá así (nota 2 líneas):

 GET / HTTP / 1.1

Entonces tu código debería ser:

 s.sendall('GET / HTTP/1.1\r\n\r\n') 

Además, se requieren encabezados adicionales para las solicitudes HTTP 1.1 válidas, como Host: Necesita agregarlos a su solicitud, algo como esto:

 s.sendall('''GET / HTTP/1.1 Host: cnn.com ''') 

Lamento perder el tiempo de todos. Acabo de encontrar esta solución aquí en Stack Overflow (solo necesité una nueva redacción en mi búsqueda de Google para encontrar)

 import socket request = b"GET / HTTP/1.1\nHost: www.cnn.com\n\n" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("cnn.com", 80)) s.send(request) result = s.recv(10000) while (len(result) > 0): print(result) result = s.recv(10000) 

Y todas las respuestas también tenían razón sobre el final \r\n\r\n sin embargo, esos devolvieron 301 estados. Esta solución parece seguir el redireccionamiento de alguna manera? De todas formas, estas soluciones me funcionaron.

Intenta reemplazar esta línea:

 s.sendall("GET / HTTP/1.1\r\n") 

con:

 s.sendall("GET / HTTP/1.1\r\n\r\n") ^^^^ 

Además, creo que necesita reemplazarse en el s.close con el s.close() ya que es una función.