成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

玩玩puppeteer,實現(xiàn)一個小‘爬蟲’

CoorChice / 3524人閱讀

摘要:獲取實例獲取瀏覽器頁面實例鏈接到百度首頁截屏將截屏按時間戳保存到指定路徑下。關(guān)閉然后執(zhí)行命令最后在文件指定路徑下生成百度首頁的截屏。

Puppeteer

puppeteer官網(wǎng)

一、puppeteer是干什么的?
引用puppeteer官網(wǎng)解釋: Most things that you can do manually in the browser can be done using Puppeteer!

生成頁面的屏幕截圖和PDF。

抓取SPA并生成預(yù)渲染內(nèi)容(即“SSR”)。

自動表單提交,UI測試,鍵盤輸入等。

創(chuàng)建最新的自動化測試環(huán)境。 使用最新的JavaScript和瀏覽器功能直接在最新版本的Chrome中運行測試。

捕獲您網(wǎng)站的[時間線跟蹤]

二、常用API

page.setViewport() 設(shè)置獲取屏幕大小,默認(rèn)獲取屏幕大小為800px * 600px

page.pdf(路徑,大小) 保存為pdf格式圖片

舉例:page.pdf({path: "hn.pdf", format: "A4"});

page.evaluate(fn) 執(zhí)行chrome的api

舉例:

 await page.evaluate(() => {
     return {
         width: document.documentElement.clientWidth,
         height: document.documentElement.clientHeight,
    deviceScaleFactor: window.deivcePixelRatio
    };        
})

puppeteer.launch({headless: false}); 打開瀏覽器,默認(rèn)值是true

更多API

三、舉個栗子:截取屏幕 3.1 代碼
const puppeteer = require("puppeteer");
// 引用default.js的sceenshot路徑,將截取的屏幕pdf保存到該路徑下。
const { screenshot } = require("./config/default.js");

(async () => {
  // 獲取browser實例
  const browser = await puppeteer.launch();
  // 獲取瀏覽器tab頁面實例
  const page = await browser.newPage();
  // 鏈接到百度首頁
  await page.goto("https://www.baidu.com");
  // 截屏
  await page.screenshot({
    // 將截屏按時間戳保存到指定路徑下。
    path: `${screenshot}/${Date.now()}.png`
  });
  // 關(guān)閉
  await browser.close();
})();
3.2 然后執(zhí)行命令
node src/screenshot.js
3.3 最后在screenshot文件指定路徑下生成百度首頁的截屏。 四、爬取百度圖片列表 4.1 實現(xiàn)思路

模擬用戶打開瀏覽器

模擬打開tab頁

模擬前往百度圖片頁面

模擬focus到輸入框,輸入查詢值, 點擊查詢按鈕

抓取圖片

通過writeFile,將圖片下載到指定路徑下。

4.2 目錄結(jié)構(gòu)
.
|-mn
|-src
|   |-config
|   |    |-default.js     
|   |-helper
|   |    |-srcToImg.js
|   |-mn.js
|-package.json
4.3 mn.js 主文件
const puppeteer = require("puppeteer");
const { mn } = require("./config/default");
const srcToImg = require("./helper/srcToImg");
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto("https://image.baidu.com");
  console.log("go to https://image.baidu.com");
  await page.setViewport({
    width: 1920,
    height: 1080
  });
  console.log("reset viewport");
  await page.focus("#kw");
  await page.keyboard.sendCharacter("狗");
  await page.click(".s_search");
  console.log("go to search list");
  page.on("load", async () => {
    console.log("page loading done, start fetch ...");
    const srcs = await page.evaluate(() => {
      const images = document.querySelectorAll("img.main_img");
      return Array.prototype.map.call(images, img => img.src);
    });
    console.log(`get ${srcs.length} image, start download`);
    
    srcs.forEach(async (src) => {
      await srcToImg(src, mn);
    });
    await browser.close();
  })
})();
4.4 default.js 路徑
const path = require("path");
module.exports = {
  screenshot: path.resolve(__dirname, "../../screenshot"),
  mn: path.resolve(__dirname, "../../mn")
}
4.5 srcToImg.js 解析圖片地址
const http = require("http");
const https = require("https");
const fs = require("fs");
const path = require("path");
const { promisify } = require("util");
const writeFile = promisify(fs.writeFile);

module.exports = async(src, dir) => {
  if(/.(jpg|png|gif)$/.test(src)) {
    await urlToImg(src, dir);
  }else {
    await base64ToImg(src, dir);?
  }
}

// 識別src為http或者h(yuǎn)ttps的圖片
const urlToImg = promisify((url, dir, callback) => {
  const mod = /^https:/.test(url) ? https : http;
  const ext = path.extname(url);
  const file = path.join(dir, `${Date.now()}${ext}`);
  mod.get(url, res => {
    res.pipe(fs.createWriteStream(file))
      .on("finish", () => {
        callback();
        console.log(file);
      })
  })
})

// 識別src為base64地址的圖片
const base64ToImg = async (base64Str, dir) => {
  // data: image/jpeg;base64,/raegreagearg
  const matchs = base64Str.match(/^data:(.+?);base64,(.+)$/);
  try {
    const ext = matches[1].split("/")[1]
      .replace("jpeg", "jpg");
    const file = path.join(dir, `${Date.now()}.${ext}`);
    await writeFile(file, match[2], "base64");
    console.log(file);
  } catch (ex) {
    console.log("非法 base64 字符串");
  }
}
4.6 最終在mn文件夾中存入爬取到的圖片。
go to https://image.baidu.com
reset viewport
go to search list
page loading done, start fetch ...
get 46 image, start download
非法 base64 字符串
非法 base64 字符串
非法 base64 字符串
非法 base64 字符串
非法 base64 字符串
非法 base64 字符串
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351397.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351396.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351398.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351400.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351405.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351386.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351399.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351405.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351405.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351402.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351412.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351413.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351403.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351398.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351399.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351403.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351406.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351401.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351408.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351404.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351414.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351400.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351402.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351413.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351408.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351414.jpg
/Users/lius/Desktop/web spider/headless-crawler/headless_crawler/mn/1530800351413.jpg
......
4.7 mn文件夾下

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95981.html

相關(guān)文章

  • Koa2 + Mongo + 爬蟲 搭建 說微信程序(本地開發(fā)篇)

    摘要:前言根據(jù)慕課網(wǎng)實現(xiàn)電影微信公眾號前后端開發(fā)學(xué)習(xí)后的改造由于上下班期間會看會小說,但是無奈廣告太多,還要收費,于是結(jié)合課程,進(jìn)行開發(fā),并上傳到自己的微信小程序。 前言:根據(jù)慕課網(wǎng) Koa2 實現(xiàn)電影微信公眾號前后端開發(fā) 學(xué)習(xí)后的改造 由于上下班期間會看會小說,但是無奈廣告太多,還要收費,于是結(jié)合課程,進(jìn)行開發(fā),并上傳到自己的微信小程序。 showImg(https://segment...

    Kross 評論0 收藏0
  • Koa2 + Mongo + 爬蟲 搭建 說微信程序(本地開發(fā)篇)---編碼時遇到的問題

    摘要:更新于利用重構(gòu)了下此項目,有興趣的可以參考看看,傳送門首先感謝作者的分享,很贊,原文地址這里記錄下編碼遇到的問題,這里只針對進(jìn)行了驗證。 更新于 2019-01-02 利用 eggjs 重構(gòu)了下此項目,有興趣的可以參考看看,傳送門 首先感謝作者的分享,很贊~,原文地址 這里記錄下編碼遇到的問題,這里只針對 sever 進(jìn)行了驗證。有同樣遇到問題的童鞋,可以作為參照~ 本地環(huán)境: ...

    liangdas 評論0 收藏0
  • puppeteer爬蟲

    摘要:利用空閑時間,學(xué)習(xí)了下爬蟲,我也想爬取下網(wǎng)上的資源部分參數(shù)名稱參數(shù)類型參數(shù)說明在請求的過程中是否忽略報錯信息,默認(rèn)為是否以無頭的模式運行,也就是不顯示,默認(rèn)為可執(zhí)行文件的路徑,默認(rèn)是使用它自帶的如果你想指定一個自己的路徑,可以通過這個參數(shù)設(shè) 利用空閑時間,學(xué)習(xí)了下puppeteer爬蟲,我也想爬取下網(wǎng)上的資源 1.部分api puppeteer.launch(options) 參數(shù)...

    scola666 評論0 收藏0
  • 手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)

    摘要:本文將介紹如何使用和抓取主流的技術(shù)博客文章,然后用搭建一個小型的技術(shù)文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進(jìn)行程序化控制。相對于,是新的開源項目,而且是谷歌開發(fā),可以使用很多新的特性。 背景 說到爬蟲,大多數(shù)程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強(qiáng)大的生態(tài)圈,有g(shù)erapy等優(yōu)秀的可視化界面。但...

    LinkedME2016 評論0 收藏0
  • 手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)

    摘要:本文將介紹如何使用和抓取主流的技術(shù)博客文章,然后用搭建一個小型的技術(shù)文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進(jìn)行程序化控制。相對于,是新的開源項目,而且是谷歌開發(fā),可以使用很多新的特性。 背景 說到爬蟲,大多數(shù)程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強(qiáng)大的生態(tài)圈,有g(shù)erapy等優(yōu)秀的可視化界面。但...

    Jeffrrey 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<