Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

grab.error.GrabTooManyRedirectsError на ровном месте #293

Closed
InputError opened this issue Jan 25, 2018 · 4 comments
Closed
Labels

Comments

@InputError
Copy link

from grab import Grab
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

g = Grab(timeout=60, connect_timeout=15)

url = "https://jo.opens" \
      "ooq.com/ar/search/75376886/" \
      "%25D8%25A8%25D9%2583%25D8%25AC-%25D9%2585%25D9%2583%25D9%258A%25D8%25A7%25D8%25AC"

g.setup(debug=True)
g.setup(follow_location=True, follow_refresh=True)
g.setup(debug_post=True, debug=True, log_dir="./grab_log")

g.go(url)

Результат:

Traceback (most recent call last):
  File "C:/_test_bug.py", line 16, in <module>
    g.go(url)
  File "C:\Python35\lib\site-packages\grab\base.py", line 382, in go
    return self.request(url=url, **kwargs)
  File "C:\Python35\lib\site-packages\grab\base.py", line 476, in request
    raise error.GrabTooManyRedirectsError()
grab.error.GrabTooManyRedirectsError

В браузере обычном всё ок. Куда копать?

@InputError
Copy link
Author

Я кажется понял в чём дело, сайт через заголовки говорит нам идти сюда:
https://jo.opensooq.com/ar/search/75376886/بكج-مكياج
А граб кладёт болт на арабские цифры и вместо них втыкает тире и пробует
сделать переход. Сайт снова говорит мол иди на этот правильный урл, а граб
снова делает переход на урл с тире вместо арабских символов, и так по кругу.

То есть видимо что-то не так с кодировкой в грабе, он портит символы в урле.

Логи выглядят вот так, 01.log:

Request headers:
GET
/ar/search/75376886/%25D8%25A8%25D9%2583%25D8%25AC-%25D9%2585%25D9%2583%25D9%258A%25D8%25A7%25D8%25AC
HTTP/1.1
Host: jo.opensooq.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0)
Gecko/20100101 Firefox/50.0
Accept-Encoding: gzip
Keep-Alive: 300
Accept-Language: en-us,en;q=0.9
Accept-Charset: utf-8,windows-1251;q=0.7,*;q=0.7
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.4


Request body:


Response headers:
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 25 Jan 2018 03:25:07 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Connection: keep-alive
Set-Cookie: lbpath=02868df151d922b225754468fe68efdea8a8fc3f; Expires=Thu,
25-Jan-2018 04:55:07 GMT; Path=/; Secure; HttpOnly
Set-Cookie: PHPSESSID=vuvgc739cdrjpije9jgvvic0l3; expires=Tue, 24-Jul-2018
03:25:07 GMT; Max-Age=15552000; path=/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Location: https://jo.opensooq.com/ar/search/75376886/بكج-مكياج
Set-Cookie:
country=931d8ee595ad51b60b89c7f8b720971fea4a71df373a7dd0ab65988303355874a%3A2%3A%7Bi%3A0%3Bs%3A7%3A%22country%22%3Bi%3A1%3Bs%3A2%3A%22jo%22%3B%7D;
path=/; domain=opensooq.com; HttpOnly
Set-Cookie: cityId=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT;
Max-Age=0; path=/; HttpOnly
Vary: User-Agent
X-Backend-Server: 172.16.240.31:80

02.log:

Request headers:
GET /ar/search/75376886/- HTTP/1.1
Host: jo.opensooq.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0)
Gecko/20100101 Firefox/50.0
Accept-Encoding: gzip
Cookie: PHPSESSID=vuvgc739cdrjpije9jgvvic0l3;
lbpath=02868df151d922b225754468fe68efdea8a8fc3f;
country=931d8ee595ad51b60b89c7f8b720971fea4a71df373a7dd0ab65988303355874a%3A2%3A%7Bi%3A0%3Bs%3A7%3A%22country%22%3Bi%3A1%3Bs%3A2%3A%22jo%22%3B%7D
Accept-Charset: utf-8,windows-1251;q=0.7,*;q=0.7
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.4
Keep-Alive: 300
Accept-Language: en-us,en;q=0.9


