JavaCrawler:使用Jvppeteer(Puppeteer)轻松爬取淘宝商品如果要爬取某宝的商品,如果只是使用HttpURLConnection发送请求,则故障率非常高。一般如果要保证成功率,都会选择真实的浏览器进行爬取。以往常用的方案是selenium或者phantomjs,但是两者的环境配置太麻烦,对程序员极其不友好。自Google推出Puppeteer以来,Puppeteer迅速走红,得到了大家的一致好评。它是一个NodeJS库,不过今天不是用它来爬某宝产品,而是用Java语言写的Jvppeteer。Jvppeteer和Puppeteer的实现原理是一样的。这个想法是使用多线程。一个线程负责抓取一个页面(后面的内容会用page代替page)在线程池中创建一个线程数相同的页面队列。该页面被放置在LinkedBlockingQueue队列中。每当有爬取任务时,就从队列中取出一个页面,当爬取任务完成后,再将页面放回队列中。这样做的原因是为了复用页面,减少页面的创建频率,但需要注意的是一个页面不能使用时间过长或使用次数过多,以防崩溃拦截图片和多媒体资源的加载,以及加载多媒体资源和图片会大大影响页面的加载速度,从而影响爬虫的效率,所以应该拦截(可选)。我们选择获取整个页面内容,然后解析得到商品信息代码实现1.启动浏览器//指定启动路径,启动浏览器Stringpath=newString("F:\\javatutorial\\49issue\\vuejs\\puppeteer\\.local-chromium\\win64-722234\\chrome-win\\chrome.exe".getBytes(),"UTF-8");ArrayListargList=newArrayList<>();LaunchOptionsoptions=newOptionsBuilder().withArgs(argList).withHeadless(false).withExecutablePath(path).build();argList.add("--无沙箱");argList.add("--disable-setuid-sandbox");浏览器browser=Puppeteer.launch(options);2.创建页面队列和线程池//启动一个线程池多线程捕获intthreadCount=5;ThreadPoolExecutorexecutor=newThreadPoolExecutor(threadCount,threadCount,30,TimeUnit.SECONDS,newLinkedBlockingDeque<>());CompletionServiceservice=newExecutorCompletionService(executor);//同时打开5个页面进行抓取,这些页面可以多次使用,从而降低创建网页的性能消耗LinkedBlockingQueuepages=newLinkedBlockingQueue<>();对于(inti=0;i{//if("image".equals(request.resourceType())||"media".equals(request.resourceType())){////遇到多媒体或图片资源请求,拒绝,加载页面加载//request.abort();//}else{//其他资源释放//request.continueRequest();//}//});//page.setRequestInterception(true);pages.put(page);//放到队列后面,block}3.定义爬虫线程的静态内部类staticclassCrawlerCallableimplementsCallable