urlfetch перенаправляется в бесконечный цикл в Python - PullRequest
3 голосов
/ 24 февраля 2012

Я пытаюсь загрузить URL, который перенаправляет на себя.Я предполагаю, что он загружает cookie и ищет его, но он никогда не видит его, поэтому существует бесконечный цикл запросов.

Я пробовал urllib2, urlfetch и httplib2.Нет работы.

Я попробовал это, хотя:

url = "http://www.cafebonappetit.com/menu/your-cafe/collins-cmc/cafes/details/50/collins-bistro"
thing = urllib2.HTTPRedirectHandler()
thing2 = urllib2.HTTPCookieProcessor()
opener = urllib2.build_opener(thing, thing2)
url = 'http://www.nytimes.com/2005/10/26/business/26fed.html?pagewanted=print'
page = opener.open(url)

Это работает в оболочке, но не в Google App Engine.В документации для urlfetch: http://code.google.com/appengine/docs/python/urlfetch/fetchfunction.html

в follow_redirects говорится: «Файлы cookie не обрабатываются при перенаправлении. Если требуется обработка cookie, установите для follow_redirects значение False и обрабатывайте файлы cookie и перенаправления вручную».

Я понятия не имею, как это сделать, и документация, похоже, тоже не дает никаких подсказок.

Я, черт возьми, погуглил эту проблему, и НИКАКИХ проблем, о которых сообщалось, таких как эта, не работает для моей проблемы.

1 Ответ

5 голосов
/ 24 февраля 2012

Еще немного объяснений. Рад, что, по крайней мере, объяснено поведение веб-сайта: ему нужен какой-то файл cookie, а если файл cookie не установлен, он перенаправляется на себя с заголовком настройки файла cookie. Вы, вероятно, должны прочитать о том, как работают куки; веб-сайт отправляет cookie с помощью заголовка Set-Cookie, и браузер должен вернуть его (с некоторыми изменениями) в заголовок Cookie. В Python есть библиотека для управления коллекциями файлов cookie, Cookielib, чтобы помочь вам в этом.

Лучше всего использовать нативный API urlfetch; его возвращаемый объект имеет объект заголовков, который является указанием, дающим все заголовки (например, заголовок Set-Cookie). Чтобы отправить определенные заголовки, используйте аргумент headers функции urlfetch.fetch (). Здесь вы будете использовать заголовок Cookie (но помните, что формат установленного вами заголовка Cookie не совпадает с форматом получаемого заголовка Set-Cookie - вот где появляется cookielib.

Удачи!

PS. Используя curl -v, легко увидеть, что сайт на самом деле отправляет три разных заголовка Set-Cookie. Вам, вероятно, придется иметь дело со всеми тремя.

...