Puppeteer抓取pdf 文件


2024-09-13 17:11:15

chrome中内置了plugin pdf.js来处理pdf文件,用户点击pdf文件后,变成预览。 在直接抓取时,会弹出一个新的窗口,在新窗口先下载pdf.js相关的页面,然后用chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/类似的请求来下载实际内容。 程序中可以从这个请求中,取回bytes,然后存为pdf.

        const tarType = target.type()
                    let resUrl
                    let idx = 1
                    if (tarType === 'other') {
                        target.asPage().then(oPage=>{
                            if (oPage) {
                                oPage.on('response', async (response) => {
            ......
                                        if (resUrl.startsWith('chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/') && !resUrl.endsWith('.js')) {
                                            if (response.ok()) {
                                                data  = await response.buffer()
                                                await fs.writeFile('pdfs\\' + qs.unescape(fileName), data)
            

可是这样做有个问题,就是正常情况下,pdf是在一个新窗口,但点击几次后,有可能在本窗口打开,就是page.close()就会报错。
试了几种方法,也不知原因,只好绕过。

  1. puppeteer运行后,先进入设置,把pdf的打开方式变成"下载"
  2. 再通过设置下载路径,让pdf自动到新路径下
    await client.send('Page.setDownloadBehavior', {
                    behavior: 'allow',
                    downloadPath: 'D:\\Projects\\skyCrawler\\pdfs'
                });