В то время как Python, возможно, является языком номер один для использования, когда дело доходит до веб-скрейпинга, старый добрый JAVA имеет свои преимущества. По крайней мере, для такого JAVA-разработчика, как я, который еще не очень хорошо разбирался в Python. Если вы спешите, не волнуйтесь. Полный код находится в конце этого поста.

Во всяком случае, я хотел выяснить, как сделать веб-краулер с JAVA, просто ради лулзов. Оказывается. Это было намного проще, чем ожидалось. Прежде всего вам нужно скачать jsoup (то есть вам также нужно запустить новый проект JAVA)



Теперь, как только IntelliJ сделал свое волшебство, создав ваш проект, вы помещаете загруженный файл jsoup .jar в корень проекта.

Теперь пришло время добавить несколько хороших принципов программирования, верно? импорт, необходимый для этого проекта:

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.IOException;
import java.util.ArrayList;

Далее — его константа времени. Я решил индексировать ссылки (hrefs) на веб-сайте CNN. Я выбрал CNN, потому что я не большой поклонник новостей FOX.

public class Crawler {
    public static final String CNN = "https://edition.cnn.com/";
public static void main(String[] args) {
System.out.println("Web Crawler ")
 }
}

И тогда нам нужны два метода, использующие кластерные методы из библиотеки jsoup.

Первый — это рекурсивный метод, который индексирует «a href=» указанной страницы. Чтобы метод не зависал в бесконечности, как хороший рекурсивный метод, я решил остановить его на два уровня ниже.

private static void crawl (int level, String url, ArrayList<String> visited) {
    if(level <=2 ) {
        Document doc = request(url, visited);
        if (doc!= null) {
            for (Element link : doc.select("a[href]")) {
                 String next_link = link.absUrl("href");
                 if(visited.contains(next_link) == false) {
                     crawl(level++, next_link, visited);
                 }
            }
        }
    }
}

Затем нам нужен метод Document, который проверяет соединение и возвращает строку «Ссылка» + проиндексированный URL-адрес.

private static Document request(String url, ArrayList<String> v) {
    try {
        Connection con = Jsoup.connect(url);
        Document doc = con.get();
        if(con.response().statusCode() == 200) {
            System.out.println("Link: " + url);
            System.out.println(doc.title());
            v.add(url);
            return doc;
        }
        return null;
    } catch (IOException e) {
        return null;
    }
}

Наконец, полный код готов к запуску.

package.com.company
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class Crawler {
    public static final String CNN = "https://edition.cnn.com/";


    public static void main(String[] args) {
      String url = CNN;
        crawl(1, url, new ArrayList<String>());

    }
    
    private static void crawl (int level, String url, ArrayList<String> visited) {
        if(level <=2 ) {
            Document doc = request(url, visited);
            if (doc!= null) {
                for (Element link : doc.select("a[href]")) {
                     String next_link = link.absUrl("href");
                     if(visited.contains(next_link) == false) {
                         crawl(level++, next_link, visited);
                     }
                }
            }
        }
    }
    private static Document request(String url, ArrayList<String> v) {
        try {
            Connection con = Jsoup.connect(url);
            Document doc = con.get();
            if(con.response().statusCode() == 200) {
                System.out.println("Link: " + url);
                System.out.println(doc.title());
                v.add(url);
                return doc;
            }
            return null;
        } catch (IOException e) {
            return null;
        }
    }
}

Ваше здоровье!