Cách Xây Dựng Máy Chủ MCP Với FastMCP (Với Một Công Cụ Thực Sự Dựa Trên Crawl)
TL;DR
FastMCP là cách nhanh nhất để chuyển đổi một hàm Python thành công cụ MCP. Một trang trí @mcp.tool duy nhất trên một hàm đã được gõ kiểu tạo ra schema JSON mà một client MCP cần, mà không cần xử lý giao thức thủ công.
Cài đặt chỉ với một lệnh: pip install fastmcp. Hướng dẫn này đã cài đặt và xác minh FastMCP 3.4.7 trực tiếp từ PyPI.
Một máy chủ tối thiểu cần ba dòng mã thực tế. Tạo một thể hiện FastMCP, trang trí một hàm với @mcp.tool, và gọi mcp.run().
Máy chủ FastMCP có thể được kiểm tra mà không cần một quy trình client riêng biệt. Lớp fastmcp.Client có thể kết nối trực tiếp với một đối tượng máy chủ trong cùng một quy trình Python, điều này đã được hướng dẫn này sử dụng để xác minh rằng mỗi ví dụ thực sự chạy.
Một công cụ chỉ cộng hai số không đủ lý do để xây dựng một máy chủ. Ví dụ đã làm việc trong hướng dẫn này nối một công cụ FastMCP với Nstproxy Crawl để một client MCP có thể chuyển giao một URL và nhận lại Markdown đã được làm sạch.
Gọi một API bên ngoài thực sự từ một công cụ có nghĩa là phải xử lý chế độ lỗi thực sự. Thiếu thông tin xác thực, phản hồi không phải 200, và lỗi mạng đều cần xử lý rõ ràng — hướng dẫn này cho thấy đầu ra lỗi thực tế được ghi lại khi một khóa API không được cấu hình.
FastMCP là một tập hợp con của SDK Python MCP chính thức, không phải là đối thủ cạnh tranh của nó. FastMCP 1.0 đã được hợp nhất vào SDK chính thức; gói fastmcp đang được phát triển tích cực trên PyPI là FastMCP 2.x, thêm vào lớp trải nghiệm nhà phát triển mà hướng dẫn này dựa vào.
Trải nghiem Nstproxy - Bat dau dung thu mien phi ngay
Giới thiệu: tại sao FastMCP là điểm vào thực tiễn vào các máy chủ MCP
FastMCP chuyển đổi một hàm Python đã được gõ kiểu thành một công cụ mà một tác nhân AI có thể gọi, mà không cần bạn phải viết tay xử lý tin nhắn JSON-RPC. Giao thức Ngữ cảnh Mô hình (MCP) xác định cách một ứng dụng AI — một "client MCP" như Claude Desktop, một trợ lý IDE, hoặc một tác nhân tùy chỉnh — phát hiện và gọi các công cụ, tài nguyên, và lời nhắc được một quy trình "máy chủ MCP" riêng biệt tiết lộ. Thực hiện giao thức đó bằng tay có nghĩa là viết về việc tạo schema, định tuyến tin nhắn và vận chuyển trước khi một công cụ thực sự làm bất cứ điều gì hữu ích.
FastMCP loại bỏ những thứ lặt vặt đó. Bạn viết một hàm Python bình thường, thêm gợi ý kiểu, trang trí nó với @mcp.tool, và FastMCP tạo ra schema cho công cụ, xử lý vòng lặp tin nhắn JSON-RPC, và tiết lộ nó qua bất kỳ phương tiện nào bạn chọn. Tài liệu chính thức Giao thức Ngữ cảnh Mô hình mô tả MCP như "một tiêu chuẩn mã nguồn mở để kết nối các ứng dụng AI với các hệ thống bên ngoài" — FastMCP là khung Python mà làm cho việc xây dựng phía máy chủ của kết nối đó trở nên nhanh chóng, và nguồn của nó được công bố trên kho lưu trữ GitHub FastMCP chính thức dưới giấy phép Apache-2.0.
Hướng dẫn này cài đặt FastMCP thực sự, chạy một máy chủ tối thiểu, và sau đó xây dựng một cái mà tác nhân thực sự cần: một công cụ MCP lấy một URL thông qua API Nstproxy Crawl và trả lại Markdown đã được làm sạch cho tác nhân gọi. Mỗi khối mã dưới đây đã được thực thi trong một môi trường Python thực tế; nơi một bước cần thông tin xác thực mà bài viết này không thể cung cấp, khoảng trống đó được tiết lộ thay vì chỉ che đậy bằng một phản hồi giả tạo.
Cung cấp cho Công cụ MCP một lớp Fetch-and-Clean thực sự
Khi công cụ MCP của bạn cần truy cập một trang web thực sự thay vì chỉ thực hiện phép toán địa phương, nó cần một lớp fetch-and-clean đáng tin cậy phía sau — Nstproxy Crawl là API mà ví dụ làm việc trong hướng dẫn này gọi để chuyển đổi một URL thành Markdown có thể đọc được bởi tác nhân.
trong một môi trường Linux cách ly và xác nhận cài đặt với pip show fastmcp, báo cáo:
Name: fastmcp
Version: 3.4.7
Summary: Cách nhanh chóng và Pythonic để xây dựng máy chủ và khách hàng MCP.
Phiên bản đó khớp với điều mà trang PyPI của FastMCP đã liệt kê là hiện tại tại thời điểm viết. requests được cài đặt cùng với FastMCP vì ví dụ làm việc sau này trong hướng dẫn này thực hiện một cuộc gọi HTTP ra ngoài tới Nstproxy Crawl API. Tình trạng: được chạy trực tiếp — đây là đầu ra thực tế từ môi trường cách ly đã được sử dụng để viết bài viết này, không phải là một phiên bản sao chép.
Cấu hình máy chủ FastMCP tối thiểu
Một máy chủ FastMCP bắt đầu từ một thể hiện đơn lẻ của FastMCP đặt tên cho máy chủ và giữ mọi công cụ bạn đăng ký trên đó. Tạo một tệp có tên hello_server.py:
from fastmcp import FastMCP
mcp = FastMCP("Máy chủ MCP Xin chào")@mcp.tooldefgreet(name:str)->str:"""Chào một người dùng bằng tên."""returnf"Xin chào, {name}!"if __name__ =="__main__": mcp.run()
Bộ trang trí @mcp.tool đọc các gợi ý kiểu của hàm (name: str vào, str ra) và chuỗi tài liệu của nó, sau đó xây dựng lược đồ JSON mà một khách hàng MCP sử dụng để biết cách gọi greet và mong đợi điều gì để phản hồi — bạn không bao giờ phải viết lược đồ đó bằng tay. mcp.run() không có đối số bắt đầu máy chủ qua giao thức stdio, giao thức mặc định mà các khách hàng MCP như Claude Desktop sử dụng để khởi động một máy chủ cục bộ như một quy trình con. Tình trạng: chỉ cấu hình cho hàng rào này một mình — nó sẽ được thực hiện thực sự trong phần tiếp theo.
Triển khai cơ bản: chạy và gọi máy chủ
Chạy python hello_server.py khởi động máy chủ và chặn, chờ một khách hàng MCP kết nối qua stdio — không có đầu ra nào hiển thị trong chế độ đó theo thiết kế, vì vậy bước xác minh hữu ích là gọi nó bằng một khách hàng thay vì nhìn chằm chằm vào một terminal bị chặn. Lớp Client của FastMCP có thể kết nối với một đối tượng máy chủ trực tiếp trong cùng một quy trình Python, đây là cách nhanh nhất để xác nhận rằng một công cụ thực sự hoạt động trước khi kết nối với một khách hàng MCP thực sự:
import asyncio
from fastmcp import Client
from hello_server import mcp
asyncdefmain():asyncwith Client(mcp)as client: tools =await client.list_tools()print("CÔNG CỤ:",[t.name for t in tools]) result =await client.call_tool("greet",{"name":"Nstproxy"})print("KẾT QUẢ:", result.data)if __name__ =="__main__": asyncio.run(main())
Chạy tập lệnh này đã sản xuất:
CÔNG CỤ: ['greet']
KẾT QUẢ: Xin chào, Nstproxy!
Tình trạng: được chạy trực tiếp — đây là stdout thực tế đã được ghi lại từ việc thực thi cả hai tệp cùng nhau, xác nhận rằng việc đăng ký công cụ, tạo lược đồ, và đường dẫn gọi đều hoạt động từ đầu đến cuối trước khi bất kỳ API bên ngoài nào vào bức tranh.
Để chạy cùng một máy chủ như một quy trình độc lập thay vì một khách hàng trong quy trình, bạn có thể gọi nó trực tiếp (python hello_server.py, giao thức stdio) hoặc khởi động nó qua HTTP để truy cập từ xa:
mcp.run(transport="http", port=8000)
Nền tảng FastMCP CLI cung cấp cùng một sự lựa chọn mà không cần chỉnh sửa tệp: fastmcp run hello_server.py:mcp cho stdio, hoặc fastmcp run hello_server.py:mcp --transport http --port 8000 cho HTTP. CLI nhập đối tượng máy chủ trực tiếp và không thực thi khối if __name__ == "__main__":, vì vậy bảo vệ đó là tùy chọn khi bạn chỉ bao giờ khởi động qua CLI. Tình trạng: mô tả — cú pháp vận chuyển được tài liệu hóa từ hướng dẫn nhanh chính thức của FastMCP, không được thực hiện riêng biệt từ đường dẫn stdio đã được xác minh ở trên.
Mô hình nâng cao: cung cấp cho máy chủ một công cụ đáng gọi
Một công cụ thêm hai số chứng minh rằng trình trang trí hoạt động, nhưng nó không đưa ra lý do cho một tác nhân để chạy máy chủ này thay vì chỉ thực hiện phép toán đơn giản. Kịch bản thực sự cần một máy chủ MCP là cung cấp cho một tác nhân một điều mà nó không thể làm một mình - truy cập một API bên ngoài, tải một trang, hoặc đọc một hệ thống tệp mà nó không có quyền truy cập. Ví dụ làm việc trong hướng dẫn này là một công cụ crawl_url gọi điểm cuối thu thập một trang của Nstproxy Crawl và trả lại nội dung của trang dưới dạng Markdown, để bất kỳ khách hàng MCP nào kết nối với máy chủ này có thể truyền một URL và nhận lại văn bản mà một LLM có thể đọc trực tiếp.
Điểm cuối thu thập một trang của Nstproxy Crawl nằm tại POST https://api.nstproxy.com/api/v1/crawl/scrape, được xác thực với một tiêu đề x-api-key. Khi được gọi với không có tham số bổ sung, điểm cuối đó trả lại ngay một ID tác vụ với status: "processing" cho việc truy vấn không đồng bộ; thêm tham số truy vấn async=true khiến điểm cuối này đợi và trả về kết quả trong một phản hồi thay vào đó, điều mà một cuộc gọi công cụ MCP đồng bộ cần. Thân yêu cầu nhận url, một mảng formats (markdown, html, rawData, screenshot, pdf), một timeout tùy chọn tính bằng mili giây, và onlyMainContent để tách bỏ điều hướng và văn bản không cần thiết. Phản hồi bao gồm một trường markdown với nội dung đã được làm sạch, hoặc một mã thông báo markdownRef thay vào đó khi kết quả quá lớn để nhúng vào - sẽ được giải quyết riêng biệt thông qua GET /api/v1/crawl/storage/read?st={ref}. Những chi tiết này được xác nhận trực tiếp với tài liệu của Nstproxy Crawl API thay vì được giả định từ tên điểm cuối.
import os
import requests
from fastmcp import FastMCP
mcp = FastMCP("Máy chủ Nstproxy Crawl MCP")NSTPROXY_API_KEY = os.environ.get("NSTPROXY_API_KEY","YOUR_API_KEY")CRAWL_ENDPOINT ="https://api.nstproxy.com/api/v1/crawl/scrape"@mcp.tooldefcrawl_url(url:str)->str:"""Lấy một URL thông qua Nstproxy Crawl và trả về Markdown đã làm sạch.
Cần thiết lập NSTPROXY_API_KEY. Gọi điểm cuối thu thập một trang của Nstproxy Crawl
với async=true để nhận một phản hồi ngay lập tức,
kiểu đồng bộ.
"""try: response = requests.post( CRAWL_ENDPOINT, params={"async":"true"}, headers={"x-api-key": NSTPROXY_API_KEY,"Content-Type":"application/json",}, json={"url": url,"formats":["markdown"],"onlyMainContent":True,"timeout":60000,}, timeout=65,)except requests.RequestException as exc:returnf"Yêu cầu thất bại trước khi nhận được phản hồi: {exc}"if response.status_code !=200:return(f"Nstproxy Crawl trả về HTTP {response.status_code}: "f"{response.text[:500]}") body = response.json()ifnot body.get("success",False):returnf"Yêu cầu thu thập không thành công: {body}"return body.get("data",{}).get("markdown","(không có trường markdown nào được trả về)")if __name__ =="__main__": mcp.run()
Bạn sẽ cần thiết lập chính mình mã API Nstproxy Crawl qua biến môi trường NSTPROXY_API_KEY trước khi crawl_url trả về nội dung trang thực tế - nếu không có, hàm vẫn hoạt động, vẫn được đăng ký như một công cụ với một sơ đồ đúng, và vẫn thực hiện một yêu cầu ngoài thực tế, nhưng yêu cầu đó không thể xác thực. Kết nối một Client FastMCP tới máy chủ này và liệt kê các công cụ của nó hoạt động chính xác như cách mà ví dụ hello-world đã làm:
TOOLS: ['crawl_url']
Gọi crawl_url đối với https://example.com trong hộp cát của bài viết này - nơi không có mã API Nstproxy được cấu hình và cũng có quyền truy cập mạng ra ngoài bị hạn chế - tạo ra lỗi thực tế này, thay vì một phản hồi thành công giả tạo:
KẾT QUẢ: Yêu cầu đã thất bại trước khi nhận được phản hồi: HTTPSConnectionPool(host='api.nstproxy.com', port=443): Số lần thử tối đa đã vượt quá với url: /api/v1/crawl/scrape?async=true (Gây ra bởi ProxyError('Không thể kết nối đến proxy', OSError('Kết nối hầm thất bại: 403 Forbidden')))
Trạng thái: thiếu điều kiện tiên quyết cho cuộc gọi Crawl ra ngoài cụ thể — việc đăng ký công cụ và tạo lược đồ cho crawl_url đã chạy trực tiếp, nhưng việc lấy trang thực tế không thể hoàn thành trong môi trường này vì không có khóa API thực để thử nghiệm, và bài viết này đã không tạo ra một phản hồi JSON để làm cho ví dụ trông hoàn thiện hơn so với thực tế. Trong một triển khai bình thường với NSTPROXY_API_KEY hợp lệ và quyền truy cập mạng mở, cùng một đường dẫn mã sẽ trả về trường markdown từ phản hồi Crawl Nstproxy thành công thay vì chuỗi lỗi này.
Giới hạn chân thật
FastMCP xử lý việc tạo lược đồ, vận chuyển, và vòng lặp yêu cầu/phản hồi, nhưng nó không xử lý những gì xảy ra bên trong chức năng công cụ của bạn — đó là Python thông thường, với các chế độ thất bại thông thường. crawl_url ở trên trả về một chuỗi đơn giản trên mọi đường dẫn, bao gồm cả các đường dẫn thất bại, vì kết quả công cụ MCP được thiết kế để có thể đọc được bởi mô hình gọi; việc ném ra một ngoại lệ không được xử lý sẽ hiện ra như một thất bại cuộc gọi công cụ chung cho khách hàng mà không có bất kỳ chi tiết chẩn đoán nào trong chuỗi. Một phiên bản sản xuất của công cụ này cũng nên giới hạn url cho các giao thức mong đợi, đặt thời gian chờ yêu cầu ngắn hơn sự kiên nhẫn của khách hàng, và quyết định rõ ràng liệu một 403/404 từ trang đích (cả hai đều có tính phí theo giá per-fetch của Crawl, vì việc lấy đã hoàn thành) nên được thử lại hay trả về cho người gọi như đã có.
FastMCP bản thân không quản lý giới hạn tần suất API, việc thử lại, hoặc xác thực cho bất kỳ dịch vụ bên ngoài nào mà công cụ của bạn gọi — tất cả những thứ này thuộc về mã của riêng công cụ bạn, chính xác như được hiển thị ở trên. Nó cũng không xác thực nội dung mà công cụ trả về ngoài việc khớp với gợi ý loại đã khai báo của bạn, vì vậy một công cụ hứa hẹn -> str và trả về Markdown không hợp lệ vẫn sẽ vượt qua các kiểm tra của FastMCP; xác thực chất lượng đầu ra là nhiệm vụ của tác giả công cụ.
Khắc phục sự cố
Một máy chủ chạy nhưng báo cáo không có công cụ thường có nghĩa là chức năng chưa bao giờ được trang trí, hoặc đã được trang trí trên một phiên bản FastMCP khác với phiên bản đã được chuyển tới mcp.run() — hãy kiểm tra rằng mỗi @mcp.tool nằm trực tiếp trên một chức năng và chỉ có một phiên bản FastMCP() tồn tại cho mỗi tệp. Một khách hàng có thể liệt kê các công cụ nhưng gặp lỗi ở mỗi cuộc gọi thường là do không khớp kiểu gợi ý: nếu lược đồ hứa hẹn một int và khách hàng gửi một chuỗi không thể ép kiểu, FastMCP sẽ từ chối cuộc gọi trước khi thân chức năng của bạn bao giờ chạy. Khi một công cụ gọi API bên ngoài không trả về gì có ích, hãy kiểm tra riêng biệt trạng thái phản hồi và nội dung, giống như crawl_url đã làm ở trên — một phản hồi Crawl Nstproxy có thể đến như một HTTP 200 thông thường trong khi trường success của nó là false, và mã chỉ kiểm tra mã trạng thái sẽ bỏ lỡ điều đó.
Kết luận
Toàn bộ giá trị của FastMCP là thu hẹp khoảng cách giữa một chức năng Python hoạt động và một công cụ mà một tác nhân AI có thể gọi — hướng dẫn này đã đi từ một thư mục trống đến một máy chủ với một cuộc gọi API bên ngoài thực sự trong hai tệp. Đường dẫn từ pip install fastmcp đến một công cụ đã đăng ký, được xác thực lược đồ mất vài phút; phần khó hơn, có giá trị hơn là những gì công cụ thực sự làm khi một tác nhân gọi nó, đó là lý do tại sao ví dụ đã làm ở đây tiếp cận một API bên ngoài thay vì dừng lại ở toán học.
Đối với một công cụ mà nhiệm vụ chính là biến một URL thành nội dung có thể đọc được bởi tác nhân, Nstproxy Crawl được xây dựng chính xác cho sự chuyển giao đó. Đây là một API thu thập thông tin web tập trung vào AI lấy một URL và trả về đầu ra sạch sẽ, có cấu trúc — Markdown, HTML sạch, liên kết, ảnh chụp màn hình, hoặc PDF — với việc xử lý JavaScript và truy cập được hỗ trợ bởi Nstproxy được thực hiện phía sau một cuộc gọi API duy nhất, thay vì yêu cầu bạn chạy một trình duyệt không giao diện và một nhóm proxy bên trong chức năng công cụ. Nó phù hợp một cách tự nhiên với một công cụ MCP như crawl_url ở trên vì cả hai đều giải quyết cùng một vấn đề: cung cấp cho một mô hình thứ gì đó mà nó có thể đọc mà không làm cho mã của tác nhân phải chịu trách nhiệm cho việc tự động hóa trình duyệt.
Đầu ra Markdown một lần gọi — một yêu cầu POST trả về nội dung trang đã được chuyển đổi sang Markdown, vì vậy chức năng công cụ MCP chỉ cần kiểm tra success và trả về trường markdown, không cần thực hiện việc chuyển đổi HTML sang văn bản của riêng nó.
Bao gồm việc xử lý JavaScript — các trang xây dựng nội dung của chúng ở phía khách hàng sẽ được render đầy đủ trước khi phản hồi được ghi lại, vì vậy một công cụ gọi Crawl không cần phụ thuộc vào trình duyệt không giao diện riêng bên cạnh FastMCP.
Quá trình thu thập thông tin cấp trang cho các công cụ đa trang — ngoài ví dụ crawl_url một trang ở đây, cùng một tài khoản có thể gọi POST /api/v1/crawl để thu thập nhiều trang dưới một công việc (với giới hạn maxDepth và maxPages rõ ràng), hữu ích cho một công cụ cần đưa cho một tác nhân toàn bộ phần của một trang web thay vì chỉ một URL.
Retries và lưu trữ kết quả lớn được xử lý ở phía máy chủ — các lượt truy cập không thành công sẽ được thử lại tự động, và các tải trọng Markdown/HTML/chụp màn hình quá lớn sẽ trở lại dưới dạng một mã tham chiếu được giải quyết thông qua một cuộc gọi đọc lưu trữ riêng biệt, vì vậy một chức năng công cụ không cần vòng lặp thử lại riêng hoặc xử lý kích thước blob.
Q: FastMCP có phải là cùng một thứ với SDK Python chính thức của MCP không?
Không — FastMCP 1.0 đã được sáp nhập vào SDK Python chính thức của MCP, nhưng gói fastmcp đang được duy trì tích cực trên PyPI là FastMCP 2.x, một framework superset được xây dựng trên nền tảng đó với các tính năng trải nghiệm phát triển bổ sung như Client trong quá trình sử dụng trong hướng dẫn này, các trợ giúp xác thực, và một CLI chuyên dụng. Cài đặt fastmcp từ PyPI sẽ cung cấp cho bạn dòng 2.x, không phải là mã đã được hấp thụ vào SDK cơ bản.
Q: Tôi có cần một khóa API trả phí để theo dõi hướng dẫn này không?
Chỉ cần cho nửa sau. Ví dụ hello_server.py hoàn toàn chạy miễn phí mà không cần tài khoản bên ngoài, và đầu ra TOOLS: ['greet'] / RESULT: Hello, Nstproxy! của hướng dẫn này đã được ghi lại mà không cần bất kỳ thông tin xác thực nào. Ví dụ crawl_url cần một khóa API Nstproxy Crawl để thực sự trả về nội dung trang — nếu không có, công cụ vẫn đăng ký và vẫn cố gắng thực hiện yêu cầu, nhưng cuộc gọi sẽ thất bại, đúng như đã được thể hiện trong đầu ra lỗi đã ghi lại của bài viết này.
Q: Tôi có thể sử dụng máy chủ FastMCP với Claude Desktop hoặc một khách hàng MCP khác không?
Có — bất kỳ khách hàng MCP nào hỗ trợ việc khởi động một máy chủ cục bộ qua stdio, bao gồm Claude Desktop, có thể chạy một máy chủ FastMCP theo cách tương tự như nó chạy bất kỳ máy chủ MCP nào khác, bằng cách chỉ định cấu hình của nó tới tệp Python và để cho khách hàng quản lý quy trình. Hướng dẫn này đã xác minh hành vi gọi công cụ với lớp Client của FastMCP thay vào đó, nhanh hơn để lặp lại trong khi viết và thử nghiệm các công cụ trước khi kết nối với một khách hàng máy tính để bàn đầy đủ.
Q: Điều gì xảy ra nếu chức năng công cụ của tôi phát sinh một ngoại lệ thay vì trả về một chuỗi?
Một ngoại lệ không được bắt trong một chức năng công cụ sẽ xuất hiện đối với khách hàng MCP gọi như một thất bại gọi công cụ chung, mà không có chi tiết chẩn đoán cụ thể mà một chuỗi lỗi bị bắt và trả về có thể mang lại. Ví dụ crawl_url trong hướng dẫn này cố tình bắt requests.RequestException và kiểm tra trạng thái phản hồi và trường success một cách rõ ràng, trả về một chuỗi mô tả trên mỗi con đường thay vì để một ngoại lệ propagating.
Q: FastMCP có xử lý hạn chế tốc độ hoặc thử lại cho các API bên ngoài mà công cụ của tôi gọi không?
Không — FastMCP quản lý lớp giao thức MCP (tạo lược đồ, định tuyến tin nhắn, vận chuyển), không phải là nội dung bên trong của những gì chức năng công cụ của bạn làm. Hạn chế tốc độ, logic thử lại, và xử lý thời gian chờ cho một API bên ngoài như Nstproxy Crawl phải thuộc về mã của chính công cụ của bạn, cũng giống như crawl_url ở trên thiết lập thời gian chờ yêu cầu của riêng nó và kiểm tra nội dung phản hồi thay vì giả định rằng FastMCP sẽ xử lý điều đó.
Q: Có hợp pháp để xây dựng một công cụ MCP thu thập dữ liệu các trang web không?
Việc thu thập các trang có sẵn công khai mà bạn được phép truy cập là quy trình tiêu chuẩn, nhưng bạn vẫn chịu trách nhiệm tuân thủ các điều khoản dịch vụ của trang web mục tiêu, tôn trọng robots.txt nơi nó áp dụng, và không sử dụng công cụ thu thập dữ liệu để lấy nội dung không công khai hoặc có kiểm soát truy cập. Nstproxy Crawl được xây dựng dựa trên việc thu thập dữ liệu web công cộng hợp pháp, được phép thay vì vượt qua xác thực hoặc các bức tường thanh toán, và trách nhiệm tương tự áp dụng cho bất kỳ điều gì mà chức năng công cụ của riêng bạn làm với dữ liệu mà nó thu thập.
So sánh BeautifulSoup và Scrapy cho việc thu thập dữ liệu web bằng Python: kiến trúc, hiệu suất, các tính năng, và một hướng dẫn quyết định được hỗ trợ bởi mã trực tiếp và các nguồn tài liệu xác minh.
Marcus Chen
Aug. 24th 2026
110M+ IP that voi ti le truy cap thanh cong 99.9%
Phan hoi trung binh ~0.5s cho tac vu dong thoi cao
Chi tu $0.1/GB
Truy cap ngay cac pool proxy residential, datacenter, IPv6 va ISP cao cap.