TypeScript 和 jsdom 庫建立爬蟲程式示例

mmz_77發表於2024-01-08

TypeScript 簡介

TypeScript 是一種由微軟開發的自由和開源的程式語言。它是 JavaScript 的一個超集,可以編譯生成純 JavaScript 程式碼。TypeScript 增加了可選的靜態型別和針對物件的程式設計功能,使得開發更加大規模的應用容易。

jsdom 簡介

jsdom 是一個在 Node.js 環境中模擬瀏覽器環境的庫,它可以解析 HTML、操作 DOM,並提供類似瀏覽器的 API。在網頁爬蟲開發中,jsdom 可以方便地解析網頁內容,提取我們需要的資訊。

假設我們需要獲取 上的特定資料,例如使用者資訊、內容帖子等。其次,手動訪問網站並逐一複製貼上資料顯然是低效且不可行的。因此,我們需要一個自動化的爬蟲程式來幫助我們從網站上獲取所需的資料。

目標分析:

我們的目標是構建一個爬蟲程式,能夠自動訪問,並特定獲取的資料。為了實現這個目標,我們需要分析網站的頁面結構和資料來源,找到資料的介面規律,並編寫程式碼來獲取和處理這些資料。

構建爬蟲框架:首先,我們需要構建一個爬蟲框架,用於傳送網頁請求、解析網頁內容,並提取我們需要的資料。在這個框架中,我們將使用 TypeScript 程式語言和 jsdom 庫來模擬瀏覽器環境,便於在 Node.js 環境中解析和操作網頁內容。 然後,我們建立一個 TypeScript 檔案 spider.ts ,並編寫爬蟲框架的程式碼

import * as jsdom from 'jsdom';
import * as request from 'request';
const { JSDOM } = jsdom;
class Spider {
  async fetch(url: string): Promise<string> {
    return new Promise((resolve, reject) => {
      request(url, (error, response, body) => {
        if (!error && response.statusCode === 200) {
          resolve(body);
        } else {
          reject(error);
        }
      });
    });
  }
  async parse(html: string, selector: string): Promise<string[]> {
    const dom = new JSDOM(html);
    const elements = dom.window.document.querySelectorAll(selector);
    const data: string[] = [];
    elements.forEach((element) => {
      data.push(element.textContent);
    });
    return data;
  }
}
// 使用示例
const spider = new Spider();
spider.fetch(')
  .then((html) => {
    return spider.parse(html, 'h1');
  })
  .then((data) => {
    console.log('提取的資料:', data);
  })
  .catch((error) => {
    console.error('請求失敗:', error);
  });

然而,在實際爬取的過程中,我們可能會遇到網站的反爬蟲機制,比如頁面載入時需要進行登入驗證、頁面結構的間隙變化等問題。針對這些問題,我們可以考慮以下處理要點和調整機制:

  1. 使用代理IP:透過使用代理IP來隱藏我們的真實IP地址,從而減少網站對於相同IP的訪問限制。
  2. 設定請求頭資訊:模擬瀏覽器的請求頭資訊,包括User-Agent、Referer等,使得我們的請求看起來原來是來自真實的瀏覽器。
  3. 使用延遲請求:在請求頁面內容時,可以設定隨機的延遲時間,避免對網站伺服器造成過大的壓力,也可以規避網站對於間歇請求的限制。

完整的實現程式碼過程如下:

import { JSDOM } from 'jsdom';
import fetch from 'node-fetch';
const proxyHost = "
const proxyPort = "5445";
const proxyUser = "16QMSOML";
const proxyPass = "280651";
async function fetchPage(url: string): Promise<string> {
  const response = await fetch(url, {
    agent: `{proxyUser}:${proxyPass}@${proxyHost}:${proxyPort}`
  });
  const body = await response.text();
  return body;
}
async function main() {
  const url = 'http://';
  const html = await fetchPage(url);
  const dom = new JSDOM(html);
  // 在這裡進行頁面結構的解析和資料提取
}
main();

當然,實際應用中還需要根據具體情況進行更多的處理和調整,比如處理登入、動態頁面載入等問題。這些處理和機制調整的加入可以幫助我們更好地應對網站的反爬蟲機制,確保我們能夠順利地獲取所需的資料。



來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/31522063/viewspace-3003110/,如需轉載,請註明出處,否則將追究法律責任。

相關文章