如何找到广告的最终目的地(网址)(以编程方式)

时间:2010-11-02 22:15:31

标签: php ruby http advertising ads

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

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

首选开源,以便我自己重建一个。非常感谢帮助!

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

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

  • -s摆脱任何进度表等

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

  • -w %{url_effective}告诉curl写出最后一次获取的网址作为stdout的结果

结果将是有效的URL写入stdout,而不是其他任何内容。

答案 2 :(得分:1)

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

Net :: HTTP库有一个Following Redirection示例。

此外,Ruby的open-uri模块将自动重定向,因此我认为您可以在检索页面并找出它落在何处后向其询问结束URL。

require 'open-uri'

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

请注意,在阅读正文后,网址已重定向到Google的/目录。

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

这将帮助您入门:

require 'nokogiri'

doc = Nokogiri::HTML('<meta http-equiv="REFRESH" content="0;url=http://www.the-domain-you-want-to-redirect-to.com">')

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

答案 3 :(得分:0)

cURL可以检索HTTP标头。继续踩到链,直到您不再获得Location:标题,并且您收到的最后一个Location:标题是最终的网址。

答案 4 :(得分:0)

Mechanize gem对此非常方便:

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

答案 5 :(得分:0)

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