Detecte o destino do URL encurtado ou “minúsculo”
Pergunta
Acabei de coletar vários dados do Google Buzz e quero saber quais postagens do Buzz fazem referência aos mesmos artigos de notícias.O problema é que muitos dos links nessas postagens foram modificados por encurtadores de URL, então pode ser que muitos URLs encurtados distintos apontem para o mesmo artigo de notícias.
Dado que tenho milhões de postagens, qual é a maneira mais eficiente (de preferência em python) de
- detectar se um URL é um URL encurtado (de qualquer um dos muitos serviços de encurtamento de URL, ou pelo menos o maior)
- Encontre o “destino” do URL encurtado, ou seja, a versão longa e original do URL encurtado.
Alguém sabe se os encurtadores de URL impõem limites rígidos de taxa de solicitação?Se eu mantiver isso em 100/segundo (todos vindos do mesmo endereço IP), você acha que terei problemas?
ATUALIZAÇÃO E SOLUÇÃO PRELIMINARAs respostas levaram à seguinte solução simples
import urllib2
response = urllib2.urlopen("http://bit.ly/AoifeMcL_ID3") # Some shortened url
url_destination = response.url
É isso!
Solução
A maneira mais fácil de obter o destino de um URL encurtado é com urllib
. Dado que o URL curto é válido (código de resposta 200), o URL será devolvido a você.
>>> import urllib
>>> resp = urllib.urlopen('http://bit.ly/bcFOko')
>>> resp.getcode()
200
>>> resp.url
'http://mrdoob.com/lab/javascript/harmony/'
E é isso!
Outras dicas
(AFAIK) A maioria dos encurtadores de URL acompanha os URLs já reduzidos; portanto, várias solicitações para o mesmo mecanismo com o mesmo URL retornarão o mesmo código curto.
Como foi sugerido, a melhor maneira de extrair o URL real é ler os cabeçalhos de uma resposta a um pedido de URL reduzido. No entanto, alguns serviços de encurtamento (por exemplo, bit.ly) fornecem um método da API para devolver o URL longo
Faça uma lista dos encurtadores de URL mais usados e expanda-a enquanto descobre novos, depois verifique um link para um item da lista.
Você não sabe para onde o URL aponta, a menos que o siga, então a melhor maneira de fazer isso é seguir o URL abreviado e extrair o cabeçalho http da resposta para ver para onde ele vai.
Eu acho que com 100 solicitações por segundo você certamente pode ter problemas (eu acho que o pior que pode acontecer é eles colocarem seu IP na lista negra como spammer).
A solução postada só funciona para o python 2.x, para python 3.x você pode fazer isso
import urllib.request as urlreq link = urlreq.urlopen("http://www.google.com") fullURL = link.url
Para obter o URL completo.
Pelo que li, essas respostas abordaram a segunda pergunta. Eu estava interessado na primeira pergunta. Depois de visualizar uma lista de cerca de 300 encurtadores, parece que a melhor maneira de detectá -los é simplesmente colocá -los em uma lista ou regex e procurar uma combinação com qualquer um deles.
"|".join(z1)
'0rz.tw|1link.in|1url.com|2.gp|2big.at
r1 = re.compile("|".join(z1),flags=ic)
Em seguida, usando o R1 para combinar como regex contra o que você está tentando encontrar os encurtadores de URL (Mail, etc ...)
Uma lista muito boa está aqui: longurl.org/services