Веб-сканер Java, это так просто

Java

Это первая статья из серии веб-сканеров Java. Если вы не знакомы с серией веб-сканеров Java, см.Какие базовые знания вам нужны для изучения веб-краулера Java. Первая статья посвящена внедрению поискового робота Java. В этой статье в качестве примера мы берем заголовки новостей и подробные страницы новостей из списка Hupu. Извлекаемый контент показан на следующем рисунке:

Нам нужно извлечь текст, обведенный на рисунке, и соответствующую ссылку.В процессе извлечения мы будем использовать два метода для извлечения: один - метод Jsoup, а другой - метод httpclient + регулярное выражение.Это также два широко используемых метода. с помощью поисковых роботов Java. Не имеет значения, если вы не понимаете эти два метода. Позже будут соответствующие руководства. Прежде чем официально написать программу извлечения, позвольте мне объяснить среду из серии сообщений в блоге об искателе Java. Все демонстрации в этой серии сообщений в блоге созданы с использованием SpringBoot. Независимо от того, какую среду вы используете, вам нужно только импортировать соответствующий пакет правильно.

Извлечение информации с помощью Jsoup

Давайте сначала воспользуемся Jsoup для извлечения новостной информации. Если вы еще не знакомы с Jsoup, см.jsoup.org/

Сначала создайте проект Springboot, имя не является обязательным, и введите зависимость Jsoup в pom.xml.

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.12.1</version>
</dependency>

Что ж, давайте вместе проанализируем страницу, видимо вы ее еще не просматривали,Нажмите здесь, чтобы просмотреть новости Hupu. На странице списка мы используем элемент обзора F12 для просмотра структуры страницы, и после нашего анализа мы обнаружили, что новости списка находятся в<div class="news-list">Под лейблом каждая новость — этоliэтикетке, результаты анализа представлены на следующем рисунке:

Поскольку мы уже знаем селектор css, мы объединяем функцию копирования браузера, чтобы написать нашaКод селектора css для тега:div.news-list > ul > li > div.list-hd > h4 > a, все готово, напишем код для извлечения информации на Jsoup:

/**
 * jsoup方式 获取虎扑新闻列表页
 * @param url 虎扑新闻列表页url
 */
