检测缩短的或“小”网址的目的地
Posted
技术标签:
【中文标题】检测缩短的或“小”网址的目的地【英文标题】:Detect destination of shortened, or "tiny" url 【发布时间】:2011-01-28 02:09:28 【问题描述】:我刚刚抓取了一堆 Google Buzz 数据,我想知道哪些 Buzz 帖子引用了相同的新闻文章。问题是这些帖子中的许多链接已被 URL 缩短器修改,因此许多不同的缩短 URL 实际上都指向同一篇新闻文章。
鉴于我有数百万个帖子,对我来说最有效的方法是什么(最好是在 python 中)
-
检测网址是否为缩短的网址(来自众多网址缩短服务中的任何一个,或至少是最大的)
找到缩短网址的“目标”,即缩短网址的长原始版本。
有谁知道 URL 缩短器是否对请求速率施加了严格的限制?如果我把这个速度控制在 100/秒(所有都来自同一个 IP 地址),你认为我会遇到麻烦吗?
更新和初步解决方案 这些响应导致了以下简单的解决方案
import urllib2
response = urllib2.urlopen("http://bit.ly/AoifeMcL_ID3") # Some shortened url
url_destination = response.url
就是这样!
【问题讨论】:
【参考方案1】:列出最常用的 URL 缩短器并在发现新的时扩展它,然后检查列表中一项的链接。
除非你跟随它,否则你不知道 URL 指向哪里,所以最好的方法应该是跟随缩短的 url 并提取响应的 http 标头以查看它的目标。
我猜如果每秒 100 个请求,您肯定会遇到麻烦(我猜可能发生的最糟糕的情况是他们将您的 IP 列入垃圾邮件发送者黑名单)。
【讨论】:
你知道我可以使用什么 python 库和命令来最有效地发现目标 URL 吗?例如 import urllib2 response = urllib2.urlopen("bit.ly/AoifeMcL_ID3") headers = response.headers.headers 在这种情况下,标头包含目标 URL 的域名,但我没有看到完整的 URL ...在哪里我需要查看目标 URL 的响应吗?【参考方案2】:(AFAIK) 大多数 url 缩短器会跟踪已缩短的 url,因此对具有相同 URL 的同一引擎的多个请求将返回相同的短代码。
正如建议的那样,提取真实 URL 的最佳方法是从对缩短 URL 的请求的响应中读取标头。但是,一些缩短服务(例如 bit.ly)提供 an API method 以返回长 url
【讨论】:
【参考方案3】:获取缩短 URL 目标的最简单方法是使用 urllib
。鉴于短 URL 有效(响应代码 200),该 URL 将返回给您。
>>> import urllib
>>> resp = urllib.urlopen('http://bit.ly/bcFOko')
>>> resp.getcode()
200
>>> resp.url
'http://mrdoob.com/lab/javascript/harmony/'
就是这样!
【讨论】:
【参考方案4】:根据我的阅读,这些答案解决了第二个问题。我对第一个问题很感兴趣。在查看了大约 300 个缩短器的列表后,检测它们的最佳方法似乎是简单地将它们放入列表或正则表达式中并寻找与它们中的任何一个匹配的。
"|".join(z1)
'0rz.tw|1link.in|1url.com|2.gp|2big.at
r1 = re.compile("|".join(z1),flags=ic)
然后使用 r1 作为正则表达式与您尝试在(邮件等)中查找 url 缩短器的任何内容进行匹配
一个很好的列表在这里:longurl.org/services
【讨论】:
【参考方案5】:发布的解决方案仅适用于 Python 2.x,对于 Python 3.x,您可以这样做
import urllib.request as urlreq link = urlreq.urlopen("http://www.google.com") fullURL = link.url
获取完整的 URL。
【讨论】:
以上是关于检测缩短的或“小”网址的目的地的主要内容,如果未能解决你的问题,请参考以下文章