检测缩短或“迷你”URL的目标地址
我刚刚抓取了一些Google Buzz的数据,现在想知道哪些Buzz帖子提到的是同一篇新闻文章。问题是,这些帖子里的很多链接都被网址缩短工具修改过,所以可能有很多不同的缩短网址实际上指向的是同一篇新闻。
考虑到我有数百万条帖子,最有效的方法是什么(最好是用Python)来:
- 判断一个网址是否是缩短网址(来自各种网址缩短服务,或者至少是最大的那些)
- 找到这个缩短网址的“目标”,也就是缩短网址的长版、原始版本。
有没有人知道这些网址缩短工具是否有严格的请求速率限制?如果我把请求控制在每秒100次(都来自同一个IP地址),你觉得会有问题吗?
更新和初步解决方案
根据大家的反馈,我得到了以下简单的解决方案。
import urllib2
response = urllib2.urlopen("http://bit.ly/AoifeMcL_ID3") # Some shortened url
url_destination = response.url
就这样!
5 个回答
1
先列出一些常用的短网址生成器,随着你发现新的短网址生成器,继续扩展这个列表。然后,选一个列表中的短网址,去检查一下它指向的链接。
在你没有点击短网址之前,你是无法知道它指向哪里,所以最好的办法就是点击这个短网址,然后提取响应的http头信息,看看它最终指向哪个地址。
我想如果你每秒发送100个请求,肯定会遇到麻烦(我猜最糟糕的情况就是他们把你的IP当成垃圾邮件发送者给封了)。
3
据我所知,大多数网址缩短服务会记录已经缩短过的网址,所以如果你多次请求同一个网址,它们会返回相同的短链接。
正如有人提到的,提取真实网址的最好方法是查看对缩短网址请求的响应头。不过,有些缩短服务(比如 bit.ly)提供了一个 API 方法,可以直接返回长网址。
17
获取缩短网址的最终地址最简单的方法是使用 urllib
。只要这个短网址是有效的(也就是返回的响应代码是200),你就能得到它对应的完整网址。
>>> import urllib
>>> resp = urllib.urlopen('http://bit.ly/bcFOko')
>>> resp.getcode()
200
>>> resp.url
'http://mrdoob.com/lab/javascript/harmony/'
就这么简单!