Dmestro
@Dmestro
frontend developer

Как в осуществить переход ко внутрреним ссылкам сайта через java.net.Socket?

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

import java.io.IOException;
import java.util.Set;



public class Main {
    public static void main(String[] args) throws IOException {

        String url ="ssau.ru"; //как пример
        int port = 80;

        LinksParser linksParser = new LinksParser(url,port);
        Set<String> set = linksParser.getLinks();


        for (String s : set) {
            LinksParser lp  = new LinksParser(s,port);
            set.addAll(lp.getLinks());
        }

    }
}


import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class LinksParser {
    private String url;
    private int port;
   
    public LinksParser(String url){
        this.url = url;
        this.port = 80;
       

    }

    public LinksParser(String url, int port){
        this(url);
        this.port = port;
    }


    public Set<String> getLinks() throws IOException {
        Set<String> set = new HashSet<>();
        Socket socket  = new Socket(url,80);
        Scanner reader = new Scanner(socket.getInputStream());
        PrintWriter writer = new PrintWriter(socket.getOutputStream());
        writer.println("GET / HTTP/1.1");
        writer.print("Host: ");
        writer.println(url);
        writer.println("");
        writer.flush();
        
        String response ="";
        while (reader.hasNext()){
            response+=reader.nextLine();
        }
        System.out.println(response);
        Pattern pattern = Pattern.compile("(?<=(?i)href\\s{0,1}=\\s{0,1}\").*?(?=\")");
        Matcher matcher = pattern.matcher(response);
        while (matcher.find()){
            String link = matcher.group();
            if(link.contains(".")||link.contains("mailto:")) continue;
            if(!link.contains(url)) link = url+link;
            if(link.contains("#")){
                int index = link.indexOf("#");
                link = link.substring(0,index);

            }
            if(!set.contains(link))set.add(link);


        }

        writer.close();
        reader.close();
        socket.close();
        return set;
    }


}

Но при попытке перехода по одной из полученных ссылок вылетает исключение:

Exception in thread "main" java.net.UnknownHostException: ssau.ru/education/abitur/
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at java.net.Socket.connect(Socket.java:538)
	at java.net.Socket.<init>(Socket.java:434)
	at java.net.Socket.<init>(Socket.java:211)
	at LinksParser.getLinks(LinksParser.java:33)
	at Main.main(Main.java:25)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)


Подходящего ответа не нашел, пожалуйста, помогите разобраться, что здесь не так? Задача учебная, поэтому сторонние библиотеки использовать нельзя.
  • Вопрос задан
  • 537 просмотров
Решения вопроса 1
@moryakov
Сокет использовать обязательно?
Если нет - попробуйте HttpURLConnection
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы