puppeteer 简单使用和一个简单的case

因为接下来要做抓取,可能要用到puppeteer, 就重新有看了一下。
需要安装puppeteer. npm install puppeteer --save 会自动下载一个Chromium, 如果不需要可能不用下。

puppeteer 超时问题处理
js中的for of 类似 python的for in

这里的抓取匹配的内容,用的都是chrome里面的selector. 当然,有些还是得你自己写,如何检查?可以chrome里面安装下面的插件
css-selector-tester
puppeteer 官方文档

page.evaulate里面的内容是没法打印出来的,如果需要打印,可以参考 page.evaluate 里面打印日志

page.evaluate 是没法直接朝里面传递参数的。如果需要像例子当中那样传递,可以这样

puppeteer 的一些其他的使用文章

https://juejin.im/post/5d4059305188255d38489a8c
https://www.qikegu.com/docs/4539
https://github.com/checkly/puppeteer-examples
chrome实例 远程部署

这里给个简单的抓取的例子

const puppeteer = require('puppeteer')
const url = 'https://www.stoloto.ru/ruslotto/archive'
const selector = '#content > div.data.drawings_data'
const selectorAll = '#content > div.data.drawings_data .elem'

const Craw = async (url, selectorAll) => {
  const browser = await puppeteer.launch() // 使用这种方式并不高效,因为得打开chrome. 生产里面最好还是用connect的方式,这样维护一个打开的chrome,打开页面就可以了。
  const page = await browser.newPage()
  page.on('console', consoleObj => console.log(consoleObj.text()))
  const waitfor = selector
  await page.setDefaultNavigationTimeout(0)
  await page.goto(url)
  await page.waitForSelector(waitfor)
  const CrawResult = await page.evaluate((selectorAll) => {
    const dataList = []
    const results = document.querySelectorAll(selectorAll)
    for (const element of results) {
      const data = {}
      data.drawDate = element.querySelector('.draw_date').innerText
      data.draw = element.querySelector('.draw').innerText
      data.drawUrl = element.querySelector('.draw a').href
      data.numbers = element.querySelector('.numbers_wrapper').innerText
      data.super_prize = element.querySelector('.super_prize').innerText
      dataList.push(data)
    }
    return dataList
  }, selectorAll)

  browser.close()
  return CrawResult
}

// 下面是两种外部调用async函数的方式。

// (async () => {
//   const data = await Craw(url, selectorAll)
//   console.log(data)
// })()

Craw(url, selectorAll).then(value => {
  console.log(value)
})

你可能感兴趣的:(爬虫)