Python следит за перенаправлениями, а затем загружает страницу? - PullRequest
21 голосов
/ 12 января 2012

У меня есть следующий скрипт Python, и он прекрасно работает.

import urllib2

url = 'http://abc.com' # write the url here

usock = urllib2.urlopen(url)
data = usock.read()
usock.close()

print data

однако некоторые URL, которые я даю, могут перенаправлять его 2 или более раз.Как я могу заставить Python ждать завершения перенаправления перед загрузкой данных.Например, при использовании приведенного выше кода с

http://www.google.com/search?hl=en&q=KEYWORD&btnI=1

, который является эквивалентом нажатия кнопки «мне повезло» в поиске Google, я получаю:

>>> url = 'http://www.google.com/search?hl=en&q=KEYWORD&btnI=1'
>>> usick = urllib2.urlopen(url)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open
    response = meth(req, response)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response
    'http', request, response, code, msg, hdrs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 438, in error
    return self._call_chain(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain
    result = func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 521, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
>>> 

Я пробовал (url,данные, тайм-аут), однако, я не уверен, что поместить туда.

РЕДАКТИРОВАТЬ: я на самом деле выяснил, если я не перенаправить и просто использовал заголовок первой ссылки, я могу получить местоположение следующего перенаправления ииспользуйте это в качестве моей последней ссылки

Ответы [ 3 ]

18 голосов
/ 12 января 2012

Возможно, вам лучше воспользоваться библиотекой запросов, в которой есть лучшие API для управления обработкой перенаправления:

http://docs.python -requests.org / ен / последний / пользователь / Быстрый старт / # Перенаправление-и-история

Запросы:

http://pypi.python.org/pypi/requests/ (замена urllib для людей)

2 голосов
/ 30 мая 2018

Используйте requests в качестве других состояний ответа, вот пример.Перенаправление будет в r.url.В приведенном ниже примере http перенаправлен на https

Для HEAD:

In [1]:     import requests
   ...:     r = requests.head('http://github.com', allow_redirects=True)
   ...:     r.url

Out[1]: 'https://github.com/'

Для GET:

In [1]:     import requests
   ...:     r = requests.get('http://github.com')
   ...:     r.url

Out[1]: 'https://github.com/'

Примечание для HEAD необходимоукажите allow_redirects, но если вы этого не сделаете, вы можете получить его в заголовках, но это не рекомендуется.

In [1]: import requests

In [2]: r = requests.head('http://github.com')

In [3]: r.headers.get('location')
Out[3]: 'https://github.com/'

Чтобы загрузить страницу вам понадобится GET, вы можетезатем перейдите на страницу, используя r.content

0 голосов
/ 12 января 2012

Вы обязательно должны сделать это таким образом?Как насчет использования чего-то вроде twill (http://twill.idyll.org/) - делает то, что вы хотите сделать очень легко (и это Python).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...