这可能是微不足道的,或者不是,但我正在开发一款软件,用于验证通过我的网络应用程序显示的广告的“行尾”域。理想情况下,我有一个我不想提供广告的域名列表(假设Norton.com就是其中之一),但大多数广告网络通过缩短的,含义模糊的URL(adsrv.com)提供广告,最终重定向到Norton.com。所以问题是:有任何一个构建,或者知道如何构建一个类似刮刀的工具,它将返回广告的最终目标网址。
初步发现:有些广告采用Flash,JavaScript或纯HTML格式。模拟浏览器是完全可行的,并且可以对抗不同格式的广告。并非所有Flash或JS广告都有noflash或noscript替代品。 (浏览器可能是必要的,但如上所述,这非常好......使用像WatiN或WatiR或WatiJ或Selenium等的东西......)
首选开源,以便我自己重建一个。非常感谢帮助!
编辑*此脚本需要点击广告,因为它可能是Flash,JS或HTML平原。因此Curl不太可能是一个选项,除非Curl可以点击?
答案 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_VERIFYHOST
和CURLOPT_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等。感谢每个人的帮助。