20

短縮された URL または短縮されていない URL を取り、短縮されていない形式で返すことができるようにしたいと考えています。これを行うためのPythonプログラムを作成するにはどうすればよいですか?

追加の説明:

  • ケース 1: 短縮 --> 短縮なし
  • ケース 2: 短縮されていない --> 短縮されていない

たとえばbit.ly/silly、入力配列はgoogle.com出力配列にある必要があります。
たとえば、入力配列は出力配列にあるgoogle.com必要があります。google.com

4

10 に答える 10

40

URL に HTTP HEAD 要求を送信し、応答コードを確認します。コードが 30x の場合は、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
于 2010-11-17T03:20:28.380 に答える
31

リクエストの使用:

import requests

session = requests.Session()  # so connections are recycled
resp = session.head(url, allow_redirects=True)
print(resp.url)
于 2015-03-07T18:00:10.040 に答える
5

Unshorten.meには、JSON または XML リクエストを送信して、返された完全な URL を取得できる API があります。

于 2010-11-17T03:00:04.943 に答える
4

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/
于 2010-11-17T03:19:40.717 に答える
3

Python 3.5+ を使用している場合は、これを非常に簡単にするUnshortenitモジュールを使用できます。

from unshortenit import UnshortenIt
unshortener = UnshortenIt()
uri = unshortener.unshorten('https://href.li/?https://example.com')
于 2020-05-04T07:51:11.750 に答える
1

以下は、ほとんどの有用なコーナー ケースを考慮した 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
于 2015-07-15T21:22:15.280 に答える
1

http://github.com/stef/urlclean

sudo pip install urlclean
urlclean.unshorten(url)
于 2013-07-12T13:34:57.917 に答える