快速學會Nodejs爬蟲
2024-06-17 03:00
前言
當初會研究爬蟲是因為自己喜歡看小說,但又不想使用瀏覽器看(不想等每章的 request 時間和廣告),於是就開始了爬蟲之旅 XD。
請注意! 爬蟲的結果僅供個人使用不要公開或做商業用途,以免觸犯法律。
目標
原本是想要直接爬取小說內容並寫入txt來做範例的,但不知是否違法於是將目標改成:
獲取 iT 幫幫忙一到五頁的文章標題並寫入 txt
步驟 1
首先創建一個全新的 node 專案並加入所需套件:
console1mdkir reptile 2cd reptile 3npm init 4npm i axios 5npm i cheerio
步驟 2
創建一個index.js
檔案,並引入相應套件:
js1const axios = require("axios"); 2const cheerio = require("cheerio"); 3const fs = require("fs");
步驟 3
偽裝Headers,
這很重要,沒有偽裝可能會導致無法爬取:
js1const headers = { 2 Accept: "*/*", 3 "Content-Type": "application/x-www-form-urlencoded", 4 "User-Agent": 5 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" 6};
步驟 4
爬蟲 function,用來獲取每篇文章的 title
js1const GetITHelpItems = (page) => { 2 return new Promise((resolve, reject) => { 3 axios 4 .get(`https://ithelp.ithome.com.tw/?page=${page}`, { headers }) //你要爬取的網址 5 .then((v) => { 6 var $ = cheerio.load(v.data); 7 var titles = $(".tabs-content .qa-list .qa-list__title-link"); //要爬取內容的css結構 8 var content = ""; 9 10 //將所有符合爬取內容的資料提取並透過resolve回傳 11 for (let i = 0; i < titles.length; i++) 12 content += titles[i].children[0].data + "\n"; 13 14 resolve(content); 15 }) 16 .catch(() => { 17 reject("error"); 18 }); 19 }); 20};
步驟 5
將獲取的結果寫入 txt
js1const start = async () => { 2 for (let i = 1; i <= 5; i++) { 3 var text = await GetITHelpItems(i); 4 fs.appendFile("./a.txt", text, function (error) {}); 5 } 6};
完整代碼
js1const axios = require("axios"); 2const cheerio = require("cheerio"); 3const fs = require("fs"); 4 5const headers = { 6 Accept: "*/*", 7 "Content-Type": "application/x-www-form-urlencoded", 8 "User-Agent": 9 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" 10}; 11 12const GetITHelpItems = (page) => { 13 return new Promise((resolve, reject) => { 14 axios 15 .get(`https://ithelp.ithome.com.tw/?page=${page}`, { headers }) 16 .then((v) => { 17 var $ = cheerio.load(v.data); 18 var titles = $(".tabs-content .qa-list .qa-list__title-link"); 19 var content = ""; 20 21 for (let i = 0; i < titles.length; i++) 22 content += titles[i].children[0].data + "\n"; 23 24 resolve(content); 25 }) 26 .catch(() => { 27 reject("error"); 28 }); 29 }); 30}; 31 32const start = async () => { 33 for (let i = 1; i <= 5; i++) { 34 var text = await GetITHelpItems(i); 35 fs.appendFile("./a.txt", text, function (error) {}); 36 } 37}; 38 39start();
最後
本文章是以存入 txt作為範本,讀者可以根據需求變成存入資料庫、信箱發送、google 試算表還是Telegram等都是可以的。
爬蟲除了可以爬取文字外也可以做其他應用,例如: 股票資訊、圖片、新聞等等,根據你的需求來修改代碼,最後再提醒一次,僅個人使用以免觸犯法律,下次見~