Puppeteer是NPM库,它提供了NodeJS高级API来控制Chrome。Puppeteer 默认以无头(无界面)方式运行,但也可以配置为运行有界面的Chrome。Puppeteer 提供了一系列 API,通过 Chrome DevTools Protocol 协议控制 Chromium/Chrome 浏览器的行为。其对应的Python版本为pyppeteer。
仓库地址
https://github.com/puppeteer/puppeteer
安装
npm install puppeteer --save
Puppeteer具有以下特性:
- 使用 DevTools 协议 与浏览器进行通信。
- Browser 实例可以拥有浏览器。
- BrowserContext 浏览器上下文。
- Page 至少有一个框架:主框架。 可能还有其他框架由 iframe 或 框架标签 创建。
- frame 至少有一个执行上下文 - 默认的执行上下文 - 框架的 JavaScript 被执行。 一个框架可能有额外的与 扩展 关联的执行上下文。
- Worker 具有单一执行上下文,并且便于与 WebWorkers 进行交互。
示例
const url = 'http://61.163.88.227:8006/hwsq.aspx?sr=0nkRxv6s9CTRMlwRgmfFF6jTpJPtAv87';
(async () => {
// 1. Open browser
const browser = await puppeteer.launch({
// headless: false
});
// 2. Create a new page
const page = await browser.newPage();
// 3. Go to the target website
await page.goto(url, { waitUntil: "networkidle2" });
// await page.waitFor(3000);
// 4. Get data
const dateInput = await page.$('#ContentLeft_menuDate1_TextBox11')
const submit = await page.$('#ContentLeft_Button1')
const now = Date.now();
for (let i = 0; i < 8280; i++) {
const offset = 1000 * 60 * 60 * 24 * i;
const date = new Date(now - offset).format('yyyy-MM-dd');
await page.evaluate((el, value) => el.setAttribute('value', value),
dateInput, date
)
submit.click();
await page.waitFor(3000)
await page.waitForSelector("#ContentLeft_menuDate1_TextBox11");
// console.log(dateInput)
let data = await page.evaluate(getInfo);
console.log(date + '...')
fs.writeFileSync('./data/' + date + '.txt', data)
}
// 5. Print out the data in the console
// console.log(data);
// 6. Close browser
await browser.close();
})();
async function getInfo() {
const table = document.querySelectorAll('.mainTxt');
const vList = table[0].innerText.split(/\t/)
return vList
}
Puppeteer的其他用途
- 网页截图或者生成 PDF
- 自动提交表单,进行 UI 测试,键盘输入等。
- 创建一个时时更新的自动化测试环境。 使用最新的 JavaScript 和浏览器功能直接在最新版本的Chrome中执行测试。
- 捕获网站的时间线,帮助诊断性能问
版权声明:本文为xtfge0915原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。