訪問人數:

快速學會Nodejs爬蟲

2024-06-17 03:00

前言

當初會研究爬蟲是因為自己喜歡看小說,但又不想使用瀏覽器看(不想等每章的 request 時間和廣告),於是就開始了爬蟲之旅 XD。

請注意! 爬蟲的結果僅供個人使用不要公開或做商業用途,以免觸犯法律。

目標

原本是想要直接爬取小說內容並寫入txt來做範例的,但不知是否違法於是將目標改成:

獲取 iT 幫幫忙一到五頁的文章標題並寫入 txt

步驟 1

首先創建一個全新的 node 專案並加入所需套件:

console
1mdkir reptile 2cd reptile 3npm init 4npm i axios 5npm i cheerio

步驟 2

創建一個index.js檔案,並引入相應套件:

js
1const axios = require("axios"); 2const cheerio = require("cheerio"); 3const fs = require("fs");

步驟 3

偽裝Headers

這很重要,沒有偽裝可能會導致無法爬取:

js
1const 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

js
1const 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

js
1const 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};

完整代碼

js
1const 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等都是可以的。

爬蟲除了可以爬取文字外也可以做其他應用,例如: 股票資訊、圖片、新聞等等,根據你的需求來修改代碼,最後再提醒一次,僅個人使用以免觸犯法律,下次見~