2013-06-06 1 views
5

В настоящее время я работаю над веб-скрепером с помощью java. Я вручную отправляю запрос GET, настраивая tcp-соединение и используя принтер.Вручную отправляет запрос GET на веб-сайт. 302 redirect error

Я могу подключиться к большинству веб-сайтов, таких как yahoo.com или cracked.com, и получать ответ, НО я не могу подключиться к целевому сайту - vinylengine.com. Он всегда будет возвращать ошибку 302.

Я сравнил свой запрос на отправку с моим браузером, и они почти идентичны.

Мой Заголовок:

GET/HTTP/1.1 
Host: www.vinylengine.com 

Мой ответ: заголовок

HTTP/1.1 302 Found 
Date: Thu, 06 Jun 2013 19:27:00 GMT 
Server: Apache 
Location: http://www.nakedresource.com/ 
Cache-Control: max-age=1209600 
Expires: Thu, 20 Jun 2013 19:27:00 GMT 
Content-Length: 213 
Content-Type: text/html; charset=iso-8859-1 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>302 Found</title> 
</head><body> 
<h1>Found</h1> 
<p>The document has moved <a href="http://www.nakedresource.com/">here</a>.</p> 
</body></html> 

браузера:

GET http://www.vinylengine.com/ HTTP/1.1 
Host: www.vinylengine.com 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Cookie: __utma=72407316.18415374.1370488314.1370497873.1370543389.3; __utmz=72407316.1370488314.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); SESSaf8d12283bdbdc5f5bbfb2aef054db6d=1f0676e5cab0ba2c5a80e76ea0bd6f75; __utmc=72407316; has_js=1; __utmb=72407316 
Connection: keep-alive 
If-Modified-Since: Thu, 06 Jun 2013 18:02:53 GMT 
If-None-Match: "2186d59ac297e0f1a43433fa61e8a94b" 

Код:

public void sendRequest(String extensionString, String urlString) 
{ 
    try 
    { 
     //BufferedReader inFromServer; 
     //PrintWriter outToServer; 
     //These 2 are initalized elsewhere 

     outToServer.println("GET " + extensionString + " HTTP/1.1"); 
     outToServer.println("Host: " + urlString); 

     outToServer.println(""); 
     outToServer.flush(); 

     String temp; 
     while((temp=inFromServer.readLine()) != null) 
     { 
      System.out.println(temp); 
     } 

     return; 
    } 
    catch (Exception e) 
    { 
     System.out.printf("sendRequest failed: %s",e); 
     return; 
    } 
} 

Я попытался изменить имя хоста nakedresource.com, но когда я делаю это, я получаю исходный код страницы для nakedresource.com и не vinylengine.com

+1

HTTP 302 означает перенаправление, поэтому вам нужно повторно перенаправить URL-адрес – nidhin

+0

Итак, вы не делаете то же самое, что и браузер, а затем задаетесь вопросом, почему результаты разные? –

ответ

6

Сайт о котором идет речь, глядя на вашей строке агента пользователя (или его отсутствие в вашем случае).

Когда вы говорите, что делаете «почти то же самое», что и браузер ... вы правы. И компьютеры придирчивы к подобным вещам.

Если вы не указали заголовок User-Agent:, вы получите перенаправление.

> телнет www.vinylengine.com 80
Стараясь 67.225.154.112 ...
Подключение к vinylengine.com.
Эвакуационный символ - '^]'.
GET/HTTP/1.1
Ведущий: www.vinylengine.com
Accept: */*

HTTP/1.1 302 Найдено
...

Принимая во внимание, если вы обеспечить один, вы получаете страницу:

> телнет www.vinylengine.com 80
Пытаюсь 67.225.154.112 ...
Connected к vinylengine.com.
Эвакуационный символ - '^]'.
GET/HTTP/1.1
Ведущий: www.vinylengine.com
User-Agent: завиток/7.21.4 (универсальный-яблочного darwin11.0) Libcurl/7.21.4 OpenSSL/0.9.8r Zlib/1,2. 5
Accept: */*

HTTP/1.1 200 OK
... (страница)

Это обычно делается, потому что сайт предоставляет различные версии контента различных браузеров как определено заголовком User-Agent. По-видимому, их ответ «нет User-Agent» - это ... punt, и вы перенаправляетесь на корень родительского сайта.

+0

+1 Именно то, что я нашел (вплоть до той же версии zLib :). –

+0

Спасибо, что исправил проблему! –

1

Этот может быть возможно, если ваш прокси настроен в вашем браузере, но ваша JVM не знает об этом.

Попробуйте начать JVM со следующими аргументами и посмотреть, если он устраняет проблему:

-Dhttp.proxyHost=10.12.11.1 -Dhttp.proxyPort=8800 
+0

Проблема в том, что проблема заключается в том, что сайт ищет строку User Agent. –

3
HttpURLConnection.setFollowRedirects(true); 

Если вы используете HttpURLConnection использовать код, указанный выше.

Также см Example showing HTTP redirects

+2

Просто FYI, перенаправление происходит из-за строки 'User-Agent'. Затем он переносит вас на другой (родительский) сайт, а не на фактическую страницу. –

+0

Вы всегда можете обратиться к http://stackoverflow.com/questions/2529682/setting-user-agent-of-a-java-urlconnection, чтобы узнать, как добавить строку пользовательского агента. – user1889970