js 爬虫抓取网页数据(以前第一篇爬虫教程.js爬虫入门(一)爬取)
优采云 发布时间: 2021-12-13 08:30js 爬虫抓取网页数据(以前第一篇爬虫教程.js爬虫入门(一)爬取)
第一篇爬虫教程node.js爬虫介绍(一)爬取静态页面讲解了静态网页的爬取,很简单,但是如果遇到一些动态网页(ajax),直接使用前面的发送请求方法是不可能得到我们想要的数据的,这时候就需要通过爬取动态网页的方法了,selenium和puppeteer都不错,前端
在这里推荐 Puppeteer,不是为了别的,只是因为它是 Google 自己的,并且一直在维护更新。以下是官方文档介绍节点的翻译
Puppeteer 是一个 Node 库,通过 DevTools(开发者工具)协议提供了一系列高级接口来控制 Chrome 或 Chromium(谷歌开源)。默认运行在headless模式(无浏览器UI界面),配置后也可以运行在普通模式。网络
可以使用:ajax
首先,我们必须先安装它,然后才能使用它。最新的Chromium会默认安装下载,大小约300M。铬合金
npm install puppeteer
复制代码
如果你的机器上已经有较新版本的chrome,可以只安装核心版本,但是启动puppeteer时,需要配置本地chrome路径。数据库
npm install puppeteer-core // 核心版本
复制代码
假设我们要爬取拉勾的前端招聘信息。这是一个动态页面。使用此示例尝试抓取。新产品经理
由于chrome操作都是异步操作,为了不回调地狱,推荐使用es7 async await。这种语法具有高度可读性,官方文档也是如此。浏览器
首先使用puppeteer启动浏览器,打开动态页面
需要注意的是,如果使用的是本地浏览器,则需要在启动浏览器配置中传入本地chrome路径markdown。
const browser = await puppeteer.launch({
executablePath: 'C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe'
})
复制代码
在chrome环境中执行函数,获取需要的数据,然后返回到node的执行环境
上图可以看到我们需要的数据的dom位置。在chrome环境执行的函数中,我们需要获取和整理需要的数据。较少的
let list = document.querySelectorAll('.s_position_list .item_con_list li')
let res = []
for (let i = 0; i < list.length; i++) {
res.push({
name: list[i].getAttribute('data-positionname'),
company: list[i].getAttribute('data-company'),
salary: list[i].getAttribute('data-salary'),
require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''),
})
}
return res
复制代码
这里有一个调试技巧,我们可以直接在chrome控制台中编写获取数据的函数,方便调试
最后附上完整代码
const puppeteer = require('puppeteer');
(async () => {
// 启动浏览器
const browser = await puppeteer.launch({
headless: false, // 默认是无头模式,这里为了示范因此使用正常模式
})
// 控制浏览器打开新标签页面
const page = await browser.newPage()
// 在新标签中打开要爬取的网页
await page.goto('https://www.lagou.com/jobs/list_web%E5%89%8D%E7%AB%AF?px=new&city=%E5%B9%BF%E5%B7%9E')
// 使用evaluate方法在浏览器中执行传入函数(彻底的浏览器环境,因此函数内能够直接使用window、document等全部对象和方法)
let data = await page.evaluate(() => {
let list = document.querySelectorAll('.s_position_list .item_con_list li')
let res = []
for (let i = 0; i < list.length; i++) {
res.push({
name: list[i].getAttribute('data-positionname'),
company: list[i].getAttribute('data-company'),
salary: list[i].getAttribute('data-salary'),
require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''),
})
}
return res
})
console.log(data)
})()
复制代码
操作结果
动态网页的爬取也到此完成,但puppeteer的功能远不止这些,还有很多强大的API可用。能够移动到正式文件。
第三期会讲如何定时执行爬虫并存入数据库。