Как я могу удалить URL-адрес?
Я хочу уметь сокращать или сокращать URL-адрес и возвращать его сокращенную форму. Как я могу сделать программу python для этого?
Дополнительная информация:
- Случай 1: укороченный → без искажений
- Случай 2: unshortened → unshortened
например. bit.ly/silly
во входном массиве должно быть google.com
в выходном массиве
например google.com
во входном массиве должно быть google.com
в выходном массиве
Ответы
Ответ 1
Отправьте запрос 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
Ответ 2
Использование запросов:
import requests
session = requests.Session() # so connections are recycled
resp = session.head(url, allow_redirects=True)
print(resp.url)
Ответ 3
Unshorten.me имеет api, который позволяет отправлять запрос JSON или XML и получать полный URL-адрес.
Ответ 4
Откройте URL-адрес и посмотрите, что он разрешает:
>>> import urllib2
>>> a = urllib2.urlopen('http://bit.ly/cXEInp')
>>> print a.url
http://www.flickr.com/photos/[email protected]/346615997/sizes/l/
>>> a = urllib2.urlopen('http://google.com')
>>> print a.url
http://www.google.com/
Ответ 5
Чтобы отключить, вы можете использовать запросы. Это простое решение, которое работает для меня.
import requests
url = "http://foo.com"
site = requests.get(url)
print(site.url)
Ответ 6
http://github.com/stef/urlclean
sudo pip install urlclean
urlclean.unshorten(url)
Ответ 7
Вот код 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