HttpUrlConnection, чтобы получить заголовок контента и получить "Перемещение навсегда" - PullRequest
1 голос
/ 14 августа 2011

Это мой код, который я написал в Groovy для получения заголовка страницы из URL.Тем не менее, на каком-то веб-сайте я получил сообщение «Перемещено навсегда», что, по-моему, связано с редиректом 301.Как мне избежать этого и позволить HttpUrlConnection перейти по правильному URL-адресу и получить правильный заголовок страницы

Например, на этом сайте вместо правильного заголовка страницы http://www.nytimes.com/2011/08/14/arts/music/jay-z-and-kanye-wests-watch-the-throne.html

* я получил «Перемещение навсегда»1005 *

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Я могу заставить это работать, если сам справлюсь с перенаправлением ...

Я думаю, проблема в том, что сайт будет ожидать куки, которые он отправит на полпути вниз по цепочке перенаправления, и если он неЧтобы получить их, он отправляет вас на страницу входа.

Этот код, очевидно, нуждается в некоторой очистке (и, возможно, есть лучший способ сделать это), но он показывает, как я могу извлечь заголовок:

@Grab( 'net.sourceforge.htmlcleaner:htmlcleaner:2.2' )
@Grab( 'commons-lang:commons-lang:2.6' )
import org.apache.commons.lang.StringEscapeUtils
import org.htmlcleaner.*

String location = 'http://www.nytimes.com/2011/08/14/arts/music/jay-z-and-kanye-wests-watch-the-throne.html'
String cookie = null
String pageContent = ''

while( location ) {
  new URL( location ).openConnection().with { con ->
    // We'll do redirects ourselves
    con.instanceFollowRedirects = false

    // If we got a cookie last time round, then add it to our request
    if( cookie ) con.setRequestProperty( 'Cookie', cookie )
    con.connect()

    // Get the response code, and the location to jump to (in case of a redirect)
    int responseCode = con.responseCode
    location = con.getHeaderField( "Location" )

    // Try and get a cookie the site will set, we will pass this next time round
    cookie = con.getHeaderField( "Set-Cookie" )

    // Read the HTML and close the inputstream
    pageContent = con.inputStream.withReader { it.text }
  }
}

// Then, clean paceContent and get the title
HtmlCleaner cleaner = new HtmlCleaner()
CleanerProperties props = cleaner.getProperties()

TagNode node = cleaner.clean( pageContent )
TagNode titleNode = node.findElementByName("title", true);

def title = titleNode.text.toString()
title = StringEscapeUtils.unescapeHtml( title ).trim()
title = title.replace( "\n", "" )

println title

Надеюсь, это поможет!

0 голосов
/ 14 августа 2011

Вам необходимо вызвать setInstanceFollowRedirects (true) для HttpUrlConnection.т.е. после первой строки вставьте con.setInstanceFollowRedirects (true)

...