2013-03-11 4 views
1

Я пытаюсь написать систему оповещения, чтобы периодически публиковать жалобы на сайте, чтобы искать жалобы на мой продукт. Я использую Jsoup для того же. Ниже приведен фрагмент кода, который дает мне ошибку.Скребок сайта

doc = Jsoup.connect(finalUrl).timeout(10 * 1000).get(); 

Это дает мне ошибку

java.net.SocketException: Unexpected end of file from server 

Когда я копировать вставить ту же finalUrl строку в браузере, она работает. Затем я попробовал простое URL-соединение.

  BufferedReader br = null; 
      try { 
       URL a = new URL(finalUrl); 
       URLConnection conn = a.openConnection(); 

       // open the stream and put it into BufferedReader 
       br = new BufferedReader(new InputStreamReader(
         conn.getInputStream())); 
       doc = Jsoup.parse(br.toString()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

Но, как оказалось, само соединение возвращает null (br равно null). Теперь вопрос в том, почему одна и та же строка, когда копия, вставленная в браузере, открывает сайт без каких-либо ошибок?

Полный StackTrace как показано ниже:

java.net.SocketException: Unexpected end of file from server 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:774) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:771) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195) 
    at ComplaintsBoardScraper.main(ComplaintsBoardScraper.java:46) 
+0

Создает ли ваш url с 'http: //' и ваш сервер разрешает подключения к порту '80'? – ollo

+0

@ollo yes URL начинается с http: //. Сервер - это удаленный сервер, который не находится под моим контролем. Хотя, когда я пытаюсь выполнить команду «nc» на сервере, он говорит: «Успешно удалось подключиться к complaintsboard.com 80 port [tcp/http]! – rishi

+0

У вас есть неограниченные символы в URL-адресе или интернет-доступ заблокирован для вашего приложения? Переводит ли URL-адрес другому? – ollo

ответ

3

Это один было сложно! :-)

Сервер блокирует все запросы, у которых нет надлежащего пользовательского агента. Вот почему вы преуспели в своем браузере, но не с Java.

К счастью, изменения пользовательского агента не большая вещь в jsoup:

final String url = "http://www.complaintsboard.com/?search=justanswer.com&complaints=Complaints"; 
final String userAgent = "Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu)"; 

Document doc = Jsoup.connect(url) // you get a 'Connection' object here 
         .userAgent(userAgent) // ! set the user agent 
         .timeout(10 * 1000) // set timeout 
         .get(); // execute GET request 

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

+0

Я думал о подобных строках, но никогда не мог ответить на этот вопрос быстро. Спасибо тонну за это. – rishi

+2

Я подумывал о том, что пользовательский агент в jsoup не использовал то, что похоже на браузер, поскольку это улавливает так много людей. Любые мысли о плюсах и минусах этого? –

+1

Это хорошая идея, но у нее есть один недостаток: некоторые веб-сайты используют пользовательский агент для определения того, какой веб-сайт отображается пользователю (возможно, «настольная» версия для браузера (firefox и т. Д.) И «мобильная» версия для смартфонов (андроид и т. д.)). Если вы установили «настольный» пользовательский агент, вы сможете решить проблемы, например, заданные здесь. Но с другой стороны, если кто-то исключает «мобильную» версию, он также получит «настольную» версию. – ollo