почему скрипту python не удается загрузить веб-страницы через прокси - PullRequest
1 голос
/ 09 августа 2011

Я новичок в Python и пытаюсь испытать удачу в сокетах. Поэтому я написал простой http-клиент, но, к моему удивлению, он не может получить доступ к веб-страницам, к которым может получить доступ firefox, хотя они используют одинаковые заголовки

import socket
clientsocket= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(("213.229.83.205",80))#connect to proxy at given address
print "connected to 213.229.83.205"
sdata= """GET http://google.co.ug/ HTTP/1.1
Host: google.co.ug
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Proxy-Connection: keep-alive
Cookie: cookie <-- Real cookie deleted

"""
print "sending request"
clientsocket.send(sdata);
rdata=clientsocket.recv(10240)
if not rdata: print "no data found"
else:
    print "receiving data !"
    myfile=open("c:/users/markdenis/desktop/google.html","w")
    myfile.write(str(rdata))
    myfile.close()
    print "data written to file on desktop"
clientsocket.close()
raw_input()#system(pause)

Когда я запускаю его, он показывает:

connected to 213.229.83.205
sending request
no data found

1 Ответ

5 голосов
/ 09 августа 2011

Для протокола HTTP требуется \r\n в конце каждого заголовка и дополнительный символ в пустой строке в конце заголовков HTTP.Вы не имеете явного представления об окончаниях строк в вашем буфере sdata, и поэтому ваш буфер заканчивается только окончаниями строк \n.

Проверено на Windows, Linux и OS X, чтобы убедиться:

>>> x = """a
b
c"""
>>> x
'a\\nb\\nc\\n'

Где вам нужно:

>>> x = "a\r\nb\r\nc\r\n"
>>> x
'a\\r\\nb\\r\\nc\\r\\n'

Добавьте \r\n s и дайтевыстрел.Делая это прямо в буфере, вы получите дополнительный набор \n, поэтому разделите его на:

sdata = "GET http://google.co.ug/ HTTP/1.1\r\n"
sdata += "Host: google.co.ug\r\n"
sdata += "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0\r\n"
sdata += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
sdata += "Accept-Language: en-us,en;q=0.5\r\n"
sdata += "Accept-Encoding: gzip, deflate\r\n"
sdata += "Proxy-Connection: keep-alive\r\n"
sdata += "\r\n"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...