Как найти конечный пункт назначения (URL) объявления (программно) - PullRequest
3 голосов
/ 03 ноября 2010

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

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

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

Ответы [ 6 ]

4 голосов
/ 03 ноября 2010

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

2 голосов
/ 03 ноября 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 в качестве результата для stdout

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

1 голос
/ 03 ноября 2010

Вы говорите о том, чтобы следовать перенаправлению 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 был перенаправлен на / dir 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
0 голосов
/ 31 августа 2011

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

0 голосов
/ 03 ноября 2010

Камень Mechanize удобен для этого:

  agent = Mechanize.new {|a| a.user_agent_alias = 'Windows IE 7'}
  page = agent.get(url)
  final_url = page.uri.to_s
0 голосов
/ 03 ноября 2010

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

...