Open chenxiaochun opened 6 years ago
每次滚动100有点慢,我直接让每次滚动document.body.scrollHeight,同时调高了时间间隔。
感谢你的代码。
@akeyboardlife ,有帮助就好,客气了!
赞!
终端请求少了一行代码否则不生效 await page.setRequestInterception(true); page.on('request', interceptedRequest => { let url = interceptedRequest.url(); if (url.indexOf('mmbiz.qpic.cn') > -1) { interceptedRequest.abort(); // console.log(url); } else { interceptedRequest.continue(); }
});
@YiQieSuiYuan Yes, it works well after adding await page.setRequestInterception(true);
,Thanks!
请问可以转载么,会注明出处和链接
@yifeikong ,可以的。
如何模拟设置下拉列表的值,甚至下拉列表是联动ajax关联请求的
@yangweijie ,这个得具体情况具体分析。如果是类似于地址关联的下拉框。可以等前面的下拉框变动之后,等待2秒钟,再去设置后面的下拉框值。这些在 puppeteer中都是有相关api的,可以查看一下。
@yangweijie ,这个得具体情况具体分析。如果是类似于地址关联的下拉框。可以等前面的下拉框变动之后,等待2秒钟,再去设置后面的下拉框值。这些在 puppeteer中都是有相关api的,可以查看一下。
问题就不知道怎么让前面的下拉框变动,keyboard.type无效,要写额外js设置值吗? 有的下拉可能 是其他js框架渲染的, 比如 这一个注册界面的 省市 下拉 http://interactive.cponline.cnipa.gov.cn/app/03_jh/login/register-qiye.jsp
@yangweijie ,我其实也好久不看它的文档了。刚才翻了一下文档,看到这个方法:https://pptr.dev/#?product=Puppeteer&version=v1.18.1&show=api-pageselectselector-values,估计可能对你有用。
大佬有遇到截出来的图是空白么?用了你提供的方法,查了半天也不知道从何下手
大佬有遇到截出来的图是空白么?用了你提供的方法,查了半天也不知道从何下手
把 headless 设置为 true 就好了,感谢感谢
我尝试了设置了headless为true,还有滚动截图和fullPage: true,但是我截出来的图还是有白色的一段,我截的图片是偏大的有10000*20000,请问有什么方法可以解决吗?
我尝试了设置了headless为true,还有滚动截图和fullPage: true,但是我截出来的图还是有白色的一段,我截的图片是偏大的有10000*20000,请问有什么方法可以解决吗?
估计是图片太大,在截屏的时候还没有完全加载出来
@v2x2 是不是在截图的时候页面还没加载完成
下面是我的例子 🌰:
导出 PDF, 页面的长度取决于数据多少,数据是由 Api 加载的, 所以导致页面大小不确定,等待 api 加载完,页面重新渲染完成,再指定 导出的高度。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
// headless: false, 进行 pdf 导出 要为 false
ignoreHTTPSErrors: true
});
const page = await browser.newPage();
await page.goto('xxxxxx);
//等待 api 渲染完毕
await sleep(3 * 1000)
// 获取 API 加载完,实际的页面长度
let height = await page.evaluate('document.body.scrollHeight')
let width = await page.evaluate('document.body.scrollWidth')
//可以不设置,page.pdf 传入参数即可
// await page.setViewport({
// width: width,
// height: height
// });
let params = {
printBackground: true,
scale: 1,
height: height,
width: width,
path: 'index.pdf'
}
await page.pdf(params);
await browser.close();
})();
function sleep(ms) {
ms = (ms) ? ms : 0;
return new Promise(resolve => {
setTimeout(resolve, ms);
});
}
Puppeteer 出自于 GoogleChrome 团队,是一个可以用来模拟 Chrome 浏览器各种操作行为的 nodejs 库,基于谷歌的开发工具协议。
它可以用来模拟你在浏览器中大多数常见操作,比如:
Puppeteer 运行依赖的 nodejs 版本最低是
6.4.0
,但是由于示例中使用了async/await
的特性,所以我建议你使用7.6.0
以及更高的版本。安装 Puppeteer
截屏示例
第一个示例:自动跳转到 https://example.com 并生成一张截图:
Puppeteer 设置的默认可视区域大小是
800*600
像素。上面示例中的网站页面小于这个尺寸,可以完整的截取出来。但是,你换成http://www.jd.com
就不行了,所以,我们得使用page.setViewport()
方法来重新定义可视区域的大小。运行查看截图,发现只是完整的截取了第一屏,后面几屏的怎么办?
page.screenshot()
方法提供了一个fullPage
参数,用来设置截取整个页面。截取的确实是整个网站页面,但是有些楼层使用了懒加载机制,导致这些楼层就没有截取出来。解决办法就是能够让页面自动从顶部滚动到底部之后,再去进行截取,所以我们需要自己编写一个
autoScroll()
方法。重点解释一下
autoScroll()
方法的实现。totalHeight
用来记录页面的当前高度,初始值为0。distance
用来表示每次向下滚动的距离,这里为100像素。接着使用了一个定时器,每隔100毫秒向下滚动distance
设定的距离,然后累加到totalHeight
,直到它大于等于页面的实际高度document.body.scrollHeight
之后,才会清除定时器,并将Promise
对象的状态置为resolve()
。页面滚动完成之后,后面的处理跟上面一样了,直接执行截屏操作就可以了。
模拟用户输入与鼠标事件
上面已经说过,puppeteer 还可以模拟键盘的输入操作和鼠标单击事件,基于这些我们可以自然想到可以用它模拟表单提交操作。
编写了一个简单的 html 页面来模拟表单:
在文本框中自动输入一串数字,然后自动点击提交按钮。我们用到了 puppeteer 的
page.type
和page.click
方法,前者用于模拟输入,后者用于模拟单击操作。puppeteer.launch()
方法在之前的版本中有一个devtool: true
参数,可在页面中自动打开 Chrome 的开发者工具。可是后面的版本,不知道什么原因给去掉了。如果你现在还有此需求,可以这样写:可以使用
page.emulate()
方法来模拟各种移动设备。最重要的是userAgent
参数,因为服务器一般都是根据这个参数值来决定显示的页面类型的。此外,还有
page.hover()
用来模拟 mouseover 的操作;page.reload()
用来模拟刷新操作;page.title()
用来获取网页标题。这些大家都可以自己去使用挖掘一下。过滤页面中的元素
有时候我打开一个网页可能只是想分析它里面的超级链接,并不想让页面加载图片,这可以大大加快页面的访问速度。所以,你可以给页面绑定一个
request
的事件,可以通过它的回调函数参数获取到当前页面加载的每一个请求,并加以处理。我们这里就可以根据它的
url()
来判断当前请求是图片的话,直接将其abort()
,否则continue()
即可。创建隐私模式
官方文档