前言:puppeteer和selenium的功能很相似,都是加载浏览器驱动去模拟浏览器行为但功能比selenium要强大的多。
其他描述:Puppeteer 是一个控制 headless Chrome 的 Node.js API 。它是一个 Node.js 库,通过 DevTools 协议提供了一个高级的 API 来控制 headless Chrome。
这里可能有童靴有疑问了,这是Node.js 的API,我不会Node.js怎么办?
放心,已有大佬将其做了Java的封装。
地址:https://github.com/fanyong920/jvppeteer
由于自己平时开发框架使用的是webmagic,所以就简单封装了个jvppeteer的downloader,可能封装的细节不是很完善,见笑了。
代码资源地址:https://download.csdn.net/download/zky736162010/15558475
代码调用:
//配置监听器,用于监听采集成功和失败的情况
List<SpiderListener> spiderListenerList = new ArrayList<>(1);
spiderListenerList.add(supervisionSpiderListener);
//下载器,配置代理
ChromiumOptions options = new ChromiumOptions();
options.setUseHeadless(true);
PuppeteerDownloader puppeteerDownloader = new PuppeteerDownloader(spiderListenerList,options);
puppeteerDownloader.setProxyProvider(new KuaiDaiLiProxyProvider());
puppeteerDownloader.setChromiumAction(xxAction);
XXAction.java:
@Component
public class XXAction extends AbstractChromiumAction {
private final static Logger logger = LoggerFactory.getLogger(QFangWangAction.class);
@Override
protected Page doAction(Browser browser, Request request, Page page, Site site){
//浏览器操作
ThreadUtil.sleep(1500L);
return page;
}
}
puppeteer调用浏览器有2种方式:
一种是调用本地浏览器,一种是调用docker的一个headless镜像,区别在于docker的是已经提前开好了tab页面,只支持多开page,不支持多开browser。
本地浏览器也存在一个问题:当页面奔溃时,会产生残留的chromium进程,还有一些奔溃日志,需要进行清理。
由于我使用的服务器是window,这里给出window杀进程的命令:
taskkill -f -im chrome.exe
清除日志文件:
一般是在 AppData\Local\Temp 目录下,名称为puppetter_xxxxx_chrome_profile的文件夹。
有其他疑问可联系本人。
Puppeteer相关资料:
前端神器puppeteer入门及实践:
https://www.jianshu.com/p/56babda610f9
爬虫利器 Puppeteer 的一些最佳实践:
https://zhuanlan.zhihu.com/p/66296309
如何避免Puppeteer被前端JS检测/识别:
http://www.chenxm.cc/article/915.html
结合项目来谈谈 Puppeteer:
https://zhuanlan.zhihu.com/p/76237595