Форум сайта python.su
Добрый день.
у меня есть задача взять “ресурс” по адресу: “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)
по идее должно придти часть страницы, а приходит пустая строка.
Офлайн
Заголовки HTTP нужно отправлять. Можно проще urllib.urlopen(url).read() А библиотека наверняка есть.
Офлайн
“urllib.urlopen(url).read()” - это полностью загрузка “страницы”,
socket - потому и нужен - что надо лиш чатсь страницы загрузить.
так как правильно взять “server.ru/page1?query=123” через 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
Отредактировано (Июнь 2, 2008 09:41:36)
Офлайн
спасибо, не знал про read(1024).
Буду в этом направлении думать, т.к. мне больше подходит - исходная сессия не нарушатся
Офлайн
в продолжнение - такой вопрос:
по “команде” urllib2.urlopen('link_to_page') что происходит? открывается только соединение к странице без её загрузки, или же она (страница) полностью загружается?
если страница загружается - то .read(1024) - не спасет от трафика…. :(
просто есть “задача” сграбить “кое что”…. так вот это “кое-что” - 100000 страниц по 20кб каждая… а от каждой страницы надо только 30% содержимого… экономия трафика существенная может быть :)
Офлайн
Может немного не в тему, но что происходит в сети очень хорошо смотреть через http://www.wireshark.org/
Если последить как и что, то можно найти ответы на многие вопросы, хотя нужно представлять протокол хотябы в общем.
Офлайн
ambler
read(1024) спасет от трафика =)
Офлайн