Форум сайта python.su
Здравствуйте, уважаемые, появился такой вопрос :
Имеется код вида
import socket
try:
sock = socket.create_connection(("http://www.google.com", 80)) #Хост не важен
sock.send("GET /\r\n\r\n")#Запрос в принципе тоже
a = sock.recv(4096)
print a
sock.shutdown(socket.SHUT_RD)
sock.send("GET /\r\n\r\n")
a = sock.recv(4096)
print u"="*80
print a
except Exception, e:
print e
Отредактировано (Апрель 17, 2010 13:39:58)
Офлайн
1. открыть соединение
2. отправить/получить данные
3. закрыть соединение
и так каждый раз
“sock.shutdown(socket.SHUT_RD)” - блокирует получение данных, поэтому и нельзя после данные получить
“a = sock.recv(4096)” - ответ приходит в первых байтах, поэтому не обязательно считвыать все 4кб
Офлайн
Спасибо за внимание, но такой вариант не проходит :(
Код :
#!/usr/bin/python
#-*-encoding:UTF-8-*-
import socket
try:
sock = socket.create_connection(("www.google.com.ua", 80)) #Хост не важен
sock.send("""GET / HTTP/1.1\r\n
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.51\r\n
Host: www.google.com.ua\r\n
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\n
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n
Cookie: PREF=ID=6157b92ce8fd499a:U=e51accf91bba456d:TM=1269161028:LM=1271000199:S=WuvNldjL6SRWBXju; NID=33=xWjV9B124AHy6KQNlrJ_w4Yvk6ctoo-bny7vRvFozxzzgbLiPg0pSMw_UFOlSSQ86T2n9S87Oew7PW-3pKE4ZppALSlMaWHVE8cspGS7Xtm81UhZ1qdoY8QXyhCZSRZC\r\n
Cookie2: $Version=1\r\n
Connection: Keep-Alive\r\n\r\n""")#Запрос в принципе тоже
a = sock.recv(12)
sock.close()
print a
except Exception, e:
print e
GET / HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.51
Host: www.google.com.ua
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Cookie: PREF=ID=6157b92ce8fd499a:U=e51accf91bba456d:TM=1269161028:LM=1271000199:S=WuvNldjL6SRWBXju; NID=33=xWjV9B124AHy6KQNlrJ_w4Yvk6ctoo-bny7vRvFozxzzgbLiPg0pSMw_UFOlSSQ86T2n9S87Oew7PW-3pKE4ZppALSlMaWHVE8cspGS7Xtm81UhZ1qdoY8QXyhCZSRZC
Cookie2: $Version=1
Connection: Keep-Alive
HTTP/1.1 302 Found
Location: http://www.google.com.ua/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=943232a91d5fab40:TM=1271529971:LM=1271529971:S=7f9AVyR0DM-pZK4X; expires=Mon, 16-Apr-2012 18:46:11 GMT; path=/; domain=.google.com
Set-Cookie: NID=33=MX6_P_RGDEfw86zwVrQ499K1lf74zl9vpFkxoDlutSm6IHqpXdiiUbLUqBE7DB7sIud-TWA08-xZtojhcnXEAApuz-jWEp7k2hSqBN1wvYoVjXb8n4QyHKMXD4sEUvo2; expires=Sun, 17-Oct-2010 18:46:11 GMT; path=/; domain=.google.com; HttpOnly
Date: Sat, 17 Apr 2010 18:46:11 GMT
Server: gws
Content-Length: 222
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.ua/">here</A>.
</BODY></HTML>
HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 1350
Date: Sat, 17 Apr 2010 18:46:11 GMT
Server: GFE/2.0
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>400 Bad Request</title>
<style><!--
body {font-family: arial,sans-serif}
div.nav {margin-top: 1ex}
div.nav A {font-size: 10pt; font-family: arial,sans-serif}
span.nav {font-size: 10pt; font-family: arial,sans-serif; font-weight: bold}
div.nav A,span.big {font-size: 12pt; color: #0000cc}
div.nav A {font-size: 10pt; color: black}
A.l:link {color: #6f6f6f}
A.u:link {color: green}
//--></style>
<script><!--
var rc=400;
//-->
</script>
</head>
<body text=#000000 bgcolor=#ffffff>
<table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td rowspan=3 width=1% nowrap>
<b><font face=times color=#0039b6 size=10>G</font><font face=times color=#c41200 size=10>o</font><font face=times color=#f3c518 size=10>o</font><font face=times color=#0039b6 size=10>g</font><font face=times color=#30a72f size=10>l</font><font face=times color=#c41200 size=10>e</font> </b>
<td> </td></tr>
<tr><td bgcolor="#3366cc"><font face=arial,sans-serif color="#ffffff"><b>Error</b></td></tr>
<tr><td> </td></tr></table>
<blockquote>
<H1>Bad Request</H1>
Your client has issued a malformed or illegal request.
<p>
</blockquote>
<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor="#3366cc"><img alt="" width=1 height=4></td></tr></table>
</body></html>
Офлайн
Ну используйте вместо GET - HEAD. Получите только заголовки.
Офлайн
diam123входящий пакет начинается с “HTTP/1.1 302 Found”, так что в данном случае 12 байт достаточно
Как видите, проходит не 12 байт, а много больше :(.
Офлайн
кстате тут 2 входящих ответа от сервера
Офлайн
PooHНасколько мне известно, HEAD запросы некорректно обрабатываются большинством веб-серверов и на запрос HEAD веб-сервер реагирует как на GET.
Ну используйте вместо GET - HEAD. Получите только заголовки.
o7412369815963Прочитать их - да, это не проблема. Проблема в том, как именно получить только их, без остального мусора, который приходит в комплекте )))
входящий пакет начинается с “HTTP/1.1 302 Found”, так что в данном случае 12 байт достаточно
o7412369815963Тоже заметил, походу гугл после редиректа не ожидает повторного запроса на получение страницы по этому редиректу, а сразу отдает страницу, на которую происходит редирект. Код видели сами - я повторного запроса не делал )).
кстате тут 2 входящих ответа от сервера
Отредактировано (Апрель 18, 2010 20:19:43)
Офлайн
diam123я уже выше ответил на этот вопрос.
Прочитать их - да, это не проблема. Проблема в том, как именно получить только их, без остального мусора, который приходит в комплекте )))
# coding: utf-8
import socket
HOST = 'google.com'
PORT = 80
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('GET /\r\n\r\n')
data = s.recv(12)
s.close()
print repr(data)
'HTTP/1.0 302'
diam123спорный вопрос
я повторного запроса не делал ))
Офлайн
o7412369815963Вы не на то смотрите ) Я программно тоже получаю только первых 12 байт, с этой стороны все нормально.
а вот исходник, все нормально работает.
o7412369815963Код я приводил выше, мне нету смысла играть с Вами в загадки.
спорный вопрос
Офлайн
А что вы этим добиться то хотите? Сервер вам на запрос все равно вывалит все содержимое. Только получать вы его будете дольше, потому как порезано будет на мелкие кусочки. Ну и где нибудь на роутере хорошо память под буфер съедите.
Офлайн