Технический взгляд: Краулер и НЛП для проведения текстовой аналитики веб-сайта

Веб-краулинг — это техника, используемая для извлечения корневого и связанного с ним содержимого (HTML, видео, изображения и т.д.) с веб-сайтов на локальный диск. Это позволяет применять НЛП для анализа содержимого и получения важных сведений. В этой статье подробно описано, как выполнять веб-ползание и НЛП.

Для выполнения веб-анализа вы можете выбрать инструмент на Java или Python. В моем случае я использую Crawler4J. (https://github.com/yasserg/crawler4j).

Crawler4j — это веб-краулер с открытым исходным кодом для Java, который предоставляет простой интерфейс для поиска информации в Интернете. Используя его, вы можете настроить многопоточный веб-краулер за несколько минут.

После создания Java-проекта включите зависимость maven:


<dependency>
        <groupId>edu.uci.ics</groupId>
        <artifactId>crawler4j</artifactId>
        <version>4.4.0</version>
</dependency>

Войдите в полноэкранный режим Выход из полноэкранного режима

Теперь создайте класс для работы краулера. Смотрите, вам нужно расширить WebCrawler и реализовать shouldVisit для указания типов файлов, которые будут извлечены и посещены, чтобы получить содержимое и записать на диск. Очень просто!



public class CrawlerUtil extends WebCrawler {

private final static Pattern FILTERS = Pattern.compile(".*(\.(css|js|gif|jpg|png|mp3|mp4|zip|gz))$");

@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
        System.out.println("shouldVisit: " + url.getURL().toLowerCase());

        String href = url.getURL().toLowerCase();
        boolean result = !FILTERS.matcher(href).matches();

        if (result)
            System.out.println("URL Should Visit");
        else
            System.out.println("URL Should not Visit");

        return result;
    }

    @Override
    public void visit(Page page) {
        String url = page.getWebURL().getURL();
        System.out.println("URL: " + url);

        if (page.getParseData() instanceof HtmlParseData) {
            HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();      
            String text = htmlParseData.getText(); //extract text from page
            String html = htmlParseData.getHtml(); //extract html from page
            Set<WebURL> links = htmlParseData.getOutgoingUrls();

            System.out.println("---------------------------------------------------------");
            System.out.println("Page URL: " + url);
            System.out.println("Text length: " + text.length());
            System.out.println("Html length: " + html.length());
            System.out.println("Number of outgoing links: " + links.size());
            System.out.println("---------------------------------------------------------");

            final String OS = System.getProperty("os.name").toLowerCase();

            FileOutputStream outputStream;

            File file;

            try {

                if(OS.indexOf("win") >= 0) {
                    file = new File("c:\crawler\nlp" + UUID.randomUUID().toString() + ".txt");
                } else {
                    file = new File("/var/crawler/nlp/" + UUID.randomUUID().toString() + ".txt");
                }

                outputStream = new FileOutputStream(file);

                byte[] strToBytes = text.getBytes();

                outputStream.write(strToBytes);

                outputStream.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

После этого необходимо создать Java PEX Business Operation, чтобы IRIS мог вызывать эту реализацию Crawler в продакшн. Для этого необходимо расширить класс BusinessOperation (из intersystems) и написать свой код, просто! Метод OnInit позволяет инстанцировать Java Gateway (промежуточное программное обеспечение от InterSystems для продвижения взаимодействия ObjectScript и Java). В методе OnMessage вы используете экземпляр шлюза в переменной iris для отправки результатов java в IRIS.

Java-логика Crawler в этом классе выполняется в executeCrawler. Вам нужно установить setMaxDepthOfCrawling, чтобы настроить, сколько подстраниц будет посещено, и setCrawlStorageFolder с путем к папке для хранения обработки Crawler4J. Таким образом, вы можете начать передавать количество страниц, чтобы ограничить их посещение. Robotconfig позволяет вам следовать политике сайта в отношении ползания и другим правилам. Смотрите весь код:

public class WebsiteAnalyzerOperation extends BusinessOperation {

    // Connection to InterSystems IRIS
    private IRIS iris;

    @Override
    public void OnInit() throws Exception {
        iris = GatewayContext.getIRIS();
    }

    @Override
    public Object OnMessage(Object request) throws Exception {
        IRISObject req = (IRISObject) request;

        String website = req.getString("Website");
        Long depth = req.getLong("Depth");
        Long pages = req.getLong("Pages");

        String result = executeCrawler(website, depth, pages);
        IRISObject response = (IRISObject)(iris.classMethodObject("Ens.StringContainer","%New", result));

        return response;
    }

    public String executeCrawler(String website, Long depth, Long pages) {

        final int MAX_CRAWL_DEPTH = depth.intValue();
        final int NUMBER_OF_CRAWELRS = pages.intValue();

        final String OS = System.getProperty("os.name").toLowerCase();

        String CRAWL_STORAGE = "";

        if(OS.indexOf("win") >= 0) {
            CRAWL_STORAGE = "c:\crawler\storage";
        } else {
            CRAWL_STORAGE = "/var/crawler/storage";
        }

        CrawlConfig config = new CrawlConfig();
        config.setCrawlStorageFolder(CRAWL_STORAGE);
        config.setIncludeHttpsPages(true);
        config.setMaxDepthOfCrawling(MAX_CRAWL_DEPTH);

        PageFetcher pageFetcher = new PageFetcher(config);
        RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
        RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);

        CrawlController controller;
        try {
            controller = new CrawlController(config, pageFetcher, robotstxtServer);

            controller.addSeed(website);

            controller.start(CrawlerUtil.class, NUMBER_OF_CRAWELRS);

            return "website extracted with success";

        } catch (Exception e) {
            return e.getMessage();
        }

    }

    @Override
    public void OnTearDown() throws Exception {

    }

}

Вход в полноэкранный режим Выход из полноэкранного режима

С извлеченным контентом вы можете создать NLP-домен, указывающий на папку с извлечениями, см:

<files listname="File_1" batchMode="false" disabled="false" listerClass="%iKnow.Source.File.Lister" path="/var/crawler/nlp/" recursive="false" extensions="txt">
<parameter value="/var/crawler/nlp/" isList="false" />

Вход в полноэкранный режим Выход из полноэкранного режима

Вся реализация:

Class dc.WebsiteAnalyzer.WebsiteAnalyzerNLP Extends %iKnow.DomainDefinition [ ProcedureBlock ]
{

XData Domain [ XMLNamespace = "http://www.intersystems.com/iknow" ]
{
<domain name="WebsiteAnalyzerDomain" disabled="false" allowCustomUpdates="true">
<parameter name="DefaultConfig" value="WebsiteAnalyzerDomain.Configuration" isList="false" />
<data dropBeforeBuild="true">
<files listname="File_1" batchMode="false" disabled="false" listerClass="%iKnow.Source.File.Lister" path="/var/crawler/nlp/" recursive="false" extensions="txt">
<parameter value="/var/crawler/nlp/" isList="false" />
<parameter isList="false" />
<parameter value="0" isList="false" />
</files>
</data>
<matching disabled="false" dropBeforeBuild="true" autoExecute="true" ignoreDictionaryErrors="true" />
<metadata />
<configuration name="WebsiteAnalyzerDomain.Configuration" detectLanguage="true" languages="en,pt,nl,fr,de,es,ru,uk" userDictionary="WebsiteAnalyzerDomain.Dictionary#1" summarize="true" maxConceptLength="0" />
<userDictionary name="WebsiteAnalyzerDomain.Dictionary#1">
</domain>
}

Войти в полноэкранный режим Выход из полноэкранного режима

}

Теперь InterSystems NLP может представить вам результаты в Text Analytics — Domain Explorer.

Смотрите весь код реализации на github, скачивайте и запускайте!
Посмотреть весь исходный код, собрать и запустить можно здесь: https://openexchange.intersystems.com/package/website-analyzer

Оцените статью
devanswers.ru
Добавить комментарий