Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 14, 2014 16:36:49

Egor2010
Зарегистрирован: 2014-10-22
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокет http

<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.ru/?gfe_rd=cr&amp;ei=rK5kVL_fCdeCtAHs8YDwAg">here</A>.
</BODY></HTML>
Сайт Google.ru/
Это не код главной страницы Гугла !

Офлайн

#2 Ноя. 14, 2014 17:18:22

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Сокет http

Конечно нет. Вы видимо ввели google.ru/ вместо www.google.ru/ и вас перенаправали (302). Для того и существует header, чтобы смотреть параметры и в зависимости от них выполнять дальнейшие действия.

Офлайн

#3 Ноя. 14, 2014 17:37:12

Egor2010
Зарегистрирован: 2014-10-22
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокет http

Походу в этом проблема и была! Спасибо большое!!

Офлайн

#4 Ноя. 15, 2014 14:45:02

Egor2010
Зарегистрирован: 2014-10-22
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокет http

Как-то странно работает !
www.google.ru/ -работает
www.google.com/ -не работает 302 error
Что надо исправить чтобы все работало?

Отредактировано Egor2010 (Ноя. 15, 2014 14:48:18)

Офлайн

#5 Ноя. 15, 2014 15:47:48

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Сокет http

А как вы думаете переходит по адресу обычный браузер? Он получает заголовок, смотрит поля. Если, например, получает 302, то ищет куда его перенаправили в поле Location, берет оттуда адрес и переходит уже по нему. А если видит 200 OK, то тогда качает всю страницу. Я вам привел схематичный пример get-запроса, разберите его, там все видно- где получает заголовок, где остальной контент, что и как. И сделайте под свои нужды.

Офлайн

#6 Ноя. 15, 2014 17:38:00

Egor2010
Зарегистрирован: 2014-10-22
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокет http

dimy44
А как вы думаете переходит по адресу обычный браузер? Он получает заголовок, смотрит поля. Если, например, получает 302, то ищет куда его перенаправили в поле Location, берет оттуда адрес и переходит уже по нему. А если видит 200 OK, то тогда качает всю страницу. Я вам привел схематичный пример get-запроса, разберите его, там все видно- где получает заголовок, где остальной контент, что и как. И сделайте под свои нужды.
То есть надо сделать так чтобы он если 302 смотрел location брал оттуда ссылку и все повторял? А в модуле urllib.urlopen такое же устройство?
А вот еще вопрос в адресе нельзя писать http или https почему вить так правильно? Там порты надо менять при https?

Офлайн

#7 Ноя. 15, 2014 20:12:24

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Сокет http

Ну не именно 302, 3хх это все перенаправление. Вот пример

# -*- coding: utf-8 -*-
import socket
def load_page(url):
    while True:
        if url.find('://') != -1:
            url = url.split('://')[1]
        if not url.endswith('/'):
            url = '{0}/'.format(url)
        host, url = url.split('/', 1)
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
        try:
            client.connect((socket.gethostbyname(host), 80))
            print('ok connect')
        except Exception, err: # if python 3: except Exception as err:
            print(err)
            return
        header = ''
        client.send('GET /{0} HTTP/1.0\r\nHost: {1}\r\nUser-agent: Python\r\n\r\n'.format(url, host))
        while True: # header
            header += client.recv(32)
            if '\r\n\r\n' in header:
                break
        header, content = header.split('\r\n\r\n', 1)
        header_list = header.split('\r\n')
        http, status = header_list.pop(0).split(None, 1)
        header = {}
        for t in header_list:
            a, b = t.split(':', 1)
            header[a.upper()] = b.lstrip()
        if status.startswith('3'):
            url = header['LOCATION']
            print('moved, location: {0}'.format(header['LOCATION']))
            continue
        elif not status.startswith('2'):
            print('Oops, {0}'.format(status))
        break
    #print(header)
    size = header.get('CONTENT-LENGTH')
    if size and size.isdigit():
        size = int(size)
    else:
        size = False
    while True:
        t = client.recv(2048)
        if not t:
            break
        content += t
        if not size:
            load_show = 'load {0} byte'.format(len(content))
        else:
            d = '{0:0.2f}'.format(len(content)*100.0/size)
            load_show = 'load {0}/{1} byte ({2}%)'.format(len(content), size, d)
        print(load_show)
    return content 
  
if __name__=='__main__':
    page = load_page('python.ru')
   # print(page)
  
Насчет http- там и указывается номер порта 80, как с другими я хз

Офлайн

#8 Ноя. 16, 2014 06:46:14

Egor2010
Зарегистрирован: 2014-10-22
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокет http

А в urllib.urlopen тоже сначала открывается header если там 3** то перенаправляет на нужный адрес ?
(Спасибо
Если что https-443

Офлайн

#9 Ноя. 16, 2014 09:24:18

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Сокет http

У меня нет исходника urllib, не могу глянуть что он конкретно делает, но если глянуть заголовки (urllib.urlopen(site).headers), то видимо да, он делат эту черновую работу, заголовки приходят уже с “правильного” адреса

Офлайн

#10 Ноя. 16, 2014 09:58:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Сокет http

dimy44
У меня нет исходника urllib
/usr/lib/python3.3/urllib/request.py
Другое дело, что она не простая, а основана на build_opener().



Отредактировано py.user.next (Ноя. 16, 2014 09:59:17)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version