Try English version of Quizful



Раздаем бесплатные Q! подробности в группе Quizful.Alpha-test
Партнеры
Рекрутерам: Прескрининг кандидатов about
Топ контрибуторов
loading
loading
Знаете ли Вы, что

В разделе "Статьи" можно найти обучающие статьи по информационным технологиям, а также узнать о новостях сервиса Quizful.

Лента обновлений
ссылка 15:38:56
Добавлен вопрос в тест C# - Средний уровень
ссылка 15:11:57
Добавлен вопрос в тест C# - Средний уровень
ссылка 15:03:58
Добавлен вопрос в тест C# - Средний уровень
ссылка 14:51:10
Комментарий от olegchap:
Совершенно правы. Опечатка. Спасибо за сигнал. Исправил...
ссылка 12:12:41
Комментарий от lenarikil:
"Вы как нибудь сами скомпилируйте, а то у меня лапки" ...
Статистика

Тестов: 153, вопросов: 8581. Пройдено: 393520 / 1913910.

Краулинг в Java

head tail Статья
категория
Java
дата16.12.2012
авторf_r_o_s_t
голосов24

Краулинг в Java.

Введение

Давайте начнем с того что такое вообще краулинг(crawling) . Crawler – это программа которая осуществляет обход  страниц в интернете. Такие программы часто называют веб-сканеры, пауки, поисковые роботы. Самый, пожалуй, часто приводимый пример это робот поисковой системы, который обходит интернет страницы и заносит их в базу данных, позже по этой базе осуществляется поиск, если не вдаваться в подробности то именно так работают все поисковые системы. Но это не единственное применение краулеров. Вот еще возможные способы применения:
•Автоматический мониторинг изменений на сайте.
•Проверка синтаксиса и структуры сайта.
•Проверка связности и отсутствия битых ссылок.
•Специализированный поиск.
•Многое другое.

Простой случай

А теперь давайте попробуем получить содержимое какой-либо страницы и вывести его. Это делается приблизительно следующим образом:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class App {

    public static void main(String[] args) {
        new App().exec();
    }

    public void exec() {
        BufferedReader reader = null;
        try {
            URL site = new URL("http://www.quizful.net/");
            reader = new BufferedReader(new InputStreamReader(site.openStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (IOException ex) {
            //...
        } finally {
            try {
                reader.close();
            } catch (IOException ex) {
                //...
            }
        }

    }
}
Это все на самом деле намного проще, чем выглядит на первый взгляд. С помощью метода URL.openStream() мы получаем ссылку на поток, через который можем прочитать содержимое страницы. Если вы знаете что такое Java, то остальной код не должен вызывать у вас вопросов. После получения содержимого страницы, провести его анализ уже не составляет труда.

Более сложный случай

Допустим, что прочитать страницу и обработать ее содержимое не так уж сложно, но что делать, если вам нужно сделать, например POST запрос к сайту? Рассмотрим пример, когда у нас есть какой-то сайт и программа должна создать на нем новую тему для обсуждения:

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

public class App {

    public static void main(String[] args) {
        new App().exec();
    }

    public void exec() {
        String message = null;
        try {
            message = URLEncoder.encode("Это сообщение, которое будет размещено где-то!", "UTF-8");
        } catch (UnsupportedEncodingException ex) {
            //...
        }

        try {
            URL url = new URL("http://www.bloop.ru/b/post/"); // Сайт где это будет размещено
            
            HttpURLConnection c = (HttpURLConnection) url.openConnection();            
            c.setRequestMethod("POST");
            c.setDoOutput(true);

            OutputStreamWriter writer = new OutputStreamWriter(c.getOutputStream());
            writer.write("name=MyName&subject=Foo& text=" + message );
            writer.close();

            if (c.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // Все хорошо
            } else {
                // Сервер ответил кодом с ошибкой.
            }
        } catch (MalformedURLException e) {
            // ...
        } catch (IOException e) {
            //
        }
    }

}
Первое  что нас интересует в новом варианте нашей программы это URLEncoder что это такое и зачем оно нужно? Дело в том стандарт URL обладает небольшим недостатком – он поддерживает лишь ограниченный набор символов, причем набор этот даже меньше чем в ASCII. Поэтому чтобы передавать символы национальных алфавитов и служебные символы необходимо закодировать их следующим образом. Сначала перевести их в юникод, а затем представить два байта в шестнадцатеричном виде и поставить перед каждым символ %. Вызов URLEncoder.encode() как раз этим и занимается. Далее мы получаем соединение и выставляем ему метод POST и включаем возможность осуществлять вывод в это соединение. Отправив нужный запрос, мы можем узнать результат соединения, вызвав метод getResponseCode(), который возвращает код соответствующий коду ответ HTTP. При необходимости можно также задавать дополнительные заголовки HTTP запросов с помощью метода HttpURLConnection.setRequestProperty().

Заключение

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

Если Вам понравилась статья, проголосуйте за нее

Голосов: 24  loading...
anabi22   vanya88   koma   Wild_klas   zcmx   rfiodorov   asdfgfdsa   lula   JamesBo   Vlad_Lastname   DanikG   MarianaSemesta   shadow_reawer   YuriiAndrieiev   Giggs13   chehonadskih   akmil   Diesel31ks   SamTan   kubica   vvm64   andrii_lysenko   ifgeny87   cactus09