上天的Node.js之爬虫篇 15行代码爬取京东淘宝资本 【深入浅出】

岂非爬虫只能用
python 做? 不,我们上天的
Node.js 也能够做!

  • 须要预备的包

    • 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的笔墨内容,末了放到一个数组中

  • 我们的async函数上面一共分了五步, 只要 puppeteer.launch() ,

browser.newPage(), browser.close() 是牢固的写法。

  • 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 是能够上天的,也许将来它真的什么都能做。这么优良简短的教程,请珍藏

或许转发给您的朋侪,感谢。

    原文作者:Peter谭金杰
    原文地址: https://segmentfault.com/a/1190000018620152
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