YBFACC / blog

仅记录个人学习使用
3 stars 0 forks source link

puppeteer小练习 #30

Open YBFACC opened 4 years ago

YBFACC commented 4 years ago

puppeteer小练习

使用puppeteer来爬取漫画

每章漫画的地址http://xxx.com/m12942/

img的地址为http://xxx.com/1/64/12942/6_4535.jpg?cid=12942&key=8321fe3a9daf63df94cd1cc9503a870c&uk=

img的地址暴露,没有在header中进行校验,使用该地址可以直接拿到图片。

我们可以使用puppeteer来进行自动化操作,存贮一章漫画的所有img链接。

有了img链接,就可以自己写个node脚本请求下载

省去了我们自己分析http的参数。

大致思路

const puppeteer = require('puppeteer')

async function getUrl() {
  const browser = await puppeteer.launch({
    executablePath: '/Applications/Chromium.app/Contents/MacOS/Chromium',
    headless: true,
    defaultViewport: { width: 1440, height: 1000 }
  })
  const page = await browser.newPage()
  page.setUserAgent(
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
  )
  await page.goto(`http://xxx.com/m12942/`)
    //存储所有img链接
  const url_list = []

  await page.waitForSelector('.bottom-page2')

  const str = await page.$eval('.bottom-page2', item => item.textContent)
    //获取img的数量
  let index = parseInt(str.match(/\-(\d+)/)[1], 10)
  console.log(index)
  while (index > 0) {
    await page.waitForSelector('img[id=cp_image]')
    await page.waitForSelector('.bottom-right :nth-child(4)')

    const url_item = await page.$eval('img[id=cp_image]', item => item.src)
    url_list.push(url_item)
        //跳转页面
    await page.evaluateHandle(() => Promise.resolve(window.ShowNext()))
    index--
  }

  await browser.close()

  return url_list
}

module.exports = getUrl

a标签

<a href="javascript:ShowNext();"><img src=""></a>

第一次看见这样的a标签。可以在点击a标签时,直接触发js函数。