Как проверить адрес перенаправленной веб-страницы, не загружая ее в Python - PullRequest
1 голос
/ 20 сентября 2011

Для данного URL, как я могу определить окончательное местоположение в Интернете после HTTP-перенаправлений, не загружая последнюю страницу (например, запрос HEAD.), Используя python.Я пытаюсь написать массовый загрузчик, мой механизм загрузки должен знать местоположение страницы в Интернете, прежде чем загружать ее.

edit

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

import urlparse
import httplib

def getFinalUrl(url):
    "Navigates Through redirections to get final url."
    parsed = urlparse.urlparse(url)
    conn = httplib.HTTPConnection(parsed.netloc)
    conn.request("HEAD",parsed.path)
    response = conn.getresponse()
    if str(response.status).startswith("3"):
        new_location = [v for k,v in response.getheaders() if k == "location"][0]
        return getFinalUrl(new_location)
    return url

Ответы [ 3 ]

0 голосов
/ 20 сентября 2011

Вы также можете взглянуть на python-запросов , который, похоже, является новым модным API для HTTP-запросов, заменив, возможно, неудобный httplib2. (см. Почему бы не httplib2 )

Для этого также есть метод head().

0 голосов
/ 19 сентября 2012

Я настоятельно рекомендую вам использовать библиотеку запросов. Это хорошо закодировано и активно поддерживается. Запросы могут сделать все, что вам нужно, например, prefetch /

Из документации запросов http://docs.python -requests.org / ru / latest / user / advanced / :

По умолчанию, когда вы делаете запрос, тело ответа загружается немедленно. Вы можете переопределить это поведение и отложить загрузку тела ответа, пока не получите доступ к атрибуту Response.content с параметром prefetch:

tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, prefetch=False)

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

if int(r.headers['content-length']) < TOO_LONG:
  content = r.content
  ...

Вы можете дополнительно управлять рабочим процессом, используя методы Response.iter_content и Response.iter_lines или читая базовый urllib3 urllib3.HTTPResponse в Response.raw

0 голосов
/ 20 сентября 2011

Вы можете использовать httplib для отправки запросов HEAD.

...