Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 2, 2008 07:33:44

ambler
От:
Зарегистрирован: 2007-08-15
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Socket'ы. Проблема.

Добрый день.

у меня есть задача взять “ресурс” по адресу: “server.ru/page1?query=123” через socket, пытался так:

socket.connect(('server.ru/page1?query=123',80))

результат: socket.gaierror: (-2, ‘Name or service not known’)
отсюда вопрос: как таки взять эту страницу через Socket? и возможно ли “это” впринципе, или нужно по другому?


и второй вопрос: есть под питон библиотека mechanize - эмулятор браузера, возможно ли в текущей сессии этого “браузера” сходить через socket на к.л. урл (чтоб не потерялась авторизация)?

п.с. и как вопще взять “файл” через сокет?
пробовал так:
socket.connect(('ya.ru', 80))
socket.recv(1024)
по идее должно придти часть страницы, а приходит пустая строка.



Офлайн

#2 Июнь 2, 2008 08:00:23

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Socket'ы. Проблема.

Заголовки HTTP нужно отправлять. Можно проще urllib.urlopen(url).read() А библиотека наверняка есть.



Офлайн

#3 Июнь 2, 2008 08:06:54

ambler
От:
Зарегистрирован: 2007-08-15
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Socket'ы. Проблема.

“urllib.urlopen(url).read()” - это полностью загрузка “страницы”,
socket - потому и нужен - что надо лиш чатсь страницы загрузить.

так как правильно взять “server.ru/page1?query=123” через socket? как и какие заголовки надо отправить и как получить документ?

что-то где-то недопонимаю….



Офлайн

#4 Июнь 2, 2008 08:12:54

ambler
От:
Зарегистрирован: 2007-08-15
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Socket'ы. Проблема.

или где читать по-русски? ;)



Офлайн

#5 Июнь 2, 2008 08:56:58

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Socket'ы. Проблема.

Если хочешь работать именно с сокеми - читай спецификацию HTTP протокола (RFC2616 должно хватить), необязательно всю конечно.
После подключения к серверу (“server.ru”, а не “server.ru/page1?query=123”) ты должен послать запрос (GET или POST, а может и HEAD) на получение ресурса “/page1?query=123”, тогда сервер вернет страницу (или что-там тебе нужно). Только сервер вернет все сразу (скорее всего), а не несколькими пакетами TCP, если ресурс небольшой.

Уточни вопрос. Почему ты не можешь сделать .read(1024) ?

HTTP позволяет запросить у сервера часть ресурса, т.е. не с начала и не до конца. Правда не всегда эта фича реализуется самими серверами, для страниц наверняка не реализуется. Если ресурс большой и ты просто хочешь сэкономить трафик, а сервер может отдавать ресурс по частям, использую urllib2 ты запросить нужную тебе часть (протокол все же придется почитать), это всяко разно проще, чем пользовать сокеты непосредственно.

Вот пример использования urllib2 для получения части ресурса:

>>> import urllib2
>>> url = 'http://www.handsdriver.net/files/alice-girl.png'  # это ресурс на моем сайте, весом 700Kb
>>> request = urllib2.Request(url, headers = {'range': 'bytes=0-99'})  # здесь я формирую запрос с необходимым мне заголовком range
>>> resource = urllib2.urlopen(request)  # отправляю запрос
>>> resource.headers.dict  # смотрю, какие заголовки есть в ответе сервера
{'content-length': '100', 'accept-ranges': 'bytes', 'content-range': 'bytes 0-99/728501', 'server': 'nginx/0.4.2', 'last-modified': 'Fri, 22 Sep 2006 22:31:00 GMT', 'connection': 'close', 'date': 'Mon, 02 Jun 2008 06:06:04 GMT', 'content-type': 'image/png'}
>>> len(resource.read())  # смотрю на размер полученного контента
100

Обрати внимание на то, какие заголовки возвращаются: accept-ranges, content-range, content-length
Такой же запрос к главной странице сайта не пройдет, т.е. контент будет возвращен полностью, а не только запрошенная часть. И заголовков accept-ranges и content-range ты уже не увидешь.

..bw



Отредактировано (Июнь 2, 2008 09:41:36)

Офлайн

#6 Июнь 2, 2008 09:00:53

ambler
От:
Зарегистрирован: 2007-08-15
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Socket'ы. Проблема.

спасибо, не знал про read(1024).
Буду в этом направлении думать, т.к. мне больше подходит - исходная сессия не нарушатся



Офлайн

#7 Июнь 21, 2008 04:55:27

ambler
От:
Зарегистрирован: 2007-08-15
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Socket'ы. Проблема.

в продолжнение - такой вопрос:

по “команде” urllib2.urlopen('link_to_page') что происходит? открывается только соединение к странице без её загрузки, или же она (страница) полностью загружается?

если страница загружается - то .read(1024) - не спасет от трафика…. :(

просто есть “задача” сграбить “кое что”…. так вот это “кое-что” - 100000 страниц по 20кб каждая… а от каждой страницы надо только 30% содержимого… экономия трафика существенная может быть :)



Офлайн

#8 Июнь 21, 2008 09:48:57

AlexKiriukha
От:
Зарегистрирован: 2008-02-03
Сообщения: 81
Репутация: +  0  -
Профиль   Отправить e-mail  

Socket'ы. Проблема.

Может немного не в тему, но что происходит в сети очень хорошо смотреть через http://www.wireshark.org/
Если последить как и что, то можно найти ответы на многие вопросы, хотя нужно представлять протокол хотябы в общем.



Офлайн

#9 Июнь 21, 2008 12:11:32

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Socket'ы. Проблема.

ambler
read(1024) спасет от трафика =)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version