Java爬虫:使用Jvppeteer(Puppeteer)爬淘宝商品就这么简单?
liuian 2025-05-05 17:00 105 浏览
大家都知道,想要爬取某宝的商品,如果只是用HttpURLConnection发个请求,失败率是很高的。一般想要保证成功率的话,都会选择真实的浏览器去抓取。
以前常用的解决方案是selenium或phantomjs,但是它两的环境配置太麻烦了,对程序员极度不友好,自从谷歌推出Puppeteer后,puppeteer迅速流行起来,获得大家一致称赞。它是一个NodeJS库,但今天并不是要使用它来爬取某宝商品,而是使用Java语言写的Jvppeteer,Jvppeteer与Puppeteer是同样的实现原理。
思路:
- 使用多线程,一个线程负责一个页面的爬取,接下来的内内容会使用page代替页面
- 创建与线程池线程数相同的page队列,放在LinkedBlockingQueue队列里,每当有爬取任务时,就从队列里取出一个page,爬取任务完成时,将page放回队列的后面。这样做的原因是重复利用page,减少页面的创建频率,但是要注意的是一个页面不能利用太久或者次数太多,防止出现crash的情况
- 拦截图片和多媒体资源的加载,多媒体资源和图片的加载会极大影响页面的加载速度,从而影响爬虫效率,所以要拦截(可选)。
- 我们选择获取整个页面内容,然后解析得到商品信息
代码实现
1.启动
//指定启动路径,启动浏览器
String path = new String("F:\\java教程\\49期\\vuejs\\puppeteer\\.local-chromium\\win64-722234\\chrome-win\\chrome.exe".getBytes(), "UTF-8");
ArrayList<String> argList = new ArrayList<>();
LaunchOptions options = new OptionsBuilder().withArgs(argList).withHeadless(false).withExecutablePath(path).build();
argList.add("--no-sandbox");
argList.add("--disable-setuid-sandbox");
Browser browser = Puppeteer.launch(options);2.page队列
//启动一个线程池多线程抓取
int threadCount = 5;
ThreadPoolExecutor executor = new ThreadPoolExecutor(threadCount, threadCount, 30, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
CompletionService service = new ExecutorCompletionService(executor);
//打开5个页面同时抓取,这些页面可以多次利用,这样减少创建网页带来的性能消耗
LinkedBlockingQueue<Page> pages = new LinkedBlockingQueue<>();
for (int i = 0; i < threadCount; i++) {
Page page = browser.newPage();
//拦截请求,可选
// page.onRequest(request -> {
// if ("image".equals(request.resourceType()) || "media".equals(request.resourceType())) {
// //遇到多媒体或者图片资源请求,拒绝,加载页面加载
// request.abort();
// } else {//其他资源放行
// request.continueRequest();
// }
// });
// page.setRequestInterception(true);
pages.put(page);//往队列后面放,阻塞
}3.定义爬取线程
static class CrawlerCallable implements Callable<Object> {
private LinkedBlockingQueue<Page> pages;
public CrawlerCallable(LinkedBlockingQueue<Page> pages) {
this.pages = pages;
}
@Override
public Object call() {
Page page = null;
try {
page = pages.take();
PageNavigateOptions navigateOptions = new PageNavigateOptions();
navigateOptions.setWaitUntil(Arrays.asList("domcontentloaded"));
System.out.println("gotothreadName:"+Thread.currentThread().getName());
page.goTo("https://item.taobao.com/item.htm?id=541605195654", navigateOptions);
String content = page.content();
//解析商品
return parseItem(content);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (page != null) {
try {
pages.put(page);//把已经抓取完的网页放回队列里
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return null;
}
}4.关闭线程池,获取结果
//结果集
List<Future<Object>> futures = new ArrayList<>();
//抓取100次
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
Future<Object> future = service.submit(new CrawlerCallable(pages));
futures.add(future);
}
//关闭线程池
executor.shutdown();
//获取结果
int i = 0;
for (Future<Object> result : futures) {
Object item = result.get();
i++;
System.out.println(i + ":" + Constant.OBJECTMAPPER.writeValueAsString(item));
}
long end = System.currentTimeMillis();
System.out.println("时间:" + (end - start));在俺电脑测试,100个爬取任务只需要15s,速度还是非常的快。速度的快慢受到根据电配置以及带宽的影响,配置越好,速度越快。
相关推荐
- 天猫积分兑换根本抢不到(2021天猫积分兑换根本抢不到)
-
因为天猫积分的东西是有限的,但是很多人想要它们。如果你想抢到它,你最好注意启动秒杀的时间,在你启动倒计时时做好准备,并立即点击交换验证码,然后点击确认。一般最慢的时间是十秒内甚至四五秒内下单,五分钟内...
- win10任务管理器未响应(win10任务管理器没反应)
-
未响应这种情况应该是:1、说明程序是正在运行,但由于是系统运行内存不足,或者病毒、垃圾等造成的系统卡顿了。2、可以尝试重启系统、杀毒、清理垃圾即可。解决方法一:双击“此电脑”我的电脑的时候,出现资源管...
-
- 新电脑装win7进不了系统(新电脑安装win7系统启动不了)
-
解决方法:1、开机按F8,选择“最好一次正确配置”尝试修复。2、开机按F8,选择“安全模式”尝试修复。3、如果方法1,2不能修复,通过系统还原或者重新安装系统修复。二、如果软件无法修复,仍然无法启动,那么就是硬件故障原因造成的。比如硬盘、主...
-
2025-12-25 21:55 liuian
-
- 台式键盘锁住了打不了字怎么解锁
-
1.找到在键盘上靠左侧的位置,有一个fn的键,按住fn键。2.然后找到键盘最上面f8的键,把fn和f8一起按住,即可完成操作。3.然后此时看到键盘已经解除锁定,就可以可以正常输入了,这样就完成了键盘的解锁操作。...
-
2025-12-25 21:05 liuian
- 怎么超频显卡(显卡怎么超频使用)
-
显卡超频犯法如下:1、首先是显卡体质的检测,如果不知道显卡的体质,盲目加电压或者频率很容易导致超频的失败,检测显卡体质需要用到软件超频和拷机软件。2、接下来是BIOS准备阶段,用户可以选择从现有显卡提...
- 自动关机怎么设置win10指令(win10设置自动关机代码)
-
1最简单的方法是通过系统自带的计划任务来设置自动开关机。2打开‘任务计划程序’,选择‘创建基本任务’,按照提示完成设置,可以选择定时执行或在特定条件下执行。3另外也可以通过第三方软件来实现自动开...
- 苹果系统修复软件(iphone修复软件)
-
牛学长苹果修复工具是一个知名的修复工具,经过多年的发展和改进,已经被广大用户验证为靠谱可信赖的工具。它具有强大的修复功能,可以解决苹果设备的各种问题,如系统崩溃、黑屏、无法开机等。该工具采用先进的技术...
- 硬盘损坏的原因(硬盘损坏严重怎么处理)
-
导致电脑硬盘坏的原因有以下几点:1、经常性的非正常关机、断电等情况都会导致硬盘出现坏块,突然停电后又马上恢复最容易引起系统故障,严重的就会让硬盘直接物理损坏。2、电压不稳定,很容易造成物理坏道。3、灰...
- win10调制解调器出现错误(window10调制解调器报告了一个错误)
-
方法一1、按下win+i组合键打开windows设置,在设置界面点击网络和internet;2、在左侧点击【拨号】按钮;3、在右侧拨号下方点击宽带链接,然后点击【高级选项】;4、打开...
-
- 台式电脑如何设置ip地址(设置台式机ip地址)
-
方法1、打开电脑的控制面板,进入设置界面。2、然后找到网络和Internet选项,点击进入。3、进入之后点击选择网络和共享中心。4、点击左侧的更改适配器设置栏。5、然后找到需要设置的网络连接,鼠标右键选择属性。6、然后双击Internet协...
-
2025-12-25 18:05 liuian
- centos系统安装教程(centos安装总结)
-
之前在线在Debian内安装Gentoo,大体步骤如下:1.mkdir/new,chroot进去正常安装新系统。2.将静态编译的busybox放到根目录。3.停掉所有服务,umount所有有关目录。...
- 不用电脑怎么恢复(不用电脑怎么恢复出厂设置)
-
操作方法01方法一:通过设置重置电脑使用快捷键Windows+A,点击所有设置,点击更新系统-恢复,重置此电脑点开始。02选择仅保留我的文件,删除应用和设置,提示窗口会显示出将被删除的应用,点击下一步...
- 最强视频播放器(2020视频播放器排行榜前十名)
-
应该是MXPlayer。他是一款安卓版上十分强悍的视频播放器,他以解码性能强、兼容性高而闻名,并且,对视频字幕的支持更是堪称一绝,支持在线匹配,对特效字幕的支持也是非常的高的。作为一款优质的手机视频播...
- 三星固态驱动官网(三星固态官方软件)
-
三星手机序列号查询官网是http://www.samsung110.com/。手机序列号(S/N号)查询方法:设置-关于手机-状态-序列号(序号)。或通过以下方式查询:通过机器包装盒上的标贴查询用...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