public void jsoupList(String url){
    try {
        Document document = Jsoup.connect(url).get();
        // 使用 css选择器 提取列表新闻 a 标签
        // <a href="https://voice.hupu.com/nba/2484553.html" target="_blank">霍华德:夏休期内曾节食30天,这考验了我的身心</a>
        Elements elements = document.select("div.news-list > ul > li > div.list-hd > h4 > a");
        for (Element element:elements){
//                System.out.println(element);
            // 获取详情页链接
            String d_url = element.attr("href");
            // 获取标题
            String title = element.ownText();

            System.out.println("详情页链接:"+d_url+" ,详情页标题:"+title);

        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Использовать Jsoup для извлечения очень просто, для этого требуется всего 5 или 6 строк кода.Дополнительную информацию о том, как Jsoup извлекает информацию об узлах, см. в руководстве по официальному веб-сайту jsoup. Мы пишем основной метод для выполнения метода jsoupList и проверяем правильность метода jsoupList.

public static void main(String[] args) {
    String url = "https://voice.hupu.com/nba";
    CrawlerBase crawlerBase = new CrawlerBase();
    crawlerBase.jsoupList(url);
}

Выполните основной метод и получите следующие результаты:

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

httpклиент + регулярное выражение

Выше мы использовали метод Jsoup для правильного извлечения новостей из списка Hupu Далее мы используем метод httpclient + регулярное выражение для извлечения и посмотрим, какие проблемы будут связаны с этим методом? В методе httpclient + регулярное выражение задействовано довольно много знаний, включая регулярные выражения, регулярные выражения Java и httpclient. Если вы не знаете этих знаний, вы можете щелкнуть ссылку ниже, чтобы узнать об этом:

Регулярное выражение:регулярное выражение

Регулярное выражение Java:Регулярное выражение Java

httpклиент:httpclient

В файле pom.xml мы представляем пакет Jar, связанный с httpclient.

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.10</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.10</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.5.10</version>
</dependency>

Что касается страницы новостей со списком Hupu, мы провели простой анализ с использованием метода Jsoup и не будем повторять анализ здесь. Для извлечения с использованием регулярных выражений нам нужно найти структуры, представляющие новости списка, такие как:<div class="list-hd"> <h4> <a href="https://voice.hupu.com/nba/2485508.html" target="_blank">直上云霄!魔术官方社媒晒富尔茨扣篮炫酷特效图</a></h4></div>В этой структуре различаются только ссылка и название каждой новости списка, а остальные одинаковые, и<div class="list-hd">специально для списка новостей. Лучше не совпадать напрямуюaярлык, потому чтоaМетки также присутствуют в других местах, поэтому нам также нужно выполнить другую обработку, чтобы увеличить нашу сложность. Теперь, когда мы разобрались с выбором регулярной структуры, давайте посмотрим на код, извлеченный с помощью httpclient + регулярное выражение:

/**
 * httpclient + 正则表达式 获取虎扑新闻列表页
 * @param url 虎扑新闻列表页url
 */
public void httpClientList(String url){
    try {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response = httpclient.execute(httpGet);
        if (response.getStatusLine().getStatusCode() == 200) {
            HttpEntity entity = response.getEntity();
            String body = EntityUtils.toString(entity,"utf-8");
   
            if (body!=null) {
                 /*
                 * 替换掉换行符、制表符、回车符,去掉这些符号,正则表示写起来更简单一些
                 * 只有空格符号和其他正常字体
                 */
                Pattern p = Pattern.compile("\t|\r|\n");
                Matcher m = p.matcher(body);
                body = m.replaceAll("");
                /*
                 * 提取列表页的正则表达式
                 * 去除换行符之后的 li
                 * <div class="list-hd">                                    <h4>                                        <a href="https://voice.hupu.com/nba/2485167.html"  target="_blank">与球迷亲切互动!凯尔特人官方晒球队开放训练日照片</a>                                    </h4>                                </div>
                 */
                Pattern pattern = Pattern
                        .compile("<div class=\"list-hd\">\\s* <h4>\\s* <a href=\"(.*?)\"\\s* target=\"_blank\">(.*?)</a>\\s* </h4>\\s* </div>" );

                Matcher matcher = pattern.matcher(body);
                // 匹配出所有符合正则表达式的数据
                while (matcher.find()){
//                        String info = matcher.group(0);
//                        System.out.println(info);
                    // 提取出链接和标题
                    System.out.println("详情页链接:"+matcher.group(1)+" ,详情页标题:"+matcher.group(2));
                }
            }else {
                System.out.println("处理失败!!!获取正文内容为空");
            }
        } else {
            System.out.println("处理失败!!!返回状态码:" + response.getStatusLine().getStatusCode());
        }
    }catch (Exception e){
        e.printStackTrace();
    }

}

Как видно по количеству строк кода, это намного больше, чем метод Jsoup.Хотя кода много, но в целом он относительно прост.В приведенном выше методе я сделал специальный процесс.Я сначала заменил тело строки, полученное с помощью httpclient. разрывы строк, символы табуляции и возврат каретки, поэтому это может уменьшить некоторые дополнительные помехи при написании регулярных выражений. Затем мы модифицируем основной метод для запуска метода httpClientList.

public static void main(String[] args) {
    String url = "https://voice.hupu.com/nba";
    CrawlerBase crawlerBase = new CrawlerBase();
//        crawlerBase.jsoupList(url);
    crawlerBase.httpClientList(url);
}

Результат работы показан на следующем рисунке:

Метод использования httpclient + регулярное выражение также является правильным для получения ссылки на заголовок и страницу с подробностями списка новостей. На данный момент написана первая статья из серии поисковых роботов Java. Эта статья в основном посвящена введению веб-краулерного Java. Мы использовали jsoup и httpclient + обычный метод для извлечения заголовка новости и ссылки на страницу сведений из списка новостей Hupu. Конечно, есть еще много незавершенного, например, сбор информации о странице сведений и сохранение ее в базе данных.

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

Исходный код:кликните сюда

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

Наконец

Сделайте небольшую рекламу, добро пожаловать, чтобы отсканировать код и подпишитесь на общедоступную учетную запись WeChat: «Технический блог брата Пинтоу», давайте вместе добьемся прогресса.

平头哥的技术博文