2015-12-23 2 views
0

У меня есть проблема здесь:Python смерч AsyncHTTPClient хвостового плавника

import tornado.httpclient 
from tornado.httpclient import AsyncHTTPClient 
AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient") 

# inside a function 
client = AsyncHTTPClient() 
result = yield client.fetch('http://some-site.com/#hash?&key=value', raise_error=False) 
print(result.effective_url) # prints: http://some.site/some/path/ 

Заметьте, что ключевые ценности идут после того, как хэш. Некоторый сайт, который я царапаю, перенаправляет. Если я прокомментирую «AsyncHTTPClient.configure (« tornado.curl_httpclient.CurlAsyncHTTPClient »),« все работает нормально, но я не могу использовать прокси для пересечения и просмотра обменов HTTP. И с этой линией персонал после хеша исчезает ... Может ли кто-нибудь сказать мне, почему?

ответ

0

Вы хотите передать #fragment часть. Он используется браузерами для навигации по якорям на маршрутизации на странице или на стороне клиента (подробнее rfc3985 3.5).

Фрагмент не отправляется на сервер через браузер. Также libcurl не посылает фрагмент части, as doc says:

Хотя пространство не является типично «легальным» письмом, Libcurl принимает их. Когда пользователь хочет передать символ «#» (хеш), он будет обработан в виде фрагмента и обрезаться libcurl, если он предоставлен буквально. Вам вместо этого нужно избежать его, предоставив его как обратную косую черту и его значение ASCII в шестнадцатеричном формате: «\ 23».

Вы могли бы заменить # с %23, а также, но сервер должен знать, как справиться с этим, скорее всего, это не так как это часть обрабатывается браузером.

+0

Моя ссылка выглядит следующим образом (изменено:. И | потому что иначе этот форум не показывает): HTTP | // нам рынок | OpenX | ком/# готовы и oauth_token = 89eed5b7f568702616037623817362a471c7ddbbb8df19772708103e521261d5776d0a0f07f7ca149ca6c30205ab5792f0eccc207cf77147517509bc8f5fe57f0567a8c4d & oauth_verifier = 5e2a2f7c9b Персонал после # это важный. Если я использую «AsyncHTTPClient.configure (« tornado.curl_httpclient.CurlAsyncHTTPClient »),« мой выборщик прерывает перерывы, даже если я заменю «#» на «% 23». Ссылки связаны с перенаправлением (302) в заголовке «Местоположение». – user2626972

+0

Персонал после '#' для вас не важен, потому что целевой сервер его не поймет. Auth обрабатывается с помощью javascript в браузере (файл 'http: // us-market.openx.com/js/build/ox3.min.js'). Вы должны найти другой способ аутентификации с помощью openx oauth - у них есть несколько документов http://docs.openx.com/api/#api_authentication.html. Если вы не хотите использовать официальный API (не рекомендуется) и скребковый сайт, я бы использовал http://phantomjs.org/, но он находится в js - node.js – kwarunek

+0

Да, просто выглядит, как работает FireFox, t отправить персонал после #. Я не знаю, почему он работает только с CurlAsyncHTTPClient ... – user2626972

0

Все после # называется «фрагментом», и оно обычно не отправляется на сервер. Вместо этого он доступен для использования браузером и javascript. На уровне HTTP http://some-site.com/#hash?&key=value эквивалентен http://some-site.com/. AsyncHTTPClient должен удалять фрагмент, если вы используете завиток или нет; разница, которую вы видите здесь, вероятно, является ошибкой.

Смежные вопросы