Сегодня компании необходимо сделать некоторый соскобание данных после запроса на указанном веб -сайте, поэтому потребовалось некоторое время, чтобы написать демонстрацию для демонстрационного использования.
Идея очень проста: она состоит в том, чтобы получить доступ к ссылке через Java, затем получить строку HTML, а затем анализировать необходимые данные, такие как ссылка. Технически, JSoup удобен для анализа страниц. Конечно, JSoup очень удобен и прост. Вы можете знать, как использовать его только с одной строкой кода:
Document DOC = jSoup.connect ("http://www.oschina.net/") .data ("Query", "java") // Запрос параметров.отагинга ("i 'm jsoup") // Установить пользователь-агент .cookie ("auth", "token") // set cookie .timeout. // Использовать метод публикации для доступа к URL Весь процесс реализации описан ниже:
1. Проанализируйте страницы, которые необходимо проанализировать:
Веб -сайт: http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicindexquery
страница:
Сначала сделайте запрос на этой странице: наблюдайте за запрошенным URL, параметрами, методом и т. Д.
Здесь мы используем встроенный инструмент разработчика (клавиша сочетания F12), и ниже приведены результаты запроса:
Мы можем увидеть URL, метод и параметры. Узнав, как или запрос URL, я начну код ниже. Чтобы повторно использовать и расширить, я определил несколько классов:
1. Правило. Ява используется для указания URL -адреса запроса, метода, параметров и т. Д.
пакет com.zhy.spider.rule; / ** * Класс правила * * @author zhy * */ public class rule {/ ** * link */ private string url; / ** * Сбор параметров */ private String [] params; / *** Значения, соответствующие параметру*/ private String [] значения; / ** * Для возвращенного HTML, пожалуйста, установите введите первый */ частная строка ResultTagname; / ** * class / id / selection * Установите тип ResultTagName, по умолчанию в ID * / private int type = id; / ** *GET / POST *Тип запроса, по умолчанию get * / private int requestMoethod = get; Public Final Static int get = 0; Public Final Static Int Post = 1; Public Final Static Int Class = 0; Public Final Static Int ID = 1; публичный окончательный статический отбор int = 2; public rule () {} public rule (string url, string [] params, string [] значения, строка resultTagname, int type, int requestmoethod) {super (); this.url = url; this.params = params; this.values = values; this.resulttagname = resultTagname; this.type = type; this.requestmoethod = requestmoethod; } public String getUrl () {return url; } public void seturl (string url) {this.url = url; } public String [] getParams () {return params; } public void setParams (String [] params) {this.params = params; } public String [] getValues () {return Values; } public void setValues (string [] values) {this.values = values; } public String getResultTagName () {return resultTagname; } public void setResultTagName (string resultTagName) {this.ResultTagName = resultTagName; } public int getType () {return type; } public void settype (int type) {this.type = type; } public int getRequestMoethod () {return requestMoethod; } public void setRequestmoethod (int requestMoethod) {this.requestmoethod = requestmoethod; }}Позвольте мне кратко поместить: этот класс правил определяет всю необходимую информацию в процессе запроса, которая облегчает наше расширение и повторное использование кода. Нам невозможно написать набор кода для каждого веб -сайта, который нужно ползти.
2. Требуемый объект данных, в настоящее время нуждается только в ссылках, Linktypenata.java
пакет com.zhy.spider.bean; открытый класс Linktypenata {Private Int ID; / *** Адрес ссылки*/ частная строка Linkref; / *** Название ссылки*/ private String Linktext; / *** Сводка*/ Краткое изложение приватной строки; / *** Контент*/ частное строковое содержимое; public int getId () {return id; } public void setId (int id) {this.id = id; } public String getLinkHref () {return LinkHref; } public void setLinkHref (String linkHref) {this.LinkHref = linkHref; } public String getLinkText () {return LinkText; } public void SetLinkText (String LinkText) {this.LinkText = linkText; } public String getSummary () {return Summary; } public void setSummary (string summary) {this.summary = summary; } public String getContent () {return Content; } public void setContent (String Content) {this.content = content; }} 3. Класс основных запросов: ExtractService.java
пакет com.zhy.spider.core; импортировать java.io.ioexception; импортировать java.util.arraylist; импортировать java.util.list; импортировать java.util.map; импортировать javax.swing.plaf.textui; Импорт org.jsoup.connection; Импорт org.jsoup.jsoup; Импорт org.jsoup.nodes.document; Импорт org.jsoup.nodes.element; Импорт org.jsoup.select.elements; Импорт com.zhy.spider.bean.linktypenata; Импорт com.zhy.spider.rule.rule; Импорт com.zhy.spider.rule.ruleexception; Импорт com.zhy.spider.util.textutil; / ** * * * @author zhy * */ public class extractservice {/ ** * @param rule * @return */ public static list <linktypenata> extract (правило правила) {// Выполнить необходимую проверку правила valyaterule (rule); Список <linktypenata> dataS = new ArrayList <Linktypenata> (); Linktypedata data = null; try { / ** * parse rule * / string url = rule.geturl (); String [] params = rule.getParams (); String [] values = rule.getValues (); String resultTagName = ruge.getResultTagName (); int type = rule.getType (); int requestType = rug.getRequestmoethod (); Соединение conn = jsoup.connect (url); // Установить параметры запроса if (params! = Null) {for (int i = 0; i <params.length; i ++) {conn.data (params [i], values [i]); }} // Установите тип запроса документ doc = null; switch (requestype) {case rule.get: doc = conn.timeout (100000) .get (); перерыв; Правило корпуса.post: doc = conn.timeout (1000000) .post (); перерыв; } // обработать элементы возврата данных результаты = new Elements (); switch (type) {case rule.class: results = doc.getelementsbyclass (resultTagname); перерыв; корпус правила. ID: element result = doc.getElementById (resultTagname); Results.Add (результат); перерыв; Правило случая. Выбор: Результаты = DOC.Select (ResultTagName); перерыв; по умолчанию: // Когда ResultTagName пустое, тег тела устарел, если (textutil.isempty (resultTagname)) {results = doc.getElementsbytag ("body"); }} for (element result: results) {elements links = result.getElementsbytag ("a"); для (ссылка на элемент: ссылки) {// требуемая строка фильтра linkhref = link.attr ("href"); String linkText = link.text (); data = new Linktypenata (); data.setlinkhref (linkhref); data.setlinktext (linktext); data.add (data); }}} catch (ioException e) {e.printstacktrace (); } return DataS; } / *** Выполните необходимую проверку в переданных параметрах* / private static void validaterule (правило правила) {string url = rule.geturl (); if (textutil.isempty (url)) {бросить новое ruleexception («URL не может быть пустым!»); } if (! url.startSwith ("http: //")) {бросить новое ruleexception ("url неверен!"); } if (rug.getParams ()! = null && rule.getValues ()! = null) {if (rule.getParams (). Length! = Rule.getValues (). Length) {Through New RuleException («ключевое значение параметра не соответствует количеству ключей и значений!»); }}}}} 4. Используется класс исключений: ruleexception.java
пакет com.zhy.spider.rule; Public Class RuleException расширяет runtimeexception {public ruleexception () {super (); // TODO Auto Generated Constructor Stub} public ruleexception (String Message, Throwable Canie) {super (сообщение, причина); // TODO Auto Generated Constructor Stub} public ruleexception (String Message) {super (сообщение); // TODO Автогенерированный конструктор stub} public ruleexception (бросаемая причина) {super (canes); // TODO Auto Generated Constructor Stub}} 5. Наконец, это тест: здесь используются два веб -сайта, и используются разные правила. Пожалуйста, смотрите код для деталей.
пакет com.zhy.spider.test; импортировать java.util.list; Импорт com.zhy.spider.bean.linktypenata; Импорт com.zhy.spider.core.extractservice; Импорт com.zhy.spider.rule.rule; Общедоступный тест класса { @org.junit.test public void getDatasbyclass () {rule правила = новое правило ("http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicindexquery", new String [] {"Query.EnterPriseName", "Query -", "Query -", "QuerySeName", "QuerySeName" Новая строка [] {"xingwang", "}," cont_right ", ruge.class, ruge.post); list <linktypedata> extracts = extractservice.extract (rule); printf (extracts);} @org.junit.test public void getDatasbycssquery () {rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = rule = правило Правило ("http://www.11315.com/search", новая строка [] {"name"}, новая строка [] {"xingwang"}, "div.g-mn div.con-model", правило printf (linktypenata> data) Результат вывода:
Shenzhen Netxing Technology Co., Ltd. http://14603257.11315.com ************************************* Кафе# *************************** ***************************************
Наконец, используйте новости Baidu, чтобы проверить наш код: это означает, что наш код универсален.
/*** Используйте Baidu News, только установите URL и ключевые слова и типы возврата*/ @org.junit.test public void getDatasbycssqueryuserbaidu () {правило правило = новое правило ("http://news.baidu.com/ns", новая строка [] {"word", new String [] {alipay " Ruge.get); Список <linktypenata> extracts = extractservice.extract (rule); printf (выдержки); } Мы устанавливаем только ссылки, ключевые слова и типы запросов и не устанавливаем конкретные условия фильтра.
Результат: несомненно, есть определенные нежелательные данные, но необходимые данные должны заполняться. Мы можем установить правило.
Сортировать по времени/ns? Word = alipay & IE = UTF-8 & bs = alipay & sr = 0 & cl = 2 & rn = 20 & tn = news & ct = 0 & clk = sortbytime ***************************** Фонд с несколькими сторонами, чтобы инвестировать 40 миллионов в первую партию http://finance.ifeng.com/a/20140409/12081871_0.shtml ***************************** news/ns?word=%E6%94%AF%E4%BB%98%E5%AE%9D+cont:2465146414%7C697779368%7C3832159921&same=7&cl=1&tn=news&rn=30&fm=sd *************************************** Baidu снимок http://cache.baidu.com/c?m=9D78D513D9D437AB4F9E91697D1CC0161D4381132BA7D3020CD0870FD33A541 B0120A1AC26510D19879E20345DFE1E4BEA876D26605F75A09BBFD91782A6C1352F8A2432721A844A0FD019ADC 1452FC423875D9DAD0EE7CDB168D5F18C & P = C96EC64AD48B2DEF49BD9B780B64 & NEWP = C4769A4790934EA95EA28E 281C4092695912C10E3DD796 & USER = BAIDU & FM = SC & QUERY =%D6%A7%B8%B6%B1%A6 & QID = A400F3660007A6C5 & P1 = 1 ******************************************************* ***************************************** снимок http://cache.baidu.com/c?m=9F65CB4A8C8507ED4FECE7631050803743438014678387492AC3933FC239045C1C3AA5EC 677E4742CE932B2152F4174BED843670340537B0EFCA8E57DFB08F29288F2C367117845615A71BB8CB31649B66CF04FDEA44 A7ECFF25E5AAC5A0DA4323C044757E97F1FB4D7017DD1CF4 & P = 8B2A970D95DF11A05AA4C32013 & NEWP = 9E39C64AD4DD50FA40 BD9B7C5253D8304503C52251D5CE042ACC & USER = BAIDU & FM = SC & QUERY =%D6%A7%B8%B6%B1%A6 & QID = A400F36660007A6C5 и P1 = 2 ***************************************
Если есть какие -либо недостатки, вы можете указать на них; Если вы думаете, что это полезно для вас, попробуйте ~~ хаха
Загрузите исходный код, нажмите здесь.
Выше приведено примером получения информации о хлизке Java. Мы будем продолжать добавлять соответствующую информацию в будущем. Спасибо за поддержку этого сайта!