Java Multi Link Checker Spider - необходимы улучшения - PullRequest
2 голосов
/ 17 ноября 2010

У меня есть следующий рабочий код (измененный здесь и там, чтобы вы использовали свой мозг при копировании и вставке)Я хотел бы улучшить его, чтобы он обнаруживал все недействительные страницы, включая домены для продажи.Работает с эффективностью около 89%.Если вы видите что-то, что я мог бы улучшить, используя дополнительные существующие библиотеки или небольшие изменения, это было бы здорово.

 List all = linkService.getAllLinks();
    notValidLinks = new LinkedList();
    final ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(39867);
    int poolSize = 90;
    int maxPoolSize = 100;
    long keepAliveTime = 40;
    ThreadPoolExecutor tpe = new ThreadPoolExecutor(poolSize, maxPoolSize,
            keepAliveTime, TimeUnit.SECONDS, queue);

    for (link : all) {
       Thread task = new CheckSite(link);
       tpe.execute(task);
       System.out.println("Task count:" + queue.size());
    }

class CheckSite extends Thread {
    Link link;

    CheckSite(Link link) {
        this.link = link;
    }

    public void run() {
        boolean notValid = false;
        try {
            log.info(link.getLink() + " " + link.getId());
            URL u = new URL(link.getLink());
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            HttpURLConnection.setFollowRedirects(false);
            huc.setConnectTimeout(40000);
            huc.setRequestMethod("GET");
            huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");

            huc.connect();
            int code = huc.getResponseCode();

            if (code != HttpURLConnection.HTTP_OK
                    && code != HttpURLConnection.HTTP_MOVED_PERM
                    && code != HttpURLConnection.HTTP_MOVED_TEMP ){
                notValid = true;
                log.info("Invalid code: " + code + " - " + link.getLink());
            }
            if (code == HttpURLConnection.HTTP_MOVED_PERM) {
                log.info(link.getLink() + " Perm move");
            }
            if (code == HttpURLConnection.HTTP_MOVED_TEMP) {
                log.info(link.getLink() + " Temp move");
            }

            try {
                if (!notValid) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(huc.getInputStream()));
                    StringBuilder stringBuilder = new StringBuilder();

                    String line;
                    while ((line = reader.readLine()) != null) {
                        stringBuilder.append(line);
                    }

                    notValid = StringUtils.containsIgnoreCase(Jsoup.parse(stringBuilder.toString()).text(), "Related Searches");

                }
            } catch (Exception e) {
                   log.error(e.getMessage());
            }

            huc.disconnect();
        } catch (MalformedURLException me) {
            log.info("Malformed URL:" + link.getLink());
            notValid = true;
        } catch (IOException e) {
            log.info("Refused connection | Does not exist:" + link.getLink());
            notValid = true;
        }
        if (notValid) {
            link.setApproved(false);
            link.setDateApproved(null);
            notValidLinks.add(linkService.save(link));

        }
        log.debug("URL Finieshed!");
    }
}

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Извлечение Фильтр Блума [wiki] . Это поможет вам быстро и эффективно использовать память. Проблема с фильтром Блума заключается в том, что он будет давать ложные срабатывания, т.е. он скажет истину для вещей, которых там нет. Но если фильтр Блума говорит ложь, это точно ложь.

1 голос
/ 17 ноября 2010

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

Я подозреваю, что выделенная часть нецелесообразна.Как паук должен быть в состоянии сказать, что домен продается?

СЛЕДУЙТЕ ЗА *

@ Мат Баник предлагает поиск определенной фразы или проверку записей DNSкак возможные решения.

  • Эвристика, которая проверяет определенную фразу, даст ложные срабатывания и ложные отрицания.

  • Проверка записей DNS будет сложной задачейбыть хитрым в Java.Вы можете выполнить простой поиск DNS по части имени узла в URL-адресе и сравнить полученный IP-адрес с известным списком IP-адресов парковочных сайтов DNS.Но это не говорит вам, если оригинальное имя хоста действительно продается.Это может быть реальный сайт, размещенный в той же инфраструктуре ... или припаркованный домен, который НЕ продается.

Но я думаю, если вы готовы принять некоторые ложные срабатывания инегативов, тогда можно попытаться отфильтровать домены для продажи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...