iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 29
0
DevOps

Puppeteer系列 第 29

Puppeteer & 農業OpenData

介紹

來實戰一個案例 因為 政府有提供便民的 http://data.coa.gov.tw/ 所以就試試看把資料爬下來,這樣就可以運用自己想要搜尋的方式去找到自己的資料

效果圖
http://www.giphy.com/gifs/3o751QmrVmrmB7inTi

開始一樣起一個專案 使用 typescript 來製作,好處多多,這個頁面有個分頁 然後有個筆數 第一個動作就是把比數調到最大 所以先調成100筆

await page.goto('http://data.coa.gov.tw/')
await page.waitForSelector('#DefaultPageContent_m_ResultGrid_PageSizeList')
await page.$eval('#DefaultPageContent_m_ResultGrid_PageSizeList', (e: any) => e.value = 100);

接下來開始換頁並爬資料 ,下一步把要解析的先放到
const divsCounts = await page.$$eval('.line', (data: any) => { return data });


import * as puppeteer from 'puppeteer'
import { setTimeout } from 'timers';
import * as fs from 'fs'
(async function go() {
  //console.log(MyKey)

  const browser = await puppeteer.launch({
    headless: false,
    args: ['--start-maximized'],
    //userDataDir: "./userData/"
  });
  const page = await browser.newPage();

  await page.setUserAgent(`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36`)
  console.log('test use agent')
  // await watchDog;
  let currentScreen = await page.evaluate(() => {
    return {
      width: window.screen.availWidth,
      height: window.screen.availHeight,
    };
  });
  //設定預設網頁頁面大小
  await page.setViewport(currentScreen);

  // async function parseAndTask(items) {

  // }
  function rePage() {

  }

  try {
    await page.goto('http://data.coa.gov.tw/')
    await page.waitForSelector('#DefaultPageContent_m_ResultGrid_PageSizeList')
    await page.$eval('#DefaultPageContent_m_ResultGrid_PageSizeList', (e: any) => e.value = 100);
    // let handle = await page.$('#DefaultPageContent_m_ResultGrid_NextPage');
    // await handle.click();

    let handle: any;
    let flag: boolean = true;
    //console.log(handle)
    let i = 0;
    while (flag) {
      console.log(i++)
      //console.log('here')
      try {
        var result = await page.waitForSelector('#DefaultPageContent_m_ResultGrid_NextPage', { timeout: 3000 })
        handle = await page.$('#DefaultPageContent_m_ResultGrid_NextPage');
        await handle.click();
        await page.waitForNavigation();
        // let listHandle = await page.$$(".line");
        //抓取每一頁所有的 tr td欄位
        const divsCounts = await page.$$eval('.line', (data: any) => { return data });
        //console.log(divsCounts)
        //測試時候就會把這個打開抓一頁就好了
        //flag = false;
        // })
      } catch (err) {
        flag = false
      }
    }
    console.log('已跳出')

  } catch (err) {
    console.log('err')
    console.log(err)
  }
})()

最後一篇來講解析 format

https://github.com/polo13999/getOpenData


上一篇
Puppeteer & Dialog
下一篇
Puppeteer & 農業OpenData
系列文
Puppeteer30

尚未有邦友留言

立即登入留言