0

我是 Java 网络编程的新手,我正在尝试制作一个网络爬虫,使用 Crawler4j示例代码

我的问题是当我提交repost请求时,Crawling任务(这是一个阻塞任务)需要一些时间才能完成,Heroku托管有3秒的请求超时,这使得无法运行同步抓取任务,相同的程序在我的本地机器上运行良好。

根据我的阅读,不可能通过基本/免费提供来更改 Heroku 的超时。

我想知道是否可以将其作为异步任务启动(我知道可以使用 CrawlerController.startNonBlocking() 函数)并等待它完成,以便我可以显示爬行操作的结果。

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{


    String url = request.getParameter("url");



CrawlConfig config = new CrawlConfig();   

String crawlStorageFolder = "/tmp/temp_storage";
config.setCrawlStorageFolder(crawlStorageFolder);    


int numberOfCrawlers = 1;

config.setPolitenessDelay(1);

config.setMaxDepthOfCrawling(2);

config.setMaxPagesToFetch(5);

config.setResumableCrawling(false);

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

try {
controller = new CrawlController(config, pageFetcher, robotstxtServer);
} catch(Exception e){
e.printStackTrace();
}

controller.addSeed(url);


controller.start(Crawler.class, numberOfCrawlers);
// Methods showing the results of the crawling ...
}
4

1 回答 1

0

嗨,您通常已经自己回答了这个问题。您应该使用某种后台作业来执行爬网。但是,您不应该在 Web 层中执行此操作。Heroku 有专门的工人角色。

这里的基本思想是您的浏览器正在与 Web 进程对话。Web 进程指示后台工作人员执行一些作业,并将成功的作业提交报告给用户浏览器。然后,您使用一些 JavaScript 定期回调 Web 前端以检查后台作业的进度。

在像 Heroku 这样的云堆栈中,请避免使用基于库的后台作业,这些作业可能会在 Web 层中启动后台线程。这通常在云堆栈中不受支持,并且在任何其他 Web 堆栈上都是不好的做法。

Heroku 的这篇帮助文章很好地突出了要使用的方法,并通过“方法”部分中的序列图很好地解释了该方法。

https://devcenter.heroku.com/articles/background-jobs-queueing

https://devcenter.heroku.com/articles/background-jobs-queueing#approach

抱歉,这不是一个直接的代码示例。我仍然希望这会有所帮助。

于 2014-11-13T17:32:05.767 回答