На раннем этапе мы просканировали заголовок по этой ссылке:
http://www.zhihu.com/explore/recommendations
Но очевидно, что эта страница не может получить ответ.
Полная страница вопросов будет выглядеть так:
http://www.zhihu.com/question/22355264
Присмотревшись, ага, наш класс инкапсуляции необходимо дополнительно упаковать. По крайней мере, для хранения описания вопроса необходим вопрос:
импортировать java.util.ArrayList;
общественный класс Чжиху {
публичная строка вопрос // вопрос;
public String questionsDescription // Описание вопроса;
public String zhihuUrl;//Ссылка на веб-страницу
public ArrayList<String> Answers // Массив для хранения всех ответов;
// Конструктор инициализирует данные
общественный Чжиху () {
вопрос = "";
ВопросОписание = "";
zhihuUrl = "";
ответы = новый ArrayList<String>();
}
@Override
публичная строка toString() {
return «Вопрос:» + вопрос + «/n» + «Описание:» + описание вопроса + «/n»
+ "Ссылка:" + zhihuUrl + "/nответ:" + ответы + "/n";
}
}
Мы добавляем параметр в конструктор Zhihu, чтобы установить значение URL-адреса. Поскольку URL-адрес определен, можно записать описание и ответ на вопрос.
Давайте изменим метод получения объектов Zhihu в Spider и будем получать только URL-адрес:
static ArrayList<Zhihu> GetZhihu(String content) {
// Предварительно определяем ArrayList для хранения результатов
Результаты ArrayList<Zhihu> = новый ArrayList<Zhihu>();
// Используется для сопоставления URL-адреса, который является ссылкой на вопрос
Шаблон urlPattern = Pattern.compile("<h2>.+?question_link.+?href=/"(.+?)/".+?</h2>");
Сопоставитель urlMatcher = urlPattern.matcher(content);
// Есть ли успешный совпадающий объект
логическое значение isFind = urlMatcher.find();
в то время как (isFind) {
//Определяем объект Zhihu для хранения захваченной информации
Чжиху zhihuTemp = новый Чжиху(urlMatcher.group(1));
//Добавляем успешные результаты сопоставления
результаты.add(zhihuTemp);
// Продолжаем поиск следующего подходящего объекта
isFind = urlMatcher.find();
}
возврат результатов;
}
Далее, используя метод построения Чжиху, получите все подробные данные через URL-адрес.
Сначала нам нужно обработать URL-адрес, потому что для некоторых ответов его URL-адрес:
http://www.zhihu.com/question/22355264/answer/21102139
Некоторые из них относятся к конкретной проблеме, и их URL-адрес:
http://www.zhihu.com/question/22355264
Тогда нам, очевидно, нужен второй тип, поэтому нам нужно использовать обычные правила, чтобы разрезать ссылку первого типа на второй тип. Это можно сделать, написав функцию на Zhihu.
// обрабатываем URL
логическое значение getRealUrl(String URL) {
// Изменить http://www.zhihu.com/question/22355264/answer/21102139
//Преобразовать в http://www.zhihu.com/question/22355264
// В противном случае никаких изменений
Шаблон шаблона = Pattern.compile("question/(.*?)/");
Matcher matcher = шаблон.matcher(url);
если (matcher.find()) {
zhihuUrl = "http://www.zhihu.com/question/" + matcher.group(1);
} еще {
вернуть ложь;
}
вернуть истину;
}
Следующим шагом будет получение различных частей.
Давайте сначала посмотрим на заголовок:
Просто поймите этот класс в обычной форме. Обычный оператор можно записать так: zm-editable-content/">(.+?)<.
Запустите его, чтобы увидеть результаты:
Ох, неплохо.
Далее возьмите описание проблемы:
Ага, принцип тот же, захватываем класс, потому что он должен быть уникальным идентификатором this.
Метод проверки: щелкните правой кнопкой мыши, чтобы просмотреть исходный код страницы, нажмите ctrl+F, чтобы увидеть, есть ли на странице другие строки.
Позже, после проверки, что-то действительно пошло не так:
Класс перед заголовком и содержанием описания один и тот же.
Это можно повторить, только изменив обычный шаблон:
// совпадение заголовка
шаблон = Pattern.compile("zh-question-title.+?<h2.+?>(.+?)</h2>");
сопоставитель = шаблон.сопоставитель(содержание);
если (matcher.find()) {
вопрос = matcher.group(1);
}
// Описание совпадения
шаблон=Шаблон
.compile("zh-question-detail.+?<div.+?>(.*?)</div>");
сопоставитель = шаблон.сопоставитель(содержание);
если (matcher.find()) {
вопросОписание = matcher.group(1);
}
Последнее, что нужно сделать, это выполнить цикл, чтобы получить ответ:
Предварительное предварительное регулярное заявление: /answer/content.+?<div.+?>(.*?)</div>
После изменения кода мы обнаружим, что программное обеспечение работает значительно медленнее, поскольку ему необходимо посещать каждую веб-страницу и фиксировать ее содержимое.
Например, если редактор рекомендует 20 вопросов, то вам нужно посетить веб-страницу 20 раз, и скорость снизится.
Попробуйте, выглядит хорошо:
Хорошо, давайте пока оставим это так~ В следующий раз мы продолжим вносить некоторые детальные настройки, такие как многопоточность, локальная запись потоков ввода-вывода и т. д.
Прилагаем исходный код проекта:
Жиху.java
импортировать java.util.ArrayList;
импортировать java.util.regex.Matcher;
импортировать java.util.regex.Pattern;
общественный класс Чжиху {
публичная строка вопрос // вопрос;
public String questionsDescription // Описание вопроса;
public String zhihuUrl;//Ссылка на веб-страницу
public ArrayList<String> Answers // Массив для хранения всех ответов;
// Конструктор инициализирует данные
общественный Чжиху (строковый URL) {
//Инициализируем свойства
вопрос = "";
ВопросОписание = "";
zhihuUrl = "";
ответы = новый ArrayList<String>();
// Определяем, является ли URL-адрес законным
если (getRealUrl(url)) {
System.out.println("сканирование" + zhihuUrl);
// Получить подробную информацию о вопросе и ответе на основе URL-адреса
Строковое содержимое = Spider.SendGet(zhihuUrl);
Узорный узор;
Сопоставитель;
// совпадение заголовка
шаблон = Pattern.compile("zh-question-title.+?<h2.+?>(.+?)</h2>");
сопоставитель = шаблон.сопоставитель(содержание);
если (matcher.find()) {
вопрос = matcher.group(1);
}
// Описание совпадения
шаблон=Шаблон
.compile("zh-question-detail.+?<div.+?>(.*?)</div>");
сопоставитель = шаблон.сопоставитель(содержание);
если (matcher.find()) {
вопросОписание = matcher.group(1);
}
// Соответствующий ответ
шаблон = Pattern.compile("/ответ/content.+?<div.+?>(.*?)</div>");
сопоставитель = шаблон.сопоставитель(содержание);
логическое значение isFind = matcher.find();
в то время как (isFind) {
ответы.добавить(матчер.группа(1));
isFind = matcher.find();
}
}
}
// Получите свои собственные вопросы, описания и ответы на основе вашего собственного URL-адреса
общедоступное логическое значение getAll() {
вернуть истину;
}
// обрабатываем URL
логическое значение getRealUrl(String URL) {
// Изменение http://www.zhihu.com/question/22355264/answer/21102139
//Преобразовать в http://www.zhihu.com/question/22355264
// В противном случае никаких изменений
Шаблон шаблона = Pattern.compile("question/(.*?)/");
Matcher matcher = шаблон.matcher(url);
если (matcher.find()) {
zhihuUrl = "http://www.zhihu.com/question/" + matcher.group(1);
} еще {
вернуть ложь;
}
вернуть истину;
}
@Override
публичная строка toString() {
return «Вопрос:» + вопрос + «/n» + «Описание:» + описание вопроса + «/n»
+ "Ссылка:" + zhihuUrl + "/nAnswer:" + Answers.size() + "/n";
}
}
Паук.java
импортировать java.io.BufferedReader;
импортировать java.io.InputStreamReader;
импортировать java.net.URL;
импортировать java.net.URLConnection;
импортировать java.util.ArrayList;
импортировать java.util.regex.Matcher;
импортировать java.util.regex.Pattern;
общественный класс Паук {
статическая строка SendGet (URL-адрес строки) {
//Определяем строку для хранения содержимого веб-страницы
Строковый результат = "";
//Определяем буферизованный поток ввода символов
BufferedReader в = ноль;
пытаться {
//Преобразуем строку в объект URL
URL-адрес realUrl = новый URL-адрес (url);
// Инициализируем ссылку на этот URL
Соединение URLConnection = realUrl.openConnection();
// Запускаем фактическое соединение
соединение.подключиться();
//Инициализируем входной поток BufferedReader для чтения ответа URL
in = новый BufferedReader (новый InputStreamReader (
Connection.getInputStream(), "UTF-8");
// Используется для временного хранения данных каждой захваченной строки
Струнная линия;
while ((line = in.readLine()) != null) {
// Проходим каждую захваченную строку и сохраняем ее в результате
результат += строка;
}
} catch (Исключение е) {
System.out.println("Исключение при отправке запроса GET!" + e);
е.printStackTrace();
}
// Используйте наконец, чтобы закрыть входной поток
окончательно {
пытаться {
если (в != ноль) {
в.закрыть();
}
} catch (Исключение e2) {
e2.printStackTrace();
}
}
вернуть результат;
}
// Получите весь контент Zhihu, рекомендованный редакторами
static ArrayList<Zhihu> GetRecommendations(String content) {
// Предварительно определяем ArrayList для хранения результатов
Результаты ArrayList<Zhihu> = новый ArrayList<Zhihu>();
// Используется для сопоставления URL-адреса, который является ссылкой на вопрос
Узор Узор = Узор
.compile("<h2>.+?question_link.+?href=/"(.+?)/".+?</h2>");
Matcher matcher = шаблон.matcher(content);
// Есть ли успешный совпадающий объект
Логическое значение isFind = matcher.find();
в то время как (isFind) {
//Определяем объект Zhihu для хранения захваченной информации
Чжиху zhihuTemp = новый Чжиху(matcher.group(1));
//Добавляем успешные результаты сопоставления
результаты.add(zhihuTemp);
// Продолжаем поиск следующего подходящего объекта
isFind = matcher.find();
}
возврат результатов;
}
}
Main.java
импортировать java.util.ArrayList;
общественный класс Main {
public static void main(String[] args) {
// Определить ссылку, которую нужно посетить
Строковый URL = "http://www.zhihu.com/explore/recommendations";
//Открываем ссылку и получаем содержимое страницы
Строковое содержимое = Spider.SendGet(url);
// Получаем рекомендации редактора
ArrayList<Zhihu> myZihu = Spider.GetRecommendations(content);
// распечатываем результаты
System.out.println(myZhihu);
}
}
Выше приведена вся запись о получении ответов Чжиху. Она очень подробная. Друзья, нуждающиеся в помощи, могут обратиться к ней.