2015-05-18 4 views
1

Попытки получить эту конкретную страницу ...Конкретная строка в питоне requests.get дает ValueError

request = requests.get('http://market.yandex.ru/catalog/90555/list') 

... дает мне странную ошибку:

ValueError        Traceback (most recent call last) 
    C:\Python34\lib\site-packages\requests\packages\urllib3\response.py in read_chunked(self, amt) 
    406     try: 
--> 407      self.chunk_left = int(line, 16) 
    408     except ValueError: 

ValueError: invalid literal for int() with base 16: '' 

я понял, что какая-то часть строка виновата. Я экспериментировал с ним, и результаты были еще более странными:

# No error 
http://market.ru/catalog/90555/list 
http://market.yandex.ru/catalo 

# Error 
http://market.yandex.ru/catalog 

P.S. Кстати, проблема возникла сегодня. Совсем недавно у меня не было проблем с получением этой самой страницы (с использованием того же метода).

+0

Вы 100% уверены, что вы не работаете с более старой версией библиотеки? Возможно, вы обновили и забыли перезапустить? Исходный код в трассировке подсказывает, что исключение должно быть захвачено вместо этого. –

+0

@MartijnPieters, у меня была аналогичная проблема, когда я открыл страницу в своем браузере, он попросил заполнить капчу с сообщением ниже –

+1

@PadraicCunningham: но не такая же трассировка. Мне удалось загрузить страницу просто отлично в 'запросах', но если бы они внедрили ограничение скорости, которое прямо нарушает прерванные ожидания кодирования передачи, тогда библиотека' urllib3' поднимет здесь исключение 'IncompleteRead'. Исключение 'ValueError' исключает возможность не быть пойманным. –

ответ

1

Вы ограничены в скорости, но сервер делает это так, что это нарушает спецификацию HTTP. Их ответные заголовки обещают кодировку передачи Chunked, а затем не отправляйте такой ответ.

Если вы посмотрите на URL с curl в расширенном режиме, вы получите следующий результат:

$ curl -v https://market.yandex.ru/catalog/90555/list 
* Hostname was NOT found in DNS cache 
* Trying 213.180.204.22... 
* Connected to market.yandex.ru (213.180.204.22) port 443 (#0) 
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 
* Server certificate: market.yandex.ru 
* Server certificate: Certum Level IV CA 
* Server certificate: Certum CA 
> GET /catalog/90555/list HTTP/1.1 
> User-Agent: curl/7.37.1 
> Host: market.yandex.ru 
> Accept: */* 
> 
< HTTP/1.1 302 Found 
* Server nginx is not blacklisted 
< Server: nginx 
< Date: Mon, 18 May 2015 18:53:15 GMT 
< Content-Type: text/html; charset=UTF-8 
< Transfer-Encoding: chunked 
< Connection: keep-alive 
< Keep-Alive: timeout=120 
< X-Forwardtouser-Y: 1 
< Set-Cookie: spravka=dD0xNDAwNDM5MTk1O2k9ODQuOTIuOTguMTcwO3U9MTQwMDQzOTE5NTUxNjUwOTExMjtoPWNkMzVlMzBlMjgxMTg4YWM0YjYyZDg3OTg4ZjUyNWFj; domain=.yandex.ru; path=/; expires=Wed, 17-Jun-2015 18:53:15 GMT 
< Location: http://market.yandex.ru/showcaptcha?cc=1&retpath=http%3A//market.yandex.ru/catalog/90555/list%3F_bfd13d35fbf1551a835f050d3775fc4b&t=0/1431975195/029660aeb063916c78e30ebd9444fd4b&s=4dd645e7048b399008278208fa776ba9 
< Set-Cookie: uid=CniLolVaNRthdR2JDtV0Ag==; path=/ 
< 
* transfer closed with outstanding read data remaining 
* Closing connection 0 
curl: (18) transfer closed with outstanding read data remaining 

Направляем Вам перенаправлять, но Transfer-Encoding: chunked заголовок в ответ означает, что на стороне клиента приходится загружать куски, которых там нет.

Перенаправление приводит к искаженным:

http://market.yandex.ru/showcaptcha?cc=1&retpath=http%3A//market.yandex.ru/catalog/90555/list%3F_bfd13d35fbf1551a835f050d3775fc4b&t=0/1431975195/029660aeb063916c78e30ebd9444fd4b&s=4dd645e7048b399008278208fa776ba9 
#      ^^^^^^^^^^^ 
Смежные вопросы