2

必要な Web サイトの最終的なリダイレクト URL を取得するためのコードを作成しようとしていますが、http 応答 302 の処理に問題があります。要求を適切に処理していないようです。それ以外の場合、何が問題なのかわかりません。私は twitter.com と facebook.com でリダイレクトを強制することをテストしましたが、うまく動作します (301 の応答)。

これは私の最初の投稿なので、2 つ以上のリンクが表示されるため、印刷物を投稿できません。

コードは次のとおりです。

/**
 * @param args
 */
public static void main(String[] args) {
    String urlin = "http://feeds.nashuatelegraph.com/~r/news/breaking/~3/jxDTXgSDSGc/jpmorgan-ex-workers-charged-in-london-whale-loss.html";
    String url = new String();
    try{
        System.out.println("URL to redirect: "+urlin);
        int iteration = 0;
        //Preparamos la conexión
        HttpURLConnection con =(HttpURLConnection) new URL(urlin).openConnection();
       // con.setRequestProperty("User-Agent", "Mozilla 5.0");
        con.setReadTimeout(20000);
        con.setInstanceFollowRedirects(false);

        //Definimos un booleano que hara de flag
        boolean redirect = true;
        //Iniciamos la busqueda de URL final
        while(redirect){
            System.out.println("\nIteration number: "+ ++iteration);
            con.connect();
            System.out.println("Connected URL: "+con.getURL().toString());
            int status = con.getResponseCode();
            System.out.println("status: "+status);
            //Tratamos el codigo de respuesta obtenido
            if (status != HttpURLConnection.HTTP_OK) {
                if (status == HttpURLConnection.HTTP_MOVED_TEMP
                        || status == HttpURLConnection.HTTP_MOVED_PERM
                        || status ==    HttpURLConnection.HTTP_SEE_OTHER){
                    redirect = true;
                    //Capturamos la nueva URL
                    String newUrl =     con.getHeaderField("location");
                    //Obtenemos la cookie por si se necesita
                    String cookies =    con.getHeaderField("Set-Cookie");
                    System.out.println("Cookies: "+cookies);
                    //Reabrimos la conexión
                    con = (HttpURLConnection) new URL(newUrl).openConnection();
                    if(cookies!=null){
                     con.setRequestProperty("Cookie", cookies);
                    }
                }
                //Tratamos los errores 400 y 404
                if (status == HttpURLConnection.HTTP_NOT_FOUND ||   status == HttpURLConnection.HTTP_BAD_REQUEST){
                    throw new Exception("Error 400 o 404"); 
                }
            } else {
                redirect = false;
                //Obtenemos la URL final
                url = con.getURL().toString();
            }
        }
    } catch (SocketTimeoutException e) {
        System.out.println("Se ha producido un timeout con URL: "+urlin);
    } catch (UnknownHostException e) {
        System.out.println("Direccion URL desconocida: "+urlin);
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("Error IOException al procesar el registro URL: "+urlin);
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("Error al procesar el registro URL: "+urlin);
        e.printStackTrace();
    } 
    if(!url.equals("")) {
        System.out.println("URL final: "+url);
    } else {
        System.out.println("URL final: "+urlin);    
    } 
}

私はあなたが与えることができるすべてのアドバイスに感謝します.

4

1 に答える 1

0

スクレイピングしているサイトは、Cookie を使用して実際のステップを識別し、複数のリダイレクトを行っているようです。

コードでは、ヘッダーのみをインターセプトしてSet-Cookieいますが、以前に設定された Cookie (つまり、応答 n-2 によって設定された Cookie) を破棄しています。

また、サイトは http/https の切り替えを行います。これは、適切な Cookie セットを送信するために考慮する必要がある場合があります。

于 2013-09-09T15:52:34.697 に答える