Форум сайта python.su
0
<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&ei=rK5kVL_fCdeCtAHs8YDwAg">here</A>.
</BODY></HTML>
Офлайн
Конечно нет. Вы видимо ввели google.ru/ вместо www.google.ru/ и вас перенаправали (302). Для того и существует header, чтобы смотреть параметры и в зависимости от них выполнять дальнейшие действия.
Офлайн
0
Походу в этом проблема и была! Спасибо большое!!
Офлайн
0
Как-то странно работает !
www.google.ru/ -работает
www.google.com/ -не работает 302 error
Что надо исправить чтобы все работало?
Отредактировано Egor2010 (Ноя. 15, 2014 14:48:18)
Офлайн
А как вы думаете переходит по адресу обычный браузер? Он получает заголовок, смотрит поля. Если, например, получает 302, то ищет куда его перенаправили в поле Location, берет оттуда адрес и переходит уже по нему. А если видит 200 OK, то тогда качает всю страницу. Я вам привел схематичный пример get-запроса, разберите его, там все видно- где получает заголовок, где остальной контент, что и как. И сделайте под свои нужды.
Офлайн
0
dimy44То есть надо сделать так чтобы он если 302 смотрел location брал оттуда ссылку и все повторял? А в модуле urllib.urlopen такое же устройство?
А как вы думаете переходит по адресу обычный браузер? Он получает заголовок, смотрит поля. Если, например, получает 302, то ищет куда его перенаправили в поле Location, берет оттуда адрес и переходит уже по нему. А если видит 200 OK, то тогда качает всю страницу. Я вам привел схематичный пример get-запроса, разберите его, там все видно- где получает заголовок, где остальной контент, что и как. И сделайте под свои нужды.
Офлайн
Ну не именно 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)
Офлайн
0
А в urllib.urlopen тоже сначала открывается header если там 3** то перенаправляет на нужный адрес ?
(Спасибо
Если что https-443
Офлайн
У меня нет исходника urllib, не могу глянуть что он конкретно делает, но если глянуть заголовки (urllib.urlopen(site).headers), то видимо да, он делат эту черновую работу, заголовки приходят уже с “правильного” адреса
Офлайн
857
dimy44/usr/lib/python3.3/urllib/request.py
У меня нет исходника urllib
Отредактировано py.user.next (Ноя. 16, 2014 09:59:17)
Офлайн