Мне всегда было любопытно в Интернете. Раньше я думал о написании гусенита, но мне было лень реализовать его. Я чувствовал, что это была очень неприятная вещь. Если бы произошла небольшая ошибка, мне пришлось бы отлаживать много времени, что было пустой тратой времени.
Позже я подумал, что с тех пор, как я дал себе гарантию рано, я должен сначала реализовать ее, начать с простоты, медленно добавлять функции, реализовать одну, если у меня есть время и оптимизировать код в любое время.
Ниже приведена простая реализация ползания указанной веб -страницы и сохранения ее. На самом деле, есть несколько способов его реализации. Вот несколько реализаций этой функции медленно.
UrlConnection Clawling реализация
Пакет html; импорт java.io.bufferedReader; импорт java.io.fileOutputStream; импорт java.io.fileWriter; Import java.io.ioexception; импорт java.io.inputStreamReader; импорт java.io.outputStreamWriter; импорт java.net.malformedurlexcection; java.net.url; import java.net.urlconnection; открытый класс Spider {public static void main (string [] args) {String filePath = "d: /124.html"; String url_str = "http://www.hao123.com/"; Url url = null; try {url = new url (url_str); } catch (malformedurlexception e) {e.printstacktrace (); } String charset = "utf-8"; int sec_cont = 1000; try {urlconnection url_con = url.openconnection (); url_con.setDoOutput (true); url_con.setreadtimeout (10 * sec_cont); url_con.setrequestproperty ("пользователь-агент", "mozilla/4.0 (совместимо; msie 7.0; Windows NT 5.1)"); Inputstream htm_in = url_con.getinputstream (); String htm_str = inputstream2string (htm_in, charset); savehtml (filepath, htm_str); } catch (ioException e) {e.printstackTrace (); }} /** * Метод: savehtml * Описание: Сохранить строку для файла * @param filepath * pail pail, который необходимо сохранить * @param str * String saved * /public static void saiphtml (String filePath, String Str) {try { / * @suppresswarnings ("resource") fileWriter fw = new FileWriter (filePath); fw.write (str); fw.flush ();*/ outputstreamwriter outs = new outputstreamwriter (new FileOutputStream (filePath, true), "UTF-8"); outs.write (str); System.out.print (str); outs.close (); } catch (ioException e) {System.out.println ("Ошибка при сохранении html ..."); e.printstacktrace (); }} / ** * Метод: inputStream2String * Описание: Сделайте inputStream для строки * @param in_st * inputstream, который необходимо преобразовать * @param charset * encoder значения * @Throws ioException * Если возникнет ошибка * / public Static StringStreamSstring (inputStream in_st, строковый charset) InputStreamReader (in_st, charset)); StringBuffer res = new StringBuffer (); String line = ""; while ((line = buff.readline ())! = null) {res.append (line); } return res.toString (); }}В процессе реализации проблема искаженных китайских кодов ползанных веб -страниц является относительно неприятной вещью.
Httpclient Clawling Реализация
Httpclient столкнулся с множеством проблем при ползании веб -страниц. Во-первых, есть две версии httpclient, одна-встроенное солнце, а другая-проект открытого исходного кода для Apache. Похоже, что Sun не встроено, поэтому я не реализовал его, но принял проект Apache Open Source (упомянутый позже HTTPClient относится к версии Apache с открытым исходным кодом); Во -вторых, при использовании httpclient последняя версия отличается от предыдущей версии. После версии httpclient 4.x импортированные пакеты разные. Многие детали, найденные в Интернете, являются версией httpclient 3.x, поэтому, если вы используете последнюю версию, лучше посмотреть файл справки.
Я использую Eclipse и должен настроить среду для импорта эталонного пакета.
Во -первых, скачать httpclient, адрес: http://hc.apache.org/downloads.cgi, я использую httpclient версию 4.2.
Затем, unzip, найдите Commons-codec-1.6.jar, Commons-Logging-1.1.jar, httpclient-4.2.5.jar, httpcore-4.2.4.jar в папке /lib (номер версии варьируется в зависимости от необходимой в зависимости от необходимых);
Наконец, добавьте приведенный выше файл JAR в ClassPath, то есть щелкните правой кнопкой мыши файл проекта => bulid path => Настройка пути Build => добавить внешнюю JAR .., а затем добавьте приведенный выше пакет.
Другим методом является непосредственное копирование приведенного выше пакета в папку LIB в папке проекта.
Вот код реализации:
пакет html; import java.io.bufferedreader; import java.io.fileoutputstream; импорт java.io.ioexception; import java.io.inputStreamReader; импорт java.io.inputStreamReader; importpentity; org.apache.http.httpresponse; import org.apache.http.client.*; import org.apache.http.client.methods.httpget; import org.apache.http.impl.client.defaulthtpclient; public class spiderhtpclient {public static void void void void void void void void void // TODO Автопогенерированный метод СТРЕЗИНГ СТРУБКА URL_STR = "http://www.hao123.com"; String charset = "utf-8"; String filePath = "d: /125.html"; Httpclient hc = new Defaulthttpclient (); Httpget hg = new httpget (url_str); Httpresponse response = hc.execute (hg); Httpentity entity = response.getentity (); Inputstream htm_in = null; if (Entity! = null) {System.out.println (entity.getContentLength ()); htm_in = entity.getContent (); String htm_str = inputstream2string (htm_in, charset); savehtml (filepath, htm_str); }} /** * Метод: savehtml * Описание: Сохранить строку для файла * @param filepath * pail pail, который необходимо сохранить * @param str * String saved * /public static void saiphtml (String filePath, String Str) {try { / * @suppresswarnings ("resource") fileWriter fw = new FileWriter (filePath); fw.write (str); fw.flush ();*/ outputstreamwriter outs = new outputstreamwriter (new FileOutputStream (filePath, true), "UTF-8"); outs.write (str); outs.close (); } catch (ioException e) {System.out.println ("Ошибка при сохранении html ..."); e.printstacktrace (); }} / ** * Метод: inputStream2String * Описание: Сделайте inputStream для строки * @param in_st * inputstream, который необходимо преобразовать * @param charset * encoder значения * @Throws ioException * Если возникнет ошибка * / public Static StringStreamSstring (inputStream in_st, строковый charset) InputStreamReader (in_st, charset)); StringBuffer res = new StringBuffer (); String line = ""; while ((line = buff.readline ())! = null) {res.append (line); } return res.toString (); }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.