puppeteer爬蟲

利用空閒時間,學習了下puppeteer爬蟲,我也想爬取下網上的資源

1.部分api

  • puppeteer.launch(options)
參數名稱 參數類型 參數說明
ignoreHTTPSErrors boolean 在請求的過程當中是否忽略 Https 報錯信息,默認爲 false
headless boolean 是否以「無頭」的模式運行chrome,也就是不顯示UI,默認爲true
executablePath string 可執行文件的路徑,Puppeteer 默認是使用它自帶的 chrome webdriver, 若是你想指定一個本身的 webdriver 路徑,能夠經過這個參數設置
slowMo number 使 Puppeteer 操做減速,單位是毫秒。若是你想看看 Puppeteer 的整個工做過程,這個參數將很是有用
args Array(String) 傳遞給 chrome 實例的其餘參數,好比你能夠設置瀏覽器窗口大小具體參數
timeout number 等待chrome實例啓動的最長時間,默認是3000ms,若是傳入0,則不限制時間
dumpio boolean 是否將瀏覽器錦程stdout和stderr導入到process.stdout和process.stderr中,默認爲false
userDataDir string 設置用戶數據目錄,默認linux是在~/.config目錄,window 默認在 C:Users{USER}AppDataLocalGoogleChromeUser Data, 其中 {USER} 表明當前登陸的用戶名
env Object 指定對chromium可見的環境變量,默認爲process.env
devtools boolean 是否爲每一個選項卡自動打開DevTools面板,這個選項只有當headless設置爲false的時候有效
  • browser對象api
方法名 說明
browser.close() 返回一個promise對象,用於關閉瀏覽器
browser.newPage() 返回一個promise對象,建立一個page實例
  • page對象
方法名 說明
page.goto(url[, options]) 返回一個promise對象,url是目標連接
page.waitForSelector() 等待某個選擇器的元素加載以後,這個元素能夠是異步加載的
page.evaluate(pageFunction[,args]) 返回一個可序列化的普通對象,pageFunction 表示要在頁面執行的函數, args 表示傳入給 pageFunction 的參數

2.爬取電影網站

const puppeteer = require('puppeteer');

/* 爬蟲的目標連接地址: 豆瓣電影 */
const url = `https://movie.douban.com/tag/#/?sort=R&range=0,10&tags=`;

const sleep = time => new Promise(resolve => {
  setTimeout(resolve, time);
});

(async () => {
  console.log('crawler start to visit the target address');

  /* dumpio 是否將瀏覽器進程stdout和stderr導入到process.stdout和process.stderr中 */
  const browser = await puppeteer.launch({
    args: ['--no-sandbox'],
    dumpio: false
  });
  const page = await browser.newPage();
  await page.goto(url, {
    waitUntil: 'networkidle2'
  });

  await sleep(3000);

  await page.waitForSelector('.more');

  for(let i = 0; i < 1; i++) {
    await sleep(3000);
    await page.click('.more');
  }

  const result = await page.evaluate(() => {
    let $ = window.$;
    let nodeItems = $('.list-wp a');
    let links = [];
    
    /* 獲取對應的元素節點 */
    if(nodeItems.length >= 1) {
      nodeItems.each((index, item) => {
        let elem = $(item);
        let movieId = elem.find('div').data('id');
        let title = elem.find('.title').text();
        let rate = Number(elem.find('.rate').text());
        let poster = elem.find('img').attr('src').replace('s_ratio_poster','l_ratio_poster');

        links.push({
          movieId,
          title,
          rate,
          poster,
        })
      })
    }

    return links;
  });

  browser.close();
  console.log(result)
})();

3.爬取網站內容生成pdf文件

const puppeteer = require('puppeteer');
const url = 'https://cn.vuejs.org/v2/guide/';
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url, { waitUntil: 'networkidle0' });
    /* 選擇你要輸出的那個PDF文件路徑,把爬取到的內容輸出到PDF中,必須是存在的PDF,能夠是空內容,若是不是空的內容PDF,那麼會覆蓋內容 */
    let pdfFilePath = './index.pdf';
    /* 根據你的配置選項,咱們這裏選擇A4紙的規格輸出PDF,方便打印 */
    await page.pdf({
        path: pdfFilePath,
        format: 'A4',
        scale: 1,
        printBackground: true,
        landscape: false,
        displayHeaderFooter: false
    });
    browser.close();
})()
正在努力學習中,若對你的學習有幫助,留下你的印記唄(點個贊咯^_^)
相關文章
相關標籤/搜索