LangChain4j入門:Java開發者的AI應用開發指南

🚀 在AI浪潮席卷全球的今天,Java開發者如何快速上手大語言模型應用開發?LangChain4j為我們提供了完美的解決方案!

前言:為什么Java開發者需要LangChain4j?

想象一下,你正在開發一個企業級應用,需要集成ChatGPT來提供智能客服功能。傳統方式需要直接調用OpenAI API,處理復雜的HTTP請求、錯誤重試、上下文管理等問題。而使用LangChain4j,幾行代碼就能搞定:

ChatLanguageModel model = OpenAiChatModel.builder().apiKey(apiKey).modelName("gpt-3.5-turbo").build();String response = model.generate("如何提高客戶滿意度?").content();

這就是LangChain4j的魅力——讓Java開發者能夠像使用Spring Boot一樣簡單地構建AI應用!

📋 本文概覽

  • LangChain4j是什么,為什么選擇它?
  • 環境搭建和第一個Hello World程序
  • 核心概念解析:LLM vs Chat模型
  • 實戰案例:構建一個智能問答助手
  • 常見問題和最佳實踐

1. LangChain4j:Java生態的AI開發利器

1.1 什么是LangChain4j?

LangChain4j是專為Java開發者設計的大語言模型應用開發框架,它是Python版LangChain在Java生態系統中的完美實現。如果你熟悉Spring Boot的開發體驗,那么LangChain4j會讓你感到非常親切。

核心特性:

  • 🎯 原生Java API:完全符合Java編程習慣
  • 🔒 類型安全:利用Java靜態類型系統,減少運行時錯誤
  • 🔌 多模型支持:OpenAI、Anthropic、Gemini等主流模型
  • 🏗? 模塊化設計:按需引入,避免依賴膨脹
  • 🚀 生產就緒:內置重試、超時、日志等企業級特性

1.2 與原生API調用的對比

傳統方式(直接調用OpenAI API):

// 需要手動構建HTTP請求
HttpClient client = HttpClient.newHttpClient();
String requestBody = """{"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "Hello"}],"temperature": 0.7}""";HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://api.openai.com/v1/chat/completions")).header("Authorization", "Bearer " + apiKey).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(requestBody)).build();// 還需要處理響應解析、錯誤處理等...

LangChain4j方式:

ChatLanguageModel model = OpenAiChatModel.builder().apiKey(apiKey).modelName("gpt-3.5-turbo").temperature(0.7).build();String response = model.generate("Hello").content();

顯而易見,LangChain4j大大簡化了開發復雜度!

2. 環境搭建:5分鐘快速上手

2.1 前置條件

  • JDK 11+(推薦使用JDK 17或21)
  • Maven 3.6+Gradle 7.0+
  • IDE(推薦IntelliJ IDEA)
  • OpenAI API Key(或其他模型提供商的密鑰)

2.2 創建項目

Maven項目配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>langchain4j-demo</artifactId><version>1.0.0</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><langchain4j.version>0.27.1</langchain4j.version></properties><dependencies><!-- LangChain4j核心庫 --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>${langchain4j.version}</version></dependency><!-- OpenAI集成 --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>${langchain4j.version}</version></dependency><!-- 日志支持 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.11</version></dependency></dependencies>
</project>

Gradle項目配置:

plugins {id 'java'
}java {sourceCompatibility = JavaVersion.VERSION_17targetCompatibility = JavaVersion.VERSION_17
}dependencies {implementation 'dev.langchain4j:langchain4j:0.27.1'implementation 'dev.langchain4j:langchain4j-open-ai:0.27.1'implementation 'ch.qos.logback:logback-classic:1.4.11'
}

2.3 API密鑰配置

方式一:環境變量(推薦)

export OPENAI_API_KEY="your-api-key-here"

方式二:配置文件

# application.properties
openai.api.key=your-api-key-here

方式三:系統屬性

java -Dopenai.api.key=your-api-key-here YourMainClass

