GVKun编程网logo

如何用 puppeteer 开玩笑地处理页面实例对象?

22

本文将带您了解关于如何用puppeteer开玩笑地处理页面实例对象?的新内容,另外,我们还将为您提供关于Java爬虫:使用Jvppeteer(Puppeteer)轻松爬淘宝商品、node.js–如何在

本文将带您了解关于如何用 puppeteer 开玩笑地处理页面实例对象?的新内容,另外,我们还将为您提供关于Java爬虫:使用Jvppeteer(Puppeteer)轻松爬淘宝商品、node.js – 如何在puppeteer中处理弹出窗口、nodejs puppeteer linux(centos)环境部署以及用puppeteer简单截图、Puppeteer NodeJS 不截图整个页面的实用信息。

本文目录一览:

如何用 puppeteer 开玩笑地处理页面实例对象?

如何用 puppeteer 开玩笑地处理页面实例对象?

如何解决如何用 puppeteer 开玩笑地处理页面实例对象??

我正在使用 jest - puppeteer 进行 UI 自动化。我的查询是,单击任何按钮会将我带到另一个选项卡,当我尝试在新选项卡中执行任何操作时,它会失败。我尝试使用 browser.once() 即,

await page.waitForSelector(''#goto'');            // wait object load

const link = await page.$(''#goto'');             // declare object

const newPagePromise = new Promise(x => browser.once(''targetcreated'',target => x(target.page())));    // declare promise

await link.click();                             // click,a new tab opens

const newPage = await newPagePromise;           // open new tab /window,

现在你可以使用它

await newPage.close();                          // close it,for example

当我尝试使用 helper 命令时,它可以正常工作,但无法使用 helper 命令。有意见吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Java爬虫:使用Jvppeteer(Puppeteer)轻松爬淘宝商品

Java爬虫:使用Jvppeteer(Puppeteer)轻松爬淘宝商品

Java爬虫:使用Jvppeteer(Puppeteer)轻松爬淘宝商品

想要爬取某宝的商品,如果只是用HttpURLConnection发个请求,失败率是很高的。一般想要保证成功率的话,都会选择真实的浏览器去抓取。

以前常用的解决方案是selenium或phantomjs,但是它两的环境配置太麻烦了,对程序员极度不友好,自从谷歌推出Puppeteer后,puppeteer迅速流行起来,获得大家一致称赞。它是一个NodeJS库,但今天并不是要使用它来爬取某宝商品,而是使用Java语言写的Jvppeteer,Jvppeteer与Puppeteer是同样的实现原理。

思路

  1. 使用多线程,一个线程负责一个页面的爬取(接下来的内容会使用page代替页面)
  2. 创建与线程池线程数相同的page队列,page放在LinkedBlockingQueue队列里,每当有爬取任务时,就从队列里取出一个page,爬取任务完成时,将page放回队列的后面。这样做的原因是重复利用page,减少页面的创建频率,但是要注意的是一个页面不能利用太久或者次数太多,防止出现crash的情况
  3. 拦截图片和多媒体资源的加载,多媒体资源和图片的加载会极大影响页面的加载速度,从而影响爬虫效率,所以要拦截(可选)。
  4. 我们选择获取整个页面内容,然后解析得到商品信息

    代码实现

    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();
                    //如果不设置 domcontentloaded 算页面导航完成的话,那么goTo方法会超时,因为图片请求被拦截了,页面不会达到loaded阶段
                    navigateOptions.setWaitUntil(Arrays.asList("domcontentloaded"));
                    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就完成了,但不同的电脑配置和带宽有不同结果,因为爬虫是比较吃配置还有带宽的。

小结

除了创建page队列以外,还可以创建browser队列,因为一个browser永久也有可能发生crash的时候,可以在项目启动的时候启动一定数量的browser,当某个browser到达某个使用次数(比如2000)或者使用时间(2h)后关闭browser,然后取出队列中的另外一个browser,同时启动一个bowser放进队列里。

完整的代码地址:demo

node.js – 如何在puppeteer中处理弹出窗口

node.js – 如何在puppeteer中处理弹出窗口

如何处理弹出窗口并访问弹出窗口对其进行一些操作.

const puppeteer = require('puppeteer');

async function run() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');
    await page.click(Launchpopup);
}

解决方法

从版本0.13.0开始,您可以使用以下代码:

... code to open popup...
const pages = await browser.pages(); // get all open pages by the browser
const popup = pages[pages.length - 1]; // the popup should be the last page opened

nodejs puppeteer linux(centos)环境部署以及用puppeteer简单截图

nodejs puppeteer linux(centos)环境部署以及用puppeteer简单截图

1.安装Node环境

如果有安装Node请忽略第1点

#下载
cd /usr/local/src
wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz


#解压
tar -Jxf node-v10.15.3-linux-x64.tar.xz


#将文件夹移动到 /usr/local/bin
mv node-v10.15.3-linux-x64 /usr/local/bin/node-v10.15.3-linux-x64

 

#配置环境变量
vi /etc/profile

在"export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL"上面加上
export NODE_HOME=/usr/local/bin/node-v10.15.3-linux-x64
export NODE_PATH=/usr/local/bin/node-v10.15.3-linux-x64/lib/node_modules
export PATH=$PATH:$NODE_HOME/bin:$NODE_PATH

 

#编译/etc/profile 使配置生效
source /etc/profile

 

#若有显示版本号证明安装成功了

node -v
npm -v

 

2.安装puppeteer

#新建开发目录
mkdir pupp && cd pupp

 

#安装cnpm,以使用淘宝镜像(用npm直接安装puppeteer会报错...)
npm install -g cnpm --registry=https://registry.npm.taobao.org

 

#全局安装 puppeteer
cnpm install -g puppeteer

 

#依赖库
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y

 

#字体
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y

 

#尝试截图,(注意,以下代码可以参考官网教程,puppeteer.launch的配置应需求修改)

新建一个e.js
vi e.js

贴入以下代码

const puppeteer = require(‘puppeteer‘);

(async () => {
const browser = await puppeteer.launch({args: [‘--no-sandBox‘,‘--disable-setuid-sandBox‘]});
const page = await browser.newPage();
await page.goto(‘https://example.com‘);
await page.screenshot({path: ‘example.png‘});

await browser.close();
})();

 

#执行js
node e.js
在目录下有example.png

 

参考:

https://zhaoqize.github.io/puppeteer-api-zh_CN/#?product=Puppeteer&version=v1.14.0&show=api-class-page

https://www.runoob.com/nodejs/nodejs-install-setup.html

https://github.com/GoogleChrome/puppeteer

https://github.com/zhaoqize/puppeteer-api-zh_CN

Puppeteer NodeJS 不截图整个页面

Puppeteer NodeJS 不截图整个页面

如何解决Puppeteer NodeJS 不截图整个页面?

我正在尝试使用 puppeteer 无头渲染 HTML 片段。问题是它是一个相当大的图像,大约为 10k x 8k。当我在本地使用以下代码运行 puppeteer 时,它可以正常工作,但是当我将它放入计算能力较低的云实例中时,图像的底部不会被捕获并留空。我也注意到,当我提高云实例的能力时,它会捕获更多它,但是我宁愿等待时间而不是仅仅提高计算能力。有任何想法吗?否则也许是让服务器呈现传递的 HTML 的替代方法?

这是我的代码

const page = await browser.newPage();
await page.setViewport({
      width: width,height: height,deviceScaleFactor: 1,});            
await page.setContent(imgHtml);
const screenshot = await page.screenshot({ path: `./public/image.png`,omitBackground: true });
await browser.close();
return screenshot;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

我们今天的关于如何用 puppeteer 开玩笑地处理页面实例对象?的分享就到这里,谢谢您的阅读,如果想了解更多关于Java爬虫:使用Jvppeteer(Puppeteer)轻松爬淘宝商品、node.js – 如何在puppeteer中处理弹出窗口、nodejs puppeteer linux(centos)环境部署以及用puppeteer简单截图、Puppeteer NodeJS 不截图整个页面的相关信息,可以在本站进行搜索。

本文标签: