2015-12-10 2 views
3

Из других сообщений на переполнение стека это должно работатьпитон сокет GET

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 

, но по какой-то причине просто виснет (в recv) и никогда не печатает. Я знаю, что запрос на www.cnn.com будет фрагментировать его данные, но я должен хотя бы прочитать что-то от recv, правильно?

p.s. Я знаю, что это не лучший способ сделать это, и что есть библиотека, например, httplib и urllib2, но я не могу использовать их для этого проекта (это для школы). Я должен использовать socket библиотеку

ответ

7

Вы забыли отправить пустую строку после строки запроса:

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

Кроме того, HTTP 1.1 Указывает, следует добавить поле Host заголовок как описано в Host section in the HTTP 1.1 RFC.

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

Попробуйте заменить эту строку:

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

с:

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

Кроме того, я думаю, вам нужно заменить s.close с s.close(), так как это функция.

4

Ваш код почти прав, но вам нужно отправить 2 \r\n последовательности, удовлетворяющие протоколу HTTP.

действительный запрос на GET будет выглядеть следующим образом (обратите внимание на 2 строки):

 
GET/HTTP/1.1 

Так что ваш код должен быть:

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

В дополнение к этому, существуют дополнительные заголовки, необходимые для действительного HTTP 1.1, например Host:. Вам необходимо добавить их к вашему запросу, примерно так:

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

''') 
+0

Это отвечает на мои вопросы и было первым, поэтому я думаю, что сделаю это правильно. Для других см. Также мой собственный ответ –

+0

@jamessmith: вы должны выбрать лучший ответ, а не первый ответ. Во всяком случае, я думаю, что Такис ​​ответил первым :) – mhawke

2

Извините, что не тратишь время каждого. Я только что нашел это решение here на переполнение стека (просто взял некоторыми доработками в моем поиске Google, чтобы найти)

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) 

И все ответы были правы, а о финале \r\n\r\n однако те вернулись 301 статусы. Кажется, это решение как-то следует за перенаправлением? В любом случае, эти решения работали для меня

+1

Этот код дает ответ 302. Он не следует за перенаправлением. Вам нужно обрабатывать перенаправления для школьного проекта? – mhawke

Смежные вопросы