Как я могу удалить URL? - PullRequest
       18

Как я могу удалить URL?

15 голосов
/ 17 ноября 2010

Я хочу иметь возможность взять сокращенный или не сокращенный URL-адрес и вернуть его не сокращенную форму. Как я могу сделать программу Python для этого?

Дополнительное уточнение:

  • Случай 1: укороченный -> не укороченный
  • Дело 2: не сокращено -> не сокращено

например. bit.ly/silly во входном массиве должно быть google.com в выходном массиве
например google.com во входном массиве должно быть google.com в выходном массиве

Ответы [ 7 ]

35 голосов
/ 17 ноября 2010

Отправьте HTTP-запрос HEAD на URL и посмотрите код ответа.Если код 30х, посмотрите заголовок Location, чтобы получить несжатый URL.В противном случае, если код 20x, то URL не перенаправляется;Вы, вероятно, также хотите обрабатывать коды ошибок (4xx и 5xx) каким-либо образом.Например:

# This is for Py2k.  For Py3k, use http.client and urllib.parse instead, and
# use // instead of / for the division
import httplib
import urlparse

def unshorten_url(url):
    parsed = urlparse.urlparse(url)
    h = httplib.HTTPConnection(parsed.netloc)
    h.request('HEAD', parsed.path)
    response = h.getresponse()
    if response.status/100 == 3 and response.getheader('Location'):
        return response.getheader('Location')
    else:
        return url
21 голосов
/ 07 марта 2015

Использование запросов:

import requests

session = requests.Session()  # so connections are recycled
resp = session.head(url, allow_redirects=True)
print(resp.url)
5 голосов
/ 17 ноября 2010

Unshorten.me имеет API, который позволяет отправлять JSON или XML-запрос и возвращать полный URL-адрес.

4 голосов
/ 17 ноября 2010

Откройте URL-адрес и посмотрите, к чему он приводит:

>>> import urllib2
>>> a = urllib2.urlopen('http://bit.ly/cXEInp')
>>> print a.url
http://www.flickr.com/photos/26432908@N00/346615997/sizes/l/
>>> a = urllib2.urlopen('http://google.com')
>>> print a.url
http://www.google.com/
2 голосов
/ 01 мая 2017

Для отмены, вы можете использовать запросы. Это простое решение, которое работает для меня.

import requests
url = "http://foo.com"

site = requests.get(url)
print(site.url)
1 голос
/ 16 июля 2015

Вот код src, который учитывает почти полезные угловые случаи:

  • установить пользовательское время ожидания.
  • установить пользовательский агент пользователя.
  • проверьте, должны ли мы использовать соединение http или https.
  • рекурсивно разрешить входной URL и предотвратить завершение в цикле.

Код src находится на github @ https://github.com/amirkrifa/UnShortenUrl

комментарии приветствуются ...

import logging
logging.basicConfig(level=logging.DEBUG)

TIMEOUT = 10
class UnShortenUrl:
    def process(self, url, previous_url=None):
        logging.info('Init url: %s'%url)
        import urlparse
        import httplib
        try:
            parsed = urlparse.urlparse(url)
            if parsed.scheme == 'https':
                h = httplib.HTTPSConnection(parsed.netloc, timeout=TIMEOUT)
            else:
                h = httplib.HTTPConnection(parsed.netloc, timeout=TIMEOUT)
            resource = parsed.path
            if parsed.query != "": 
                resource += "?" + parsed.query
            try:
                h.request('HEAD', 
                          resource, 
                          headers={'User-Agent': 'curl/7.38.0'}
                                   }
                          )
                response = h.getresponse()
            except:
                import traceback
                traceback.print_exec()
                return url

            logging.info('Response status: %d'%response.status)
            if response.status/100 == 3 and response.getheader('Location'):
                red_url = response.getheader('Location')
                logging.info('Red, previous: %s, %s'%(red_url, previous_url))
                if red_url == previous_url:
                    return red_url
                return self.process(red_url, previous_url=url) 
            else:
                return url 
        except:
            import traceback
            traceback.print_exc()
            return None
1 голос
/ 12 июля 2013

http://github.com/stef/urlclean

sudo pip install urlclean
urlclean.unshorten(url)
...