3. 第一個LangChain4j程序

讓我們創建一個簡單而完整的示例:

package com.example.langchain4j;import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.output.Response;/*** LangChain4j Hello World示例* 展示基本的模型調用和響應處理*/
public class HelloLangChain4j {public static void main(String[] args) {// 1. 獲取API密鑰String apiKey = System.getenv("OPENAI_API_KEY");if (apiKey == null || apiKey.isEmpty()) {System.err.println("? 請設置OPENAI_API_KEY環境變量");System.exit(1);}// 2. 創建聊天模型ChatLanguageModel model = OpenAiChatModel.builder().apiKey(apiKey).modelName("gpt-3.5-turbo").temperature(0.7)          // 控制創造性.timeout(Duration.ofSeconds(60))  // 設置超時.maxRetries(3)             // 設置重試次數.logRequests(true)         // 啟用請求日志.build();// 3. 發送消息并獲取響應System.out.println("🤖 LangChain4j AI助手啟動成功!");System.out.println("📝 正在生成Java學習建議...\n");UserMessage userMessage = UserMessage.from("作為一名有5年經驗的Java開發者,我想學習AI應用開發,請給我一個學習路徑建議。");Response<String> response = model.generate(userMessage);// 4. 輸出結果System.out.println("💡 AI建議:");System.out.println(response.content());// 5. 輸出元數據信息System.out.println("\n📊 調用統計:");System.out.println("Token使用量: " + response.tokenUsage());System.out.println("完成原因: " + response.finishReason());}
}

運行結果示例:

🤖 LangChain4j AI助手啟動成功!
📝 正在生成Java學習建議...💡 AI建議:
作為有5年Java經驗的開發者,你已經具備了很好的基礎!以下是我推薦的AI應用開發學習路徑:1. **理論基礎(1-2周)**- 了解大語言模型基本原理- 學習Prompt Engineering技巧- 熟悉常見AI應用場景2. **LangChain4j實踐(2-3周)**- 掌握基本API調用- 學習記憶管理和上下文處理- 實踐文檔處理和向量搜索3. **進階應用(3-4周)**- Agent開發和工具集成- RAG(檢索增強生成)應用- 多模態應用開發4. **項目實戰(4-6周)**- 構建智能客服系統- 開發文檔問答應用- 創建個人AI助手建議邊學邊練,多看官方文檔和社區案例!📊 調用統計:
Token使用量: TokenUsage{inputTokenCount=45, outputTokenCount=156, totalTokenCount=201}
完成原因: STOP

4. 核心概念深度解析

4.1 LLM vs Chat模型

LangChain4j區分兩種主要的模型類型,理解它們的區別很重要:

LanguageModel(文本補全模型):

LanguageModel model = OpenAiLanguageModel.builder().apiKey(apiKey).modelName("gpt-3.5-turbo-instruct")  // 注意模型名稱.build();// 直接文本補全
String prompt = "Java中的多態性是指";
String completion = model.generate(prompt).content();
// 輸出:Java中的多態性是指同一個接口可以有多種不同的實現方式...

ChatLanguageModel(對話模型):

ChatLanguageModel model = OpenAiChatModel.builder().apiKey(apiKey).modelName("gpt-3.5-turbo")  // 對話模型.build();// 結構化對話
UserMessage message = UserMessage.from("請解釋Java中的多態性");
String response = model.generate(message).content();

4.2 消息類型詳解

LangChain4j支持多種消息類型,模擬真實對話場景:

import dev.langchain4j.data.message.*;// 系統消息:設定AI的角色和行為
SystemMessage systemMsg = SystemMessage.from("你是一位資深的Java架構師,擅長用簡單易懂的方式解釋復雜概念。"
);// 用戶消息:用戶的輸入
UserMessage userMsg = UserMessage.from("什么是Spring Boot的自動配置?");// AI消息:AI的回復
AiMessage aiMsg = AiMessage.from("Spring Boot的自動配置是...");// 組合多條消息進行對話
List<ChatMessage> conversation = Arrays.asList(systemMsg, userMsg);
Response<AiMessage> response = model.generate(conversation);

5. 實戰案例:智能Java學習助手

讓我們構建一個更實用的應用——Java學習助手:

package com.example.langchain4j;import dev.langchain4j.data.message.*;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import java.util.*;/*** 智能Java學習助手* 提供個性化的Java學習建議和代碼解釋*/
public class JavaLearningAssistant {private final ChatLanguageModel model;private final List<ChatMessage> conversationHistory;public JavaLearningAssistant(String apiKey) {this.model = OpenAiChatModel.builder().apiKey(apiKey).modelName("gpt-3.5-turbo").temperature(0.3)  // 降低隨機性,提高準確性.build();this.conversationHistory = new ArrayList<>();// 設置系統角色SystemMessage systemMessage = SystemMessage.from("""你是一位經驗豐富的Java技術專家和教育者,具有以下特點:1. 擅長用簡單易懂的方式解釋復雜的Java概念2. 能夠提供實用的代碼示例和最佳實踐3. 會根據學習者的水平調整解釋的深度4. 積極鼓勵學習者,提供建設性的建議5. 關注Java生態系統的最新發展請始終保持友好、專業的態度,并確保回答的準確性。""");conversationHistory.add(systemMessage);}/*** 與助手對話*/public String chat(String userInput) {// 添加用戶消息UserMessage userMessage = UserMessage.from(userInput);conversationHistory.add(userMessage);try {// 獲取AI回復Response<AiMessage> response = model.generate(conversationHistory);AiMessage aiMessage = response.content();// 添加AI回復到歷史記錄conversationHistory.add(aiMessage);return aiMessage.text();} catch (Exception e) {return "抱歉,我遇到了一些技術問題。請稍后再試。錯誤信息:" + e.getMessage();}}/*** 獲取Java學習路徑建議*/public String getLearningPath(String currentLevel, String goals) {String prompt = String.format("""請為以下學習者制定一個詳細的Java學習路徑:當前水平:%s學習目標:%s請提供:1. 分階段的學習計劃2. 每個階段的重點內容3. 推薦的學習資源4. 實踐項目建議5. 預估學習時間""", currentLevel, goals);return chat(prompt);}/*** 代碼解釋功能*/public String explainCode(String code, String context) {String prompt = String.format("""請詳細解釋以下Java代碼:背景:%s代碼:```java%s```請從以下角度進行解釋:1. 代碼的整體功能2. 關鍵語法和概念3. 設計模式或最佳實踐4. 可能的改進建議5. 相關的Java特性""", context, code);return chat(prompt);}/*** 清除對話歷史(保留系統消息)*/public void clearHistory() {SystemMessage systemMessage = (SystemMessage) conversationHistory.get(0);conversationHistory.clear();conversationHistory.add(systemMessage);}public static void main(String[] args) {String apiKey = System.getenv("OPENAI_API_KEY");if (apiKey == null) {System.err.println("請設置OPENAI_API_KEY環境變量");return;}JavaLearningAssistant assistant = new JavaLearningAssistant(apiKey);Scanner scanner = new Scanner(System.in);System.out.println("🎓 Java學習助手啟動成功!");System.out.println("💡 你可以問我任何Java相關的問題,或者輸入 'exit' 退出");System.out.println("📚 特殊命令:");System.out.println("   - 'path' : 獲取學習路徑建議");System.out.println("   - 'clear': 清除對話歷史");System.out.println("=" * 50);while (true) {System.out.print("\n👤 你: ");String input = scanner.nextLine().trim();if ("exit".equalsIgnoreCase(input)) {System.out.println("👋 再見!祝你Java學習愉快!");break;}if ("clear".equalsIgnoreCase(input)) {assistant.clearHistory();System.out.println("🧹 對話歷史已清除");continue;}if ("path".equalsIgnoreCase(input)) {System.out.print("請輸入你的當前水平(如:初學者/有基礎/有經驗): ");String level = scanner.nextLine();System.out.print("請輸入你的學習目標(如:找工作/提升技能/學習框架): ");String goals = scanner.nextLine();System.out.println("\n🤖 助手: 正在為你制定學習路徑...");String response = assistant.getLearningPath(level, goals);System.out.println(response);continue;}System.out.println("\n🤖 助手: ");String response = assistant.chat(input);System.out.println(response);}scanner.close();}
}

6. 常見問題與最佳實踐

6.1 API密鑰安全管理

? 錯誤做法:

// 永遠不要在代碼中硬編碼API密鑰!
String apiKey = "sk-xxxxxxxxxxxxxxxx";

? 正確做法:

// 方式1:環境變量
String apiKey = System.getenv("OPENAI_API_KEY");// 方式2:配置文件 + 環境變量注入
String apiKey = System.getProperty("openai.api.key", System.getenv("OPENAI_API_KEY"));// 方式3:Spring Boot配置
@Value("${openai.api.key}")
private String apiKey;

6.2 錯誤處理和重試機制

ChatLanguageModel model = OpenAiChatModel.builder().apiKey(apiKey).modelName("gpt-3.5-turbo").timeout(Duration.ofSeconds(60))    // 設置超時.maxRetries(3)                      // 自動重試.logRequests(true)                  // 啟用日志.logResponses(true).build();// 手動錯誤處理
try {Response<String> response = model.generate("你好");System.out.println(response.content());
} catch (Exception e) {System.err.println("調用失敗: " + e.getMessage());// 實現降級邏輯
}

6.3 Token使用優化

// 監控Token使用情況
Response<String> response = model.generate(userMessage);
TokenUsage usage = response.tokenUsage();System.out.println("輸入Token: " + usage.inputTokenCount());
System.out.println("輸出Token: " + usage.outputTokenCount());
System.out.println("總Token: " + usage.totalTokenCount());// 根據Token使用情況調整策略
if (usage.totalTokenCount() > 3000) {System.out.println("?? Token使用量較高,建議優化Prompt");
}

6.4 性能優化建議

