Crawler4j с аутентификацией
Я пытаюсь выполнить crawler4j в личном Redmine для целей тестирования. Я хочу аутентифицировать и сканировать несколько уровней глубины в приложении.
Я следую этому руководству из FAQ crawler4j. И создайте следующий фрагмент:
import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.parser.HtmlParseData;
import edu.uci.ics.crawler4j.url.WebURL;
public class CustomWebCrawler extends WebCrawler{
@Override
public void visit(final Page pPage) {
if (pPage.getParseData() instanceof HtmlParseData) {
System.out.println("URL: " + pPage.getWebURL().getURL());
}
}
@Override
public boolean shouldVisit(final Page pPage, final WebURL pUrl) {
WebURL webUrl = new WebURL();
webUrl.setURL(Test.URL_LOGOUT);
if (pUrl.equals(webUrl)) {
return false;
}
if(Test.MY_REDMINE_HOST.equals(pUrl.getDomain())){
return true;
}
return false;
}
}
В этом классе я расширяю WebCrawler и при каждом посещении просто показываю посещение URL, проверяя, находится ли URL в том же домене, и не посещая URL выхода из системы.
А также у меня есть тестовый класс, настраивающий этот сканер, с информацией для аутентификации и сайтом для сканирования.
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import edu.uci.ics.crawler4j.crawler.CrawlConfig;
import edu.uci.ics.crawler4j.crawler.CrawlController;
import edu.uci.ics.crawler4j.crawler.authentication.AuthInfo;
import edu.uci.ics.crawler4j.crawler.authentication.BasicAuthInfo;
import edu.uci.ics.crawler4j.crawler.authentication.FormAuthInfo;
import edu.uci.ics.crawler4j.fetcher.PageFetcher;
import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig;
import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer;
public class Test {
private static Logger rootLogger;
public final static String MY_REDMINE_HOST = "my-redmine-server";
public final static String URL_LOGOUT = "http://"+MY_REDMINE_HOST+"/redmine/logout";
public static void main(String[] args) throws Exception {
configureLogger();
// Create the configuration
CrawlConfig config = new CrawlConfig();
String frontier = "/tmp/webCrawler/tmp_" + System.currentTimeMillis();
config.setCrawlStorageFolder(frontier);
//Starting point to crawl
String seed = "http://"+MY_REDMINE_HOST+"/redmine/";
// Data for the authentication methods
String userName = "my-user";
String password = "my-passwd";
String urlLogin = "http://"+MY_REDMINE_HOST+"/redmine/login";
String nameUsername = "username";
String namePassword = "password";
AuthInfo authInfo1 = new FormAuthInfo(userName, password, urlLogin,
nameUsername, namePassword);
config.addAuthInfo(authInfo1);
AuthInfo authInfo2 = new BasicAuthInfo(userName, password, urlLogin);
config.addAuthInfo(authInfo2);
config.setMaxDepthOfCrawling(3);
PageFetcher pageFetcher = new PageFetcher(config);
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig,
pageFetcher);
CrawlController controller = new CrawlController(config, pageFetcher,
robotstxtServer);
controller.addSeed(seed);
controller.start(CustomWebCrawler.class, 5);
controller.shutdown();
}
private static void configureLogger() {
// This is the root logger provided by log4j
rootLogger = Logger.getRootLogger();
rootLogger.setLevel(Level.INFO);
// Define log pattern layout
PatternLayout layout = new PatternLayout(
"%d{ISO8601} [%t] %-5p %c %x - %m%n");
// Add console appender to root logger
if (!rootLogger.getAllAppenders().hasMoreElements()) {
rootLogger.addAppender(new ConsoleAppender(layout));
}
}
}
Я ожидал войти в приложение и сохранить сканирование на остальной части сайта, но не смог. Сканирование просто перейти по ссылкам в начальной точке.
Я не знаю, если что-то отсутствует или что-то не так. Или, возможно, у меня неправильный подход к текущей конфигурации сканирования.