2010-11-02 6 views
3

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

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

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

EDIT * Этот скрипт должен нажать на объявление, так как это может быть Flash, JS или просто HTML plain. Так что Curl менее вероятен вариант, если Curl не может щелкнуть?

ответ

0

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

2
curl --head -L -s -o /dev/null -w %{url_effective} <some-short-url> 
  • --head ограничивает его только запросы HEAD, так что вы не должны фактически загружать страницы

  • -L рассказывает локон, чтобы держать после перенаправляет

  • -s избавляется любых показателей прогресса и т. д.

  • -o /dev/null говорит локон, чтобы выбросить заголовки, извлекаемые (мы не заботимся о них)

  • -w %{url_effective} говорит завиток, чтобы написать последнюю сгружен URL в результате на стандартный вывод

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

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

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

+0

вы легенда. идеальное решение для меня. – 2010-11-05 18:32:22

1

Вы говорите о перенаправлении 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 
0

Жемчужиной Mechanize удобен для этого:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^