it-roy-ru.com

Python следит за перенаправлениями, а затем загружает страницу?

У меня есть следующий скрипт 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, данные, время ожидания), однако, я не уверен, что туда поставить.

Правка: Я на самом деле узнал, что если я не перенаправляю и просто использую заголовок первой ссылки, я могу взять местоположение следующего перенаправления и использовать его в качестве моей последней ссылки

21
Cripto

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

http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history

Запросы:

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

18
Mikko Ohtamaa

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

Для головы:

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

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

Для получения:

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

1
Glen Thompson