如何查找广告的最终目的地(url)(以编程方式)

这可能是微不足道的,或者不是,但我正在研究一种软件,它将validation通过我的Web应用程序显示的广告的“行尾”域。 理想情况下,我有一个我不想提供广告的域名列表(假设Norton.com就是其中之一),但大多数广告网络通过缩短的,含义模糊的URL(adsrv.com)提供广告,最终重定向到Norton.com。 所以问题是:有任何一个构建,或者知道如何构建,类似刮刀的工具将返回广告的最终目标url。

初步发现:某些广告采用Flash,JavaScript或纯HTML格式。 模拟浏览器是完全可行的,并且可以对抗不同格式的广告。 并非所有Flash或JS广告都有noflash或noscript替代品。 (浏览器可能是必要的,但如上所述,这非常好……使用像WatiN或WatiR或WatiJ或Selenium等的东西……)

喜欢开源,这样我就可以自己重建一个。 真的很感激帮助!

编辑*此脚本需要点击广告,因为它可能是Flash,JS或只是HTML plain。 因此Curl不太可能是一个选项,除非Curl可以点击?

示例PHP实现:

$k = curl_init('http://goo.gl'); curl_setopt($k, CURLOPT_FOLLOWLOCATION, true); // follow redirects curl_setopt($k, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 ' . '(KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7'); // imitate chrome curl_setopt($k, CURLOPT_NOBODY, true); // HEAD request only (faster) curl_setopt($k, CURLOPT_RETURNTRANSFER, true); // don't echo results curl_exec($k); $final_url = curl_getinfo($k, CURLINFO_EFFECTIVE_URL); // get last URL followed curl_close($k); echo $final_url; 

哪个应返回类似https://www.google.com/accounts/ServiceLogin?service=urlshortener&continue=http://goo.gl/?authed%3D1&followup=http://goo.gl/?authed%3D1&passive=true&go=true

注意:如果要可靠地遵循HTTPS / SSL,则可能需要使用curl_setopt()来关闭CURLOPT_SSL_VERIFYHOSTCURLOPT_SSL_VERIFYPEER

 curl --head -L -s -o /dev/null -w %{url_effective}  
  • --head将其限制为HEAD请求,因此您无需实际下载页面

  • -L告诉curl继续关注重定向

  • -s摆脱任何进度表等

  • -o /dev/null告诉curl丢弃检索到的头文件(我们不关心它们)

  • -w %{url_effective}告诉curl将最后一次获取的url写为stdout的结果

结果是有效的URL被写入stdout,而没有别的。

您正在谈论跟踪重定向URL,直到它超时,进入循环或解析为最终地址。

Net :: HTTP库具有以下重定向示例。

此外,Ruby的open-uri模块将自动重定向,因此我认为您可以在检索页面并找到它所在的位置后询问结尾URL。

 require 'open-uri' io = open('http://google.com') body = io.read io.base_uri.to_s # => "http://www.google.com/" 

请注意,在阅读正文后,url被重定向到Google的/ dir。

这两种情况都只会处理服务器重定向。 对于元重定向,您必须查看代码,看看他们在哪里重定向并去那里。

这将让你开始:

 require 'nokogiri' doc = Nokogiri::HTML('') redirect_url = (doc%'meta[@http-equiv="REFRESH"]')['content'].split('=').last rescue nil 

cURL可以检索HTTP标头。 继续单步链接,直到您不再获取Location:标题,并且您收到的最后一个Location:标题是最终的URL。

Mechanize gem对此非常方便:

  agent = Mechanize.new {|a| a.user_agent_alias = 'Windows IE 7'} page = agent.get(url) final_url = page.uri.to_s 

我最终使用的解决方案是模拟浏览器,加载广告和点击。 点击是关键因素。 其他人提供的解决方案对于给定的URL很有用,但不会处理Flash,JavaScript等。感谢每个人的帮助。