切換語言為:簡體

以Java專案舉例說明反爬蟲常用方法

  • 爱糖宝
  • 2024-10-22
  • 2034
  • 0
  • 0
  1. 反爬蟲操作概述

反爬蟲是一系列用於防止網路爬蟲(自動化程式)過度訪問網站、獲取資料的措施。主要操作包括以下幾個方面:

  • 識別爬蟲:透過分析訪問請求的特徵來區分正常使用者和爬蟲。例如,監測請求頻率、請求頭資訊(如User - Agent)、IP地址訪問模式等。正常使用者的訪問通常具有一定的時間間隔、多樣化的請求頭,而爬蟲可能會在短時間內發起大量請求,並且請求頭可能比較固定或者不符合正常瀏覽器的特徵。

  • 限制訪問:當識別出可能是爬蟲的訪問時,採取限制措施。這可以包括限制IP訪問頻率,如每分鐘或每小時允許的請求次數;或者根據使用者的行為模式進行限制,如檢測到異常頻繁地訪問某些敏感頁面(如價格資料頁面)時進行限制。

  • 驗證碼驗證:要求使用者(可能是爬蟲)進行驗證碼驗證。驗證碼可以是圖片驗證碼(如識別扭曲的字元、數字)、滑動驗證碼(透過滑動滑塊完成拼圖驗證)或簡訊驗證碼等。這增加了自動化訪問的難度,因為爬蟲很難自動識別和完成驗證碼的驗證過程。

  • 資料加密和混淆:對關鍵資料(如價格、庫存等敏感資訊)進行加密或者混淆處理。這樣即使爬蟲獲取到了資料,也很難解析出真實有用的資訊。例如,採用簡單的加密演算法對價格資料進行加密,或者透過新增噪聲、隨機偏移等方式混淆資料。

  • 動態頁面載入:採用動態載入技術,如Ajax(非同步JavaScript和XML)。頁面的部分內容(特別是重要資料)透過JavaScript動態載入,而不是直接在HTML頁面中呈現。這樣,爬蟲如果只是簡單地解析HTML,將無法獲取完整的資料,需要能夠執行JavaScript才能獲取全部資訊,但這對於很多簡單的爬蟲來說是比較困難的。

  1. Java中的反爬蟲方案

  • 檢查請求頭(User - Agent)

    import javax.servlet.http.HttpServletRequest;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    public class AntiCrawlerController {
        @RequestMapping("/")
        public String checkUserAgent(HttpServletRequest request) {
            String userAgent = request.getHeader("User - Agent");
            if (userAgent == null ||!userAgent.contains("Chrome") &&!userAgent.contains("Firefox")) {
                return "可能是爬蟲訪問";
            }
            return "正常訪問";
        }
    }

    • 在Java的Web應用中,可以透過獲取請求頭中的User - Agent欄位來判斷訪問來源。正常的瀏覽器會有特定的User - Agent標識,如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36。可以在Java的Servlet或者Spring MVC的控制器中獲取請求頭資訊,如下:

  • 限制IP訪問頻率

    import com.google.common.cache.Cache;
    import com.google.common.cache.CacheBuilder;
    import javax.servlet.http.HttpServletRequest;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.concurrent.TimeUnit;
    @RestController
    public class AntiCrawlerController {
        private static final Cache<String, Integer> ipAccessCache = CacheBuilder.newBuilder()
              .expireAfterWrite(1, TimeUnit.MINUTES)
              .build();
        @RequestMapping("/")
        public String checkIPAccess(HttpServletRequest request) {
            String ipAddress = request.getRemoteAddr();
            Integer accessCount = ipAccessCache.getIfPresent(ipAddress);
            if (accessCount == null) {
                ipAccessCache.put(ipAddress, 1);
            } else if (accessCount >= 10) {
                return "訪問過於頻繁,可能是爬蟲";
            } else {
                ipAccessCache.put(ipAddress, accessCount + 1);
            }
            return "正常訪問";
        }
    }

    • 可以使用快取(如Guava Cache)來記錄每個IP地址的訪問次數和時間。例如,在一個基於Spring Boot的應用中:

  • 使用驗證碼(以簡單的文字驗證碼為例)

    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.Random;
    public class CaptchaGenerator {
        public static void main(String[] args) {
            int width = 120;
            int height = 40;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = image.createGraphics();
            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, width, height);
            g2d.setColor(Color.BLACK);
            Font font = new Font("Arial", Font.BOLD, 30);
            g2d.setFont(font);
            Random random = new Random();
            StringBuilder captchaText = new StringBuilder();
            for (int i = 0; i < 4; i++) {
                int digit = random.nextInt(10);
                captchaText.append(digit);
                g2d.drawString(digit + "", 20 + i * 20, 30);
            }
            g2d.dispose();
            try {
                ImageIO.write(image, "png", new File("captcha.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("驗證碼: " + captchaText.toString());
        }
    }

    • 然後在Web應用中,將生成的驗證碼圖片返回給使用者,並在使用者提交驗證碼後進行驗證。

    • 可以使用Java的圖形處理庫(如Java AWT或JavaFX)來生成簡單的文字驗證碼。以下是一個簡單的示例,生成包含4個數字的驗證碼:

  1. OTA平臺反爬蟲設計

  • 使用者行為分析模組

    • 建立使用者行為分析系統,記錄每個使用者(透過IP和使用者賬號等標識)的訪問路徑、訪問頻率、停留時間等行為資料。可以使用大資料儲存和分析技術,如Hadoop、Spark等,對海量的使用者行為資料進行儲存和分析。

    • 例如,透過分析發現一個使用者在短時間內頻繁訪問不同酒店的價格頁面,且沒有任何其他正常的瀏覽行為(如檢視酒店設施、位置等),這可能是一個爬蟲行為。

  • 多層防護策略

    • 在應用程式內部(如Java後端程式碼),採用上述提到的檢查請求頭、限制IP訪問頻率、使用驗證碼等反爬蟲措施。同時,對於一些高價值的數據接口(如預訂介面),可以採用Token認證、數字簽名等更嚴格的安全措施。

    • 例如,為每個合法使用者生成一個帶有有效期的Token,在使用者訪問預訂介面時,必須攜帶有效的Token,並且後端對Token進行驗證,這樣可以防止未經授權的爬蟲訪問預訂介面。

    • 在伺服器端設定反向代理(如Nginx),可以在反向代理層對訪問請求進行初步篩選。例如,檢查請求頭的合法性、限制單個IP的連線數等。對於疑似爬蟲的請求,可以直接返回錯誤資訊或者重定向到驗證碼驗證頁面。

    • 與網路安全廠商合作,採用一些網路安全防護產品,如WAF(Web Application Firewall),對常見的爬蟲攻擊模式(如SQL注入式爬蟲、XSS攻擊式爬蟲)進行防範。

    • 在前端頁面(如HTML、JavaScript)中採用混淆技術,對於重要的價格和庫存資訊,透過JavaScript函式進行動態載入和渲染,並且對這些函式進行程式碼混淆,增加爬蟲解析的難度。例如,使用Webpack等工具對JavaScript程式碼進行壓縮和混淆。

    • 採用前端加密技術,對部分資料進行加密後再傳輸。例如,使用JavaScript的加密庫(如Crypto - JS)對酒店價格資料進行簡單加密,然後在後端進行解密。

    • 第一層:前端防護

    • 第二層:網路層防護

    • 第三層:應用層防護

  • 動態更新策略

    • 定期更新反爬蟲策略和技術,以應對不斷進化的爬蟲技術。例如,定期更換驗證碼的型別(從圖片驗證碼切換到滑動驗證碼)、更新加密演算法、調整IP訪問頻率限制標準等。同時,建立一個監測和反饋機制,及時發現新的爬蟲攻擊方式,並針對性地調整反爬蟲策略。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.