難道爬蟲只能用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
是能夠上天的,或許將來它真的什麼都能作。這麼優質簡短的教程,請收藏 或者轉發給您的朋友,謝謝。