  1. 合理設置溫度參數

    • 事實性問答:temperature = 0.1-0.3
    • 創意性內容:temperature = 0.7-0.9
  2. 選擇合適的模型

    • 簡單任務:gpt-3.5-turbo
    • 復雜推理:gpt-4
  3. 優化Prompt長度

    • 避免冗余信息
    • 使用清晰的指令
    • 合理使用示例

7. 總結與展望

通過本文,我們學習了:

? LangChain4j的核心優勢:簡化AI應用開發,提供企業級特性
? 環境搭建:從零開始創建LangChain4j項目
? 基本概念:LLM vs Chat模型,消息類型
? 實戰應用:構建智能Java學習助手
? 最佳實踐:安全、性能、錯誤處理

LangChain4j為Java開發者打開了AI應用開發的大門。它不僅簡化了與大語言模型的交互,還提供了豐富的工具和抽象,讓我們能夠專注于業務邏輯而不是底層實現細節。

🚀 下一篇預告

在下一篇文章《LangChain4j核心組件詳解:模型集成與Prompt工程實戰》中,我們將深入探討:

  • 多種模型提供商的集成方法
  • Prompt模板的高級用法
  • 結構化輸出和流式處理
  • 實際項目中的模型選擇策略

敬請期待!如果本文對你有幫助,請點贊收藏,我們下期見!


🔗 相關資源