Request body:


Response headers:
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 25 Jan 2018 03:25:07 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Location: https://jo.opensooq.com/ar/search/75376886/بكج-مكياج
Set-Cookie:
country=931d8ee595ad51b60b89c7f8b720971fea4a71df373a7dd0ab65988303355874a%3A2%3A%7Bi%3A0%3Bs%3A7%3A%22country%22%3Bi%3A1%3Bs%3A2%3A%22jo%22%3B%7D;
path=/; domain=opensooq.com; HttpOnly
Set-Cookie: cityId=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT;
Max-Age=0; path=/; HttpOnly
Vary: User-Agent
X-Backend-Server: 172.16.240.31:80

И далее все логи *.log после второго идут одинаковые. Логи *.html все
пустые.

Логи консоли вот так выглядят:

DEBUG:grab.network:[01] GET
https://jo.opensooq.com/ar/search/75376886/%25D8%25A8%25D9%2583%25D8%25AC-%25D9%2585%25D9%2583%25D9%258A%25D8%25A7%25D8%25AC
via 127.0.0.1:8090 proxy of type socks5
DEBUG:grab.network:[02] GET https://jo.opensooq.com/ar/search/75376886/-
via 127.0.0.1:8090 proxy of type socks5
DEBUG:grab.network:[03] GET https://jo.opensooq.com/ar/search/75376886/-
via 127.0.0.1:8090 proxy of type socks5
DEBUG:grab.network:[04] GET https://jo.opensooq.com/ar/search/75376886/-
via 127.0.0.1:8090 proxy of type socks5
DEBUG:grab.network:[05] GET https://jo.opensooq.com/ar/search/75376886/-
via 127.0.0.1:8090 proxy of type socks5

... и потом ошибка зацикленного редиректа grab.error.GrabTooManyRedirectsError

@InputError
Copy link
Author

InputError commented Jan 30, 2018

Проблема в том что граб когда парсит заголовки (когда редирект) вот в этом месте, то в случае когда заголовок вот такой:
Location: https://jo.opensooq.com/ar/search/75376886/بكج-مكياج

На выходе он в переменной url выдаёт вот это:
https://jo.opensooq.com/ar/search/75376886/-

То есть арабские символы превращаются в банальное "тире", сайт нас снова направляет на правильный заголовок, граб снова его портит и всё повторяется по кругу.

@lorien
Copy link
Owner

lorien commented Jan 30, 2018

Да я тоже сегодня глядел этот тикет и добрался до того места :) Дальше пока не глядел. Хотел сюда отписать но забыл потом. Суть в том, что тут вручную парсятся хедеры https://github.com/lorien/grab/blob/master/grab/document.py#L170 И граб игнорит любые не-ascii символы. Видимо, надо по-другому делать. В качестве быстрого фикса, можете попробовать заменить 'latin' на 'utf-8' в вашей локальной копии граба, но возможно тогда что-нить ещё отломается, не знаю.

@InputError
Copy link
Author

InputError commented Jan 31, 2018

@lorien

В качестве быстрого фикса, можете попробовать заменить 'latin' на 'utf-8' в вашей локальной копии граба, но возможно тогда что-нить ещё отломается, не знаю.

Большое спасибо за костыль! Мне его оказалось достаточно, теперь всё нормально работает. Вы примете этот багфикс в основную версию?

Возможно правильнее было бы парсить этот заголовок ответа и по нему определять кодировку:
Content-Type: text/html; charset=UTF-8

@lorien lorien added the bug label Apr 14, 2018
@lorien lorien closed this as completed in 18c0d35 May 5, 2018
lorien added a commit that referenced this issue May 5, 2018
Fix #293: processing non-latin chars in Location header
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants