上天的Node.js之爬蟲篇 15行代碼爬取京東淘寶資源 【深刻淺出】

難道爬蟲只能用 python 作? 不,咱們上天的 Node.js 也能夠作!
  • 須要準備的包node

    • Node.js的最新版本 下載地址 Node.js官網
    • npm 包管理器下載 下載最新的官網版本 Node.js 會自帶 npm
    • npm的第三方包 puppeteer 在對應的js文件內運行命令行工具 npm i puppeteer -D 便可
爬蟲在獲取某些有保護機制的網頁時可能會失效

初入江湖 -自在地境篇

const puppeteer = require('puppeteer'); //  引入依賴  
(async () => {   //使用async函數完美異步 
    const browser = await puppeteer.launch();  //打開新的瀏覽器
    const page = await browser.newPage();   // 打開新的網頁 
    await page.goto('https://www.jd.com/');  //前往裏面 'url' 的網頁
    const result = await page.evaluate(() => {   //這個result數組包含全部的圖片src地址
        let arr = []; //這個箭頭函數內部寫處理的邏輯  
        const imgs = document.querySelectorAll('img');
        imgs.forEach(function (item) {
            arr.push(item.src)
        })
        return arr 
    });
    // '此時的result就是獲得的爬蟲數據,能夠經過'fs'模塊保存'
})()

  複製過去 使用命令行命令 ` node 文件名 ` 就能夠運行獲取爬蟲數據了
這個 puppeteer 的包 ,實際上是替咱們開啓了另外一個瀏覽器,從新去開啓網頁,獲取它們的數據。

瀟灑入世 -逍遙天境篇

  • 上面只爬取了京東首頁的圖片內容,假設個人需求進一步擴大,須要爬取京東首頁

中的全部<a> 標籤對應的跳轉網頁中的全部 title的文字內容,最後放到一個數組中python

  • 咱們的async函數上面一共分了五步, 只有 puppeteer.launch() ,

browser.newPage(), browser.close() 是固定的寫法。npm

  • page.goto 指定咱們去哪一個網頁爬取數據,能夠更換內部url地址,也能夠屢次

調用這個方法。數組

  • page.evaluate 這個函數,內部是處理咱們進入想要爬取網頁的數據邏輯
  • page.goto page.evaluate兩個方法,能夠在async內部調用屢次,

那意味着咱們能夠先進入京東網頁,處理邏輯後,再次調用page.goto這個函數,瀏覽器

注意,上面這一切邏輯,都是 puppeteer這個包幫咱們在看不見的地方開啓了另一個
瀏覽器,而後處理邏輯,因此最終要調用 browser.close()方法關閉那個瀏覽器。
  • 這時候咱們對上一篇的代碼進行優化,爬取對應的資源。
const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.jd.com/');
    const hrefArr = await page.evaluate(() => {
        let arr = [];
        const aNodes = document.querySelectorAll('.cate_menu_lk');
        aNodes.forEach(function (item) {
            arr.push(item.href)
        })
        return arr
    });
    let arr = [];
    for (let i = 0; i < hrefArr.length; i++) {
        const url = hrefArr[i];
        console.log(url) //這裏能夠打印 
        await page.goto(url);
        const result = await page.evaluate(() => { //這個方法內部console.log無效 
            
              return  $('title').text();  //返回每一個界面的title文字內容
        });
        arr.push(result)  //每次循環給數組中添加對應的值
    }
    console.log(arr)  //獲得對應的數據  能夠經過Node.js的 fs 模塊保存到本地
    await browser.close()
})()
上面有天坑 page.evaluate函數內部的console.log不能打印,並且內部不能獲取外部的變量,只能return返回,
使用的選擇器必須先去對應界面的控制檯實驗過能不能選擇DOM再使用,好比京東沒法使用querySelector。這裏因爲
京東的分界面都使用了jQuery,因此咱們能夠用jQuery,總之他們開發能用的選擇器,咱們均可以用,不然就不能夠。

威震武林 -神遊玄境篇

數據在這個時代很是珍貴,上面兩個能獲取一些指定的特定資源,按照網頁的設計邏輯,選定特定的 href的地址,
能夠先直接獲取對應的資源,也能夠經過再次使用 page.goto方法進入,再調用 page.evaluate() 處理邏輯。
這裏就不作過多介紹了,畢竟 Node.js 是能夠上天的,或許將來它真的什麼都能作。這麼優質簡短的教程,請收藏 或者轉發給您的朋友,謝謝。
相關文章
相關標籤/搜索