puppeteer是一个可以控制chrome的库,可以模拟一些交互行为。
启动浏览器,然后打开一个页面,之后跳转到一个网址打开页面
// Launch the browser
const browser = await puppeteer.launch({ headless: "new" });
// Create a page
const page = await browser.newPage();
// Go to your site
await page.goto("https://www.baidu.com");
获取网页元素
这里用waitForSelector用选择器进行爬取,这边都是异步的函数,这也是puppeteer的优势,它可以等待一些动态变化之后再爬取
// Query for an element handle.
const element = await page.waitForSelector("span.title-content-title");
// Get the text content of the element
const textContent = await page.evaluate(
(element) => element.textContent,
element
);
截图
保存图片用screenshot方法,保存pdf用pdf方法(而且pdf是带链接的)
await page.screenshot({
path: "1.png",
fullPage: true,
});
await page.pdf({
path: "1.pdf",
fullPage: true,
});
let puppeteer = require("puppeteer");
(async () => {
// Launch the browser
const browser = await puppeteer.launch({ headless: "new" });
// Create a page
const page = await browser.newPage();
// Go to your site
await page.goto("https://www.baidu.com");
// Query for an element handle.
const element = await page.waitForSelector("span.title-content-title");
// Get the text content of the element
const textContent = await page.evaluate(
(element) => element.textContent,
element
);
console.log(textContent);
// Dispose of handle
await element.dispose();
// Close browser.
await browser.close();
})();
上面爬虫的那个evaluate方法就是执行脚本的方法,执行脚本之后可以返回一个值作为结果。
const result = await page.evaluate(() => {
// 在此处编写要执行的脚本
return xxx;
});
// 执行脚本
const result = await page.evaluate(() => {
// 在此处编写要执行的脚本
let input = document.querySelector("input#kw");
input.value = "nodejs教学";
let search = document.querySelector("input#su");
search.click();
return "已搜索";
});
console.log(result); // 输出脚本执行结果
// 等待两秒等待页面加载完成
await page.waitForTimeout(2000);
await page.screenshot({
path: "nodejs.png",
fullPage: true,
});
let cookie = await page.cookies();
// 跟踪
// 启动跟踪
await page.tracing.start({ path: "trace.json" });
。。。。。。
// 停止跟踪
await page.tracing.stop();
// 导出跟踪结果
const tracingData = await page.tracing.export();
// 保存跟踪结果为JSON文件
require('fs').writeFileSync('trace.json', tracingData);