Как найти конечный пункт назначения (url) объявления (программно)

Это может быть тривиально или нет, но я работаю над частью программного обеспечения, которое будет проверять домен «конец строки» для объявлений, отображаемых через мое веб-приложение. В идеале у меня есть список доменов, с которых я не хочу показывать рекламу (скажем, Norton.com является одним из них), но большинство рекламных сетей показывают рекламу через сокращенные и загадочные URL-адреса (adsrv.com), которые в конечном итоге перенаправляют на Нортон.com. Итак, вопрос: кто-нибудь создал или имеет представление о том, как создать инструмент, похожий на скребок, который будет возвращать конечный целевой URL-адрес объявления.

Первоначальное обнаружение: некоторые объявления представлены во Flash, JavaScript или простом HTML. Эмуляция браузера вполне жизнеспособна и будет бороться с различными форматами рекламы. Не все объявления Flash или JS имеют альтернативу noflash или noscript. (Возможно, потребуется браузер, но, как уже говорилось, это совершенно нормально... Использование чего-то вроде WatiN, WatiR, WatiJ, Selenium и т. д.)

Предпочитаю открытый исходный код, чтобы я мог восстановить его сам. Очень ценю помощь!

РЕДАКТИРОВАТЬ * Этот скрипт должен щелкнуть по объявлению, поскольку это может быть Flash, JS или просто HTML. Таким образом, Curl менее вероятен, если только Curl не может щелкнуть?


person Mike    schedule 02.11.2010    source источник


Ответы (6)


Пример реализации 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

Примечание. Возможно, вам придется использовать curl_setopt(), чтобы отключить CURLOPT_SSL_VERIFYHOST и CURLOPT_SSL_VERIFYPEER, если вы хотите надежно отслеживать HTTPS/SSL.

person Dereleased    schedule 02.11.2010
comment
ты легенда. идеальное решение для меня. - person ; 05.11.2010

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 записать последний полученный URL-адрес в качестве результата на стандартный вывод

Результатом будет то, что эффективный URL-адрес записывается в стандартный вывод и ничего больше.

person Amber    schedule 02.11.2010

Вы говорите о том, чтобы следовать перенаправлению URL-адреса до тех пор, пока он не истечет, не попадет в цикл или не разрешится до конечного адреса.

В библиотеке Net::HTTP есть пример Following Redirection .

Кроме того, модуль open-uri Ruby будет автоматически перенаправлять, поэтому я думаю, что вы можете запросить у него конечный URL-адрес после того, как вы получите страницу и узнаете, где она приземлилась.

require 'open-uri'

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

Обратите внимание, что после прочтения тела URL-адрес был перенаправлен в каталог 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
person the Tin Man    schedule 03.11.2010

cURL может получать заголовки HTTP. Продолжайте продвигаться по цепочке, пока не перестанете получать заголовки Location:, а последний полученный заголовок Location: станет конечным URL.

person ceejayoz    schedule 02.11.2010

Для этого удобен гем Mechanize:

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

Решение, которое я в конечном итоге использовал, заключалось в имитации браузера, загрузки рекламы и нажатия. Щелчок был ключевым элементом. Решения, предложенные другими, были хороши для данного URL-адреса, но не поддерживали Flash, JavaScript и т. д. Благодарим за помощь каждого.

person Mike    schedule 30.08.2011