  • LangChain4j官方文檔
  • GitHub倉庫
  • 示例代碼

📝 作者簡介
資深Java開發者,專注于AI應用開發和企業級解決方案。歡迎關注我的CSDN,一起探索AI技術的無限可能!

#LangChain4j #Java #AI開發 #大語言模型 #OpenAI #ChatGPT

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89645.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89645.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89645.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

相機光學(五十)——Depth AF

1.什么是Depth AFDepth AF&#xff08;景深自動對焦&#xff09;&#xff0c;也稱為 Depth-of-Field AF&#xff08;景深對焦&#xff09; 或 DEP AF&#xff0c;是一種基于景深范圍的自動對焦技術&#xff0c;核心目標是&#xff1a;確保從前景到背景的一整段距離都在清晰景深…

Unity 堆棧分析實戰指南 C#

Unity 堆棧分析實戰指南 提示&#xff1a;內容純個人編寫&#xff0c;歡迎評論點贊&#xff0c;來指正我。 文章目錄Unity 堆棧分析實戰指南1. 前言2. 什么是堆棧3. Unity 中的堆棧4. 堆棧分析工具5. 如何進行堆棧分析6. 實戰案例分析案例 1: 性能瓶頸分析案例 2: 內存泄漏檢測…

AE MDX L6 L12 L18 電源手側操作使用說明

AE MDX L6 L12 L18 電源手側操作使用說明

Gemini Function Calling 和 Qwen3 Embedding和ReRanker模型

Gemini API 的函數調用&#xff08;Function Calling&#xff09;功能。它解決了傳統大語言模型&#xff08;LLM&#xff09;的一個關鍵局限&#xff1a;LLM 本身是基于訓練數據的“知識庫”&#xff0c;擅長生成文本和回答問題&#xff0c;但無法直接執行代碼、訪問實時數據或…

??VMware Workstation Pro 17.5.0 安裝教程 - 詳細步驟圖解(附下載+激活)?

VMware Workstation Pro 17.5.0 是一款功能強大的虛擬機軟件&#xff0c;允許用戶在一臺計算機上同時運行多個操作系統&#xff08;如 Windows、Linux、macOS&#xff09;&#xff0c;適用于開發、測試、運維及學習環境搭建。本教程提供 ??詳細安裝步驟??&#xff0c;包括 …

端到端神經網絡視頻編解碼器介紹

一、技術演進&#xff1a;從模塊優化到全局智能的范式躍遷 傳統編解碼器的效率天花板&#xff08;1990-2017&#xff09; 架構局限&#xff1a;H.264/HEVC依賴手工設計的運動估計、DCT變換、熵編碼模塊&#xff0c;各模塊獨立優化導致全局效率損失。高分辨率瓶頸&#xff1a;4…

Kubernetes (k8s)環境重啟Pod方式總結

前言&#xff1a;在 Kubernetes (k8s) 中&#xff0c;沒有直接的命令如 kubectl restart pod 來重啟 Pod&#xff0c;因為 Pod 的生命周期由控制器&#xff08;如 Deployments、StatefulSets 或 ReplicaSets&#xff09;管理。重啟操作本質上是通過刪除并重建 Pod 來實現的&…

OOA、OOD 與 OOP:面向對象范式的核心支柱詳解

作為軟件系統架構的核心范式&#xff0c;面向對象方法貫穿軟件開發生命周期。OOA、OOD 和 OOP 分別代表分析、設計和實現三個關鍵階段&#xff0c;共同構成一個連貫的工程體系。一、OOA (Object-Oriented Analysis&#xff0c;面向對象分析) 目標&#xff1a;理解問題域&#x…

GBase 8a 與 Spring Boot + MyBatis 整合實戰:從環境搭建到CRUD操作

一、引言 在企業級數據管理場景中&#xff0c;GBase數據庫憑借其高性能的數據分析能力和對SQL標準的良好兼容性&#xff0c;成為金融、電信等行業的常用選擇。本文將詳細演示如何將GBase數據庫與Spring Boot、MyBatis框架整合&#xff0c;實現高效的數據持久化操作&#xff0c…

功能安全之BIST的基本原理

BIST&#xff08;Built-In Self-Test&#xff0c;內建自測試&#xff09;是一種將測試功能直接集成到集成電路&#xff08;IC&#xff09;或系統內部的設計方法。其基本原理的核心在于&#xff1a;讓被測試電路自身&#xff08;或借助少量專用硬件&#xff09;來生成測試激勵、…

Linux 程序地址空間

目錄 Ⅰ、什么是程序地址空間&#xff1f; Ⅱ、虛擬地址空間是什么樣的&#xff1f; 一、虛擬地址空間和頁表 1、什么是頁表&#xff1f; 2、什么是虛擬地址空間&#xff1f; 3、什么是vm_area_struct? Ⅲ、為什么要用虛擬地址空間&#xff1f; 一、進程的獨立性 二、…

【iOS】消息傳遞和消息轉發

文章目錄前言一、消息傳遞&#xff1a;objc_msgSend 的“查字典遞歸找家長”流程1. 第一步&#xff1a;查“最近調用記錄”&#xff08;方法緩存&#xff09;—— 最快即快速查找&#xff01;2. 第二步&#xff1a;翻“自己的字典”&#xff08;類方法列表查找&#xff09;——…

MySQL查詢優化與事務實戰指南

本節用到的員工信息管理表結構放到資源中&#xff0c;需要的同學自取。本節內容以此表為示例&#xff1a; 面試題&#xff1a;innodb與myisam的區別。 外鍵&#xff0c;事務 特性InnoDBMyISAM事務支持支持不支持外鍵支持不支持鎖粒度行級鎖表級鎖索引結構聚簇索引非聚簇索引崩…

Windows 10/11 磁盤清理操作指南:徹底解決系統盤空間不足問題

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#,Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發…

b-up:Enzo_Mi:深度學習基礎知識

1.最近鄰差值&#xff08;Neareast Neighbor Interpolation&#xff09; 插值算法 &#xff5c; 最近鄰插值法_嗶哩嗶哩_bilibili 上圖中最后一行&#xff0c;第一個圖像&#xff0c;因為目標像素&#xff08;放大后&#xff0c;位于第1行第0列的像素&#xff09;距離它最近的…

微信小程序商品結算功能

整體結算流程概述微信小程序的商品結算涉及前端交互、API調用和數據管理。典型流程包括&#xff1a;用戶交互&#xff1a;用戶選擇商品、填寫地址和時間。數據獲取&#xff1a;從小程序緩存或后端服務器獲取訂單信息。邏輯處理&#xff1a;驗證參數、應用紅包折扣。提交訂單&am…

2025年7月份最新一區算法——向光生長算法

注&#xff1a;該算法已按照智能優化算法APP標準格式進行整改&#xff0c;可直接集成到APP中&#xff0c;方便大家與自己的算法進行對比。&#xff08;近期智能優化算法APP將會迎來超級大更新&#xff01;請時刻保持關注哦&#xff01;&#xff09;向光生長算法&#xff08;Pho…

腳手架新建Vue2/Vue3項目時,項目文件內容的區別

一. package.json vue版本號不同vue2中會多一個依賴&#xff1a;vue-template-compiler&#xff0c;作用是預編譯Vue2模板為渲染函數&#xff0c;減少運行時開銷。vue-template-compiler與vue版本要保持一致&#xff0c;否則會報錯。eslintConfig中的extends不同 eslintConfig…

微信小程序入門實例_____從零開始 開發一個每天記賬的微信小程序

在前面的微信小程序實例中我們開發了體重記錄等實用小程序&#xff0c;今天來嘗試一個和生活消費緊密相關的 ——“每日記賬小程序”。它能幫你隨時記錄收支情況&#xff0c;讓每一筆花費都清晰可查。下面就跟著步驟&#xff0c;一步步構建這個小程序。?體驗一個開發者的快樂。…

2026python實戰——如何利用海外代理ip爬取海外數據

家人們&#xff01;隨著跨境電商的發展&#xff0c;是不是越來越多的小伙伴們也開始搞海外的數據分析了&#xff1f;不過雖然我們已經整天爬蟲、數據采集打交道了&#xff0c;但一到海外數據&#xff0c;還是有不少人掉進坑里。你們是不是也遇到過以下情況&#xff1a;花了一堆…