我是Java网络编程的新手,我正在尝试制作一个网络爬虫,使用Crawler4j示例代码
我的问题是,当我提交重新发布请求时,抓取任务(这是一个阻止任务)需要一些时间才能完成,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 ...
}
您通常已经自己回答了这个问题。您应该使用某种后台作业来执行爬网。但是,不应在 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
抱歉,这不是一个直接的代码示例。我仍然希望这有所帮助。