Ngiêm cấm sử đụng PROXY và VPS vào mục đích trái pháp luật bạn sẽ phải chịu toàn bộ trách nhiệm trước pháp luật khi sử dụng dịch vụ của chúng tôi tks!
World Bank API bằng Python: indicator, null và phân trang

World Bank API bằng Python: đọc indicator, null và phân trang

Chuyên viên Kỹ thuật ProxyVN 01-12-2026 Đang tính... phút đọc

World Bank API bằng Python là cách lấy chỉ tiêu phát triển như GDP bình quân đầu người, dân số hay chỉ số Gini theo từng quốc gia và từng năm mà không cần tải file Excel thủ công. API này công khai, không cần khóa, trả JSON gồm hai phần: metadata phân trang và danh sách quan sát. ProxyVN đã gọi thật API ngày 29/10/2026 để ghi lại mã trạng thái, số bản ghi, thời gian từng trang, cách API báo lỗi và chỗ giá trị null dễ bị đọc nhầm thành 0.

World Bank API bằng Python: mục tiêu dữ liệu, quyền và phạm vi truy cập

Trước khi viết dòng code nào, anh em nên chốt ba câu hỏi: lấy chỉ tiêu nào, cho quốc gia nào, trong khoảng năm nào. World Bank có hàng chục nguồn dữ liệu và hàng nghìn chỉ tiêu, nên một truy vấn không rõ mục tiêu sẽ trả về rất nhiều dòng mà anh em không dùng tới.

API này cung cấp dữ liệu gì

API chỉ tiêu của World Bank, thường gọi là Indicators API phiên bản 2, trả về chuỗi số liệu theo cặp quốc gia và năm. Mỗi chuỗi gắn với một mã chỉ tiêu, ví dụ NY.GDP.PCAP.CD là GDP bình quân đầu người tính bằng đô la Mỹ theo giá hiện hành. Mã SP.POP.TOTL là tổng dân số, còn SI.POV.GINI là chỉ số Gini.

Khi gọi danh sách nguồn ngày 29/10/2026, API báo có 71 nguồn dữ liệu. Nguồn dùng nhiều nhất là World Development Indicators, mã nguồn 2. Toàn bộ năm chỉ tiêu dùng trong lab của bài này đều thuộc nguồn đó.

Dữ liệu ở đây là số liệu tổng hợp ở cấp quốc gia hoặc nhóm quốc gia. API không có dữ liệu cá nhân, không có dữ liệu thời gian thực. Phần lớn chỉ tiêu cập nhật theo năm, có chỉ tiêu cách vài năm mới có một điểm đo.

Quyền truy cập và khóa API

API này không yêu cầu đăng ký hay khóa. Trang Developer Information của World Bank mô tả các truy vấn cơ bản mà không nhắc tới token. Lab gửi request thẳng từ Python, không kèm header xác thực nào, và mọi truy vấn hợp lệ đều trả 200.

Không cần khóa không có nghĩa là không có giới hạn. Tài liệu không công bố con số giới hạn request cụ thể cho API công khai này. Vì vậy cách an toàn là gửi tuần tự, dùng lại kết nối và lưu kết quả để không gọi lại cùng một truy vấn nhiều lần.

Dữ liệu World Bank có điều khoản sử dụng riêng. Khi đưa số liệu vào báo cáo hay sản phẩm, anh em nên ghi nguồn rõ ràng, ghi mã chỉ tiêu và ngày cập nhật lấy từ metadata.

Ranh giới với scraping trang web

Trang data.worldbank.org có biểu đồ và nút tải file, nhưng cào HTML của trang đó là cách làm tốn công và dễ gãy. API trả đúng dữ liệu nằm sau biểu đồ, có cấu trúc ổn định, nên không có lý do để scrape giao diện.

Bài web scraping proxy là gì nói về việc thu thập từ trang web không có API. Với World Bank, phần lớn nhu cầu nằm gọn trong API, và việc chính là đọc đúng dữ liệu chứ không phải vượt qua lớp chặn nào.

Proxy không đổi quốc gia của chỉ tiêu

Một hiểu nhầm hay gặp là dùng proxy ở nước khác sẽ nhận số liệu khác. Quốc gia của chỉ tiêu nằm trong đường dẫn truy vấn, ví dụ country/VNM, chứ không phụ thuộc IP người gọi. Gọi từ Hà Nội hay qua một proxy ở châu Âu, số dân Việt Nam năm 2024 vẫn là 100.987.686 người.

Lab kiểm điều này bằng cách so thân phản hồi khi gọi trực tiếp và khi gọi qua proxy cục bộ. Hai thân phản hồi giống nhau từng byte. Proxy chỉ đổi đường đi của gói tin, không đổi nội dung API trả về.

Đầu ra của bài này

Bài hướng tới ba đầu ra cụ thể. Thứ nhất là tập chỉ tiêu mẫu gồm năm mã với tên, nguồn và tổ chức cung cấp. Thứ hai là bảng tách rõ năm có số, năm null và năm bằng 0. Thứ ba là file CSV giữ năm quan sát, cờ null và các trường gốc để đối soát.

Phạm vi lab là ba quốc gia Đông Nam Á, khoảng năm 2015 tới 2024. Con số trong bài là kết quả API trả về ngày 29/10/2026, với metadata lastupdated là 2026-10-08. Khi World Bank cập nhật, giá trị có thể thay đổi.

World Bank API bằng Python: đọc indicator theo quốc gia/năm, phân biệt null với 0 và metadata phân trang

Null khác 0

Null khác 0

Phần này giải thích cấu trúc một phản hồi JSON và những chỗ dễ đọc sai. Đây là phần quyết định dữ liệu cuối cùng có dùng được hay không.

Cấu trúc phản hồi hai phần tử

Khi thêm format=json, API trả một mảng hai phần tử. Phần tử đầu là metadata, phần tử sau là danh sách quan sát. Request đầu tiên trong lab lấy GDP bình quân đầu người của Indonesia, Thái Lan và Việt Nam từ 2015 tới 2024, mỗi trang 10 dòng.

import requests
B = "https://api.worldbank.org/v2"
r = requests.get(f"{B}/country/VNM;THA;IDN/indicator/NY.GDP.PCAP.CD",
                 params={"format": "json", "date": "2015:2024", "per_page": 10}, timeout=30)
meta, rows = r.json()
print(r.status_code, meta)

Kết quả: mã 200, metadata gồm page 1, pages 3, per_page 10, total 30, sourceid 2 và lastupdated 2026-10-08. Danh sách có 10 dòng. Content-Type là application/json kèm charset utf-8.

Đọc từng trường của một quan sát

Mỗi quan sát có các trường indicator, country, countryiso3code, date, value, unit, obs_status và decimal. Dòng đầu tiên lab nhận được là Indonesia năm 2024, value khoảng 4925,44 đô la. Trường date là chuỗi "2024", không phải số nguyên.

Trường country có mã hai ký tự, còn countryiso3code có mã ba ký tự. Khi ghép với dữ liệu khác, anh em nên chọn một loại mã và giữ thống nhất. Lab chọn mã ba ký tự vì nó cũng là mã dùng trong đường dẫn truy vấn.

Trường unit trong cả năm chỉ tiêu lab thử đều là chuỗi rỗng. Đơn vị thật nằm trong tên chỉ tiêu, ví dụ "GDP per capita (current US$)". Nếu chỉ đọc trường unit, anh em sẽ tưởng số liệu không có đơn vị.

Null không phải là 0

Chỉ số Gini của Việt Nam là ví dụ rõ nhất. Lab hỏi giai đoạn 2010 tới 2024, nhận 15 dòng. Tám năm có value là null: 2011, 2013, 2015, 2017, 2019, 2021, 2023 và 2024. Không năm nào có value bằng 0.

Null ở đây nghĩa là năm đó không có khảo sát hộ gia đình nên không có điểm đo. Nếu pandas đọc rồi điền 0, biểu đồ sẽ cho thấy bất bình đẳng rơi về 0 cứ hai năm một lần. Đây là lỗi đọc dữ liệu, không phải sự thật kinh tế.

Năm thiếu số liệu phải giữ là ô trống kèm cờ null, không được điền 0 hay nội suy khi chưa ghi chú.

Số không thật sự tồn tại

Trong ba chỉ tiêu lab quét null, không chỉ tiêu nào có giá trị bằng 0. Nhưng một số chỉ tiêu có thể nhận 0 hợp lệ, ví dụ số ca của một sự kiện hiếm trong một năm. Vì vậy code cần phân biệt value is None với value == 0, không dùng phép kiểm tra kiểu if not value.

Trong Python, if not value coi 0 và None là như nhau. Đó là cách nhanh nhất để biến số 0 thật thành ô trống hoặc biến ô trống thành 0. Lab dùng hai cột riêng: value giữ số hoặc rỗng, is_null giữ True hoặc False.

Tham số mrv và mrnev

Trang Indicator API Queries mô tả tham số mrv để lấy các giá trị gần nhất và mrnev để lấy các giá trị gần nhất không rỗng. Lab gọi chỉ số Gini của Việt Nam với mrv=3, nhận về các năm 2022, 2020 và 2018 với giá trị 36,1, 36,8 và 35,7.

Gọi với mrnev=3 cho đúng ba cặp đó. Với một quốc gia, hai tham số cho cùng kết quả trong lần thử này. Thêm gapfill=Y cũng không đổi kết quả. Anh em không nên dựa vào khác biệt giữa hai tham số khi chưa tự thử với truy vấn nhiều quốc gia.

Metadata phân trang

Metadata cho bốn con số: page là trang hiện tại, pages là tổng số trang, per_page là số dòng mỗi trang, total là tổng số dòng. Với ba quốc gia và mười năm, total là 30, chia 10 dòng mỗi trang thành 3 trang.

Điều kiện dừng vòng lặp nên dựa vào pages chứ không dựa vào danh sách rỗng. Khi lấy hết, page bằng pages là dừng. Cách này rõ hơn và không tốn một request thừa.

Metadata còn có lastupdated. Lab ghi giá trị này vào file kết quả để biết số liệu thuộc đợt cập nhật nào. Hai lần chạy cách nhau vài tuần có thể cho số khác nhau, và lastupdated là cách giải thích khác biệt đó.

Nhóm quốc gia lẫn trong danh sách

Gọi country/all cho dân số năm 2024 trả total 266 dòng. Ba dòng đầu không phải quốc gia mà là Africa Eastern and Southern, Africa Western and Central và Arab World. Đây là các nhóm tổng hợp.

Danh mục quốc gia của API có 296 mục, trong đó 79 mục có region là Aggregates và 217 mục là nền kinh tế riêng lẻ. Nếu cộng dân số của mọi dòng trong country/all, anh em sẽ tính trùng nhiều lần. Cách đúng là lấy danh mục quốc gia, lọc bỏ Aggregates, rồi mới ghép.

Chuẩn bị truy vấn, ID và phiên bản khi gọi World Bank API bằng Python

Một truy vấn tốt bắt đầu từ việc chọn đúng mã. Phần này đi qua mã chỉ tiêu, mã quốc gia, khoảng năm và phiên bản API.

Tìm mã chỉ tiêu

Mỗi chỉ tiêu có một mã dạng chữ và dấu chấm. Gọi /v2/indicator/{mã}?format=json trả về tên, nguồn, tổ chức cung cấp và ghi chú. Lab gọi năm mã và dựng bảng tham chiếu dưới đây.

Bảng: Tìm mã chỉ tiêu

Mã chỉ tiêu

Tên theo API

Trường unit

Tổ chức cung cấp (rút gọn)

NY.GDP.PCAP.CD

GDP per capita (current US$)

rỗng

Thống kê chính thức quốc gia

SP.POP.TOTL

Population, total

rỗng

World Population Prospects, UN

SI.POV.GINI

Gini index

rỗng

World Bank, Poverty and Inequality Platform

SL.UEM.TOTL.ZS

Unemployment, total (% of total labor force)

rỗng

ILO Modelled Estimates

IT.NET.USER.ZS

Individuals using the Internet (% of population)

rỗng

ITU ICT Indicators Database

Cả năm chỉ tiêu đều thuộc nguồn World Development Indicators. Trường unit rỗng ở cả năm dòng, nên đơn vị phải lấy từ tên chỉ tiêu. Cột tổ chức cung cấp cho biết số liệu gốc đến từ đâu, ví dụ tỷ lệ thất nghiệp là ước tính mô hình của ILO chứ không phải số khảo sát trực tiếp.

Mã quốc gia và cách ghép nhiều nước

Đường dẫn nhận mã quốc gia hai hoặc ba ký tự. Muốn lấy nhiều nước trong một request, nối các mã bằng dấu chấm phẩy, ví dụ VNM;THA;IDN. Lab dùng cách này cho GDP bình quân đầu người.

Ghép nhiều nước giúp giảm số request, nhưng làm danh sách dài hơn và cần phân trang. Với vài chục nước, một request với per_page lớn thường gọn hơn nhiều request nhỏ.

Danh mục quốc gia còn có thông tin vùng, nhóm thu nhập và loại hình vay. Bản ghi của Việt Nam lúc lab chạy ghi vùng East Asia & Pacific và thủ đô Hanoi. Những trường này hữu ích khi cần lọc theo vùng.

Khoảng năm và định dạng

Tham số date nhận một năm, ví dụ 2023, hoặc khoảng năm dạng 2015:2024. Một số chỉ tiêu có dữ liệu theo quý hoặc tháng với cú pháp riêng, nhưng năm chỉ tiêu trong bài đều theo năm.

Tham số format quyết định định dạng. Lab thử gọi dân số Việt Nam năm 2023 mà không có format: API trả 200 với Content-Type text/xml. Nếu code gọi r.json() trên phản hồi đó, chương trình sẽ báo lỗi giải mã. Luôn thêm format=json khi làm việc bằng Python.

Phiên bản API

Theo trang API Basic Call Structures, đường dẫn hiện hành bắt đầu bằng /v2. Toàn bộ lab dùng https://api.worldbank.org/v2. Khi copy ví dụ cũ trên mạng, anh em nên kiểm tra tiền tố phiên bản, vì ví dụ cũ có thể dùng đường dẫn không còn được khuyến nghị.

Ghi phiên bản API, phiên bản Python và phiên bản thư viện vào đầu file kết quả. Lab chạy trên Python 3.12.10 và requests 2.34.2. Khi kết quả khác đi sau này, những dòng ghi này giúp biết thứ gì đã đổi.

Không cần token, nhưng cần User-Agent rõ ràng

Vì không có khóa, mọi request từ một IP trông giống nhau với máy chủ. Đặt User-Agent có tên dự án và cách liên hệ là thói quen tốt với API công khai. Nếu có sự cố, bên vận hành biết ai đang gọi.

Lab dùng User-Agent mặc định của requests để đo đúng hành vi cơ bản. Trong mã chạy định kỳ, anh em nên thay bằng chuỗi riêng.

Chọn per_page hợp lý

Lab thử per_page bằng 1000 cho truy vấn ba nước mười năm: API trả 30 dòng trong một trang. Thử per_page 5000 cho dân số Việt Nam từ 1960 tới 2024: metadata ghi total 65, một trang.

Chọn per_page đủ lớn để một truy vấn nhỏ chỉ cần một trang sẽ giảm số request. Với truy vấn lớn, như mọi quốc gia trong mọi năm, vẫn nên phân trang để mỗi phản hồi không quá nặng.

Thu dữ liệu World Bank API bằng Python có phân trang theo đúng nguồn

Phần này đưa vòng lặp phân trang đã chạy thật, số đo thời gian và cách xử lý khi API trả lỗi.

Vòng lặp phân trang

Phân trang 3 trang

Phân trang 3 trang

Lab lấy lại truy vấn GDP ba nước với per_page 10, đi qua từng trang tới khi page bằng pages.

S = requests.Session(); allrows = []; page = 1
while True:
    r = S.get(f"{B}/country/VNM;THA;IDN/indicator/NY.GDP.PCAP.CD",
              params={"format": "json", "date": "2015:2024", "per_page": 10, "page": page}, timeout=30)
    meta, data = r.json(); allrows += data
    if page >= meta["pages"]: break
    page += 1

Kết quả: 3 trang, 30 dòng, khớp total trong metadata. Thời gian ba trang lần lượt là 1,399 giây, 1,789 giây và 0,995 giây. Request đầu tiên của phiên mất 2,26 giây vì phải mở kết nối TLS mới.

Thời gian phản hồi thay đổi đáng kể

Lab đo thêm sáu request riêng lẻ cùng một truy vấn dân số, mỗi request mở kết nối mới. Ba lần gọi trực tiếp mất 2,042 giây, 0,455 giây và 0,475 giây. Lần đầu chậm nhất, các lần sau nhanh hơn nhiều.

Nghĩa là thời gian một request World Bank không cố định. Khi đặt timeout, đừng đặt quá sát, ví dụ 2 giây, vì một lần chậm bình thường cũng có thể vượt ngưỡng. Lab dùng timeout 30 giây và không gặp lần nào hết thời gian chờ.

Lỗi trả về với mã 200

Đây là chỗ dễ sai nhất. Lab gọi một mã chỉ tiêu không tồn tại là KHONG.CO.THAT. API trả mã 200, nhưng thân phản hồi chỉ có một phần tử chứa message với id 120, key "Invalid value" và nội dung báo tham số không hợp lệ.

Gọi với mã quốc gia XXX cho đúng kết quả đó: mã 200 và cùng thông báo id 120. Nếu code chỉ kiểm tra r.status_code == 200 rồi tách meta, rows = r.json(), chương trình sẽ báo lỗi vì mảng chỉ có một phần tử.

j = r.json()
if len(j) == 1 and "message" in j[0]:
    raise ValueError(j[0]["message"])
meta, rows = j

Với World Bank API, mã 200 chưa đủ để coi là thành công; phải kiểm tra cấu trúc thân phản hồi.

Danh sách rỗng không phải lỗi

Một truy vấn hợp lệ nhưng không có dữ liệu trong khoảng năm có thể trả metadata với total 0 và phần tử thứ hai là null. Code nên xử lý ca này như kết quả rỗng hợp lệ, ghi lại và đi tiếp, thay vì dừng cả lô.

Lab bọc bước đọc chỉ tiêu bằng một kiểm tra: nếu phần tử thứ hai là None thì ghi phản hồi gốc vào log. Trong lần chạy này, ba chỉ tiêu lab quét đều có dữ liệu nên nhánh đó không được kích hoạt.

Retry cho lỗi mạng, không retry cho lỗi tham số

Lỗi id 120 là lỗi tham số. Gửi lại bao nhiêu lần cũng nhận cùng kết quả, nên retry chỉ tốn request. Retry chỉ có ý nghĩa với lỗi mạng, hết thời gian chờ hoặc mã 5xx.

Một cách gọn là dùng HTTPAdapter của requests với Retry từ urllib3, giới hạn ba lần thử và tăng dần thời gian chờ. Bài rate limit API khi dùng proxy giải thích vì sao retry dồn dập làm tình hình xấu hơn.

Gọi tuần tự và dùng lại Session

Với vài chục truy vấn, gọi tuần tự bằng một Session là đủ nhanh. Session giữ kết nối, nên request thứ hai trở đi không phải bắt tay TLS lại. Trong lab, request dùng lại kết nối trong cùng phiên chỉ mất 0,09 giây.

Chạy song song hàng chục luồng tới một API công khai không có hạn mức công bố là cách dễ bị chặn. Nếu cần nhanh hơn, hãy giảm số request bằng cách ghép quốc gia và tăng per_page trước khi nghĩ tới chạy song song.

Đối soát ID, kiểu dữ liệu, giá trị thiếu và xuất xứ khi dùng World Bank API bằng Python

Thu được dữ liệu mới là nửa đầu. Nửa sau là kiểm tra dữ liệu có đúng như mình nghĩ không trước khi đưa vào báo cáo.

Kiểm tra tổng số dòng

So số dòng thu được với total trong metadata. Lab thu 30 dòng, metadata ghi 30. Nếu hai con số lệch, có thể vòng lặp phân trang bỏ sót trang hoặc một trang bị lỗi giữa chừng.

Với truy vấn nhiều quốc gia và nhiều năm, số dòng kỳ vọng bằng số quốc gia nhân số năm. Ba nước nhân mười năm là 30. Phép nhân đơn giản này bắt được rất nhiều lỗi tham số.

Kiểu dữ liệu từng cột

Trường date là chuỗi, value là số thực hoặc null, decimal là số nguyên. Khi đưa vào pandas, nên ép date sang số nguyên và giữ value dạng số thực có cho phép giá trị thiếu.

Không làm tròn value khi lưu. Trường decimal gợi ý số chữ số thập phân để hiển thị, nhưng file gốc nên giữ đủ độ chính xác API trả về. Làm tròn chỉ diễn ra ở bước trình bày.

Kiểm tra trùng khóa

Khóa tự nhiên của một quan sát là bộ ba mã quốc gia, mã chỉ tiêu và năm. Mỗi bộ ba chỉ được xuất hiện một lần. Lab kiểm tra trên 30 dòng và không thấy trùng.

Trùng khóa thường xuất hiện khi chạy lại một phần lô rồi nối thêm vào file cũ. Kiểm tra trùng trước khi ghi giúp tránh số liệu bị cộng đôi trong báo cáo.

Giữ xuất xứ cho từng dòng

Mỗi dòng trong file kết quả nên mang đủ thông tin để truy ngược: mã chỉ tiêu, mã quốc gia, năm, ngày cập nhật của nguồn và ngày lab chạy. Khi người đọc hỏi con số này từ đâu, file tự trả lời được.

Lab ghi thêm obs_status. Trong năm chỉ tiêu đã thử, trường này đều rỗng. Một số nguồn khác của World Bank dùng trường này để đánh dấu ước tính hoặc số tạm tính, nên vẫn nên giữ cột này.

File CSV giữ năm quan sát

CSV giữ năm quan sát

CSV giữ năm quan sát

Lab xuất 30 dòng GDP bình quân đầu người ra file CSV với các cột country_iso3, indicator, year, value, is_null, unit, obs_status và decimal.

w.writerow(["country_iso3", "indicator", "year", "value", "is_null", "unit", "obs_status", "decimal"])
for x in allrows:
    w.writerow([x["countryiso3code"], x["indicator"]["id"], x["date"],
                "" if x["value"] is None else x["value"], x["value"] is None,
                x["unit"], x["obs_status"], x["decimal"]])

Ô value để trống khi null, và cột is_null ghi rõ True. Người mở file bằng Excel thấy ô trống chứ không thấy số 0. Bài JSON và CSV khi crawl dữ liệu bàn thêm khi nào nên giữ JSON gốc bên cạnh CSV.

Đối chiếu với nguồn khác

Khi số liệu World Bank khác số của cơ quan thống kê quốc gia, đó không nhất thiết là lỗi. World Bank có thể dùng ước tính, phương pháp quy đổi hoặc đợt cập nhật khác. Cột tổ chức cung cấp trong metadata chỉ tiêu cho biết số liệu gốc đến từ đâu.

Bài này không so sánh số liệu kinh tế giữa các nước. Mục tiêu là đọc đúng dữ liệu API trả về, giữ nguyên ý nghĩa của ô trống, rồi để người phân tích quyết định cách dùng.

Lưu kết quả, giới hạn request và khi nào World Bank API bằng Python thực sự cần proxy

Phần cuối nói về lưu trữ, nhịp gọi và câu hỏi proxy có cần thiết không. Với API này, câu trả lời phần lớn là không, trừ vài trường hợp mạng cụ thể.

Lưu cả phản hồi gốc

Ngoài CSV, lab lưu toàn bộ kết quả dạng JSON, gồm metadata của từng truy vấn. Khi cần kiểm tra lại, anh em mở JSON gốc chứ không phải gọi lại API. Cách này cũng giúp so sánh hai đợt cập nhật.

Đặt tên file có ngày chạy và lastupdated của nguồn. Ví dụ gdp_pc_2026-10-29_src-2026-10-08.csv cho biết ngay file thuộc đợt nào.

Bộ nhớ đệm cho truy vấn lặp lại

Dữ liệu World Bank cập nhật theo đợt, thường cách nhau nhiều tuần. Gọi cùng một truy vấn mỗi giờ là thừa. Một bộ nhớ đệm đơn giản theo URL, hết hạn sau một ngày, giảm phần lớn request mà không làm dữ liệu cũ đi.

Khi lastupdated trong metadata đổi, đó là lúc xóa bộ nhớ đệm và gọi lại. Lab không dựng bộ nhớ đệm, đây là đề xuất dựa trên tần suất cập nhật quan sát được.

Khi nào proxy thực sự cần

Proxy có ích khi mạng của anh em không ra được Internet trực tiếp. Ví dụ máy chủ nội bộ công ty chỉ cho ra ngoài qua proxy, hoặc máy chạy pipeline dữ liệu nằm trong mạng bị giới hạn đầu ra và chỉ cho phép một IP cố định.

Proxy không giúp lấy thêm dữ liệu, không mở khóa chỉ tiêu nào và không làm số liệu khác đi. Nó cũng không phải cách để gửi nhiều request hơn khi API đã từ chối. Nếu bị chặn vì gửi quá nhanh, cách sửa là gửi chậm lại.

Thử qua proxy lab

Lab dựng một proxy HTTP cục bộ có xác thực Basic ở cổng 9702, rồi gọi dân số Việt Nam 2020 tới 2024 qua proxy đó. Kết quả là mã 200 và năm giá trị dân số, đúng như khi gọi trực tiếp. Log proxy ghi lệnh CONNECT tới api.worldbank.org:443 với xác thực hợp lệ.

px = {"https": "http://user1:p%40ss%232026@127.0.0.1:9702"}
r = requests.get(f"{B}/country/VNM/indicator/SP.POP.TOTL",
                 params={"format": "json", "date": "2020:2024"}, proxies=px, timeout=30)

Ba lần gọi qua proxy, mỗi lần mở kết nối mới, mất 0,564 giây, 0,546 giây và 0,596 giây. Thân phản hồi qua proxy giống thân phản hồi gọi trực tiếp. Mật khẩu có ký tự @ và # phải mã hóa thành %40 và %23 trong URL proxy.

Lỗi khi sai mật khẩu proxy

Lab thử gọi với mật khẩu sai. requests báo ProxyError với chi tiết Tunnel connection failed: 407 Proxy Authentication Required. Request không tới được World Bank, vì proxy chặn ngay ở bước CONNECT.

Lỗi 407 này đến từ proxy chứ không phải từ API. Khi gặp, kiểm tra tên đăng nhập, mật khẩu và cách mã hóa ký tự đặc biệt. Bài định dạng proxy hướng dẫn chuyển từ dạng ip:port:user:pass sang URL.

Chọn loại proxy khi cần

Nếu chỉ cần một đường ra Internet ổn định cho pipeline dữ liệu, proxy datacenter hoặc proxy dân cư tĩnh với IP cố định là đủ. Không cần proxy xoay cho API công khai này, vì xoay IP không mang lại dữ liệu khác. Bài cài đặt Python proxy từ thư viện requests hướng dẫn cách khai báo proxy cho requests.

Khi mạng nội bộ yêu cầu đi qua một IP cố định, ProxyVN có proxy dân cư tĩnh, proxy datacenter, proxy 4G và proxy xoay, hỗ trợ HTTP và SOCKS5. Anh em có thể mua proxy giá rẻ tại ProxyVN rồi khai báo vào biến proxies của requests như đoạn mã ở trên.

Giới hạn suy luận của bài

Lab gọi API thật ngày 29/10/2026, từ một máy Windows 10 ở Việt Nam, với Python 3.12.10 và requests 2.34.2. Thời gian phản hồi đo được phụ thuộc mạng lúc đó và không đại diện cho mọi thời điểm.

Lab không thử truy vấn rất lớn, không thử gửi song song và không chạm tới giới hạn request nào, nên bài không đưa con số giới hạn. Proxy trong lab là proxy cục bộ, không phải proxy thương mại. Kết quả mrv và mrnev chỉ đúng cho truy vấn một quốc gia đã thử.

Checklist World Bank API bằng Python

Checklist World Bank API

Checklist World Bank API

  • Luôn thêm format=json, nếu không API trả XML.
  • Kiểm tra cấu trúc thân phản hồi, vì lỗi tham số vẫn trả mã 200.
  • Dừng phân trang khi page bằng pages, rồi so số dòng với total.
  • Giữ null là ô trống kèm cột is_null, không điền 0.
  • Lấy đơn vị từ tên chỉ tiêu, vì trường unit thường rỗng.
  • Lọc bỏ 79 mục Aggregates khi cần số liệu theo quốc gia.
  • Ghi lastupdated và ngày chạy vào tên file kết quả.
  • Chỉ dùng proxy khi mạng thật sự cần một đường ra.

Câu hỏi thường gặp về World Bank API bằng Python

Có cần đăng ký tài khoản để dùng API không?

Không. Lab gọi mọi truy vấn mà không có khóa hay header xác thực, và các truy vấn hợp lệ đều trả mã 200.

Vì sao r.json() báo lỗi dù mã trạng thái là 200?

Có hai khả năng hay gặp. Thứ nhất là thiếu format=json nên API trả XML. Thứ hai là tham số sai, API trả mảng một phần tử chứa thông báo lỗi id 120, và code tách hai phần tử bị lỗi.

Làm sao lấy dữ liệu tất cả quốc gia mà không lẫn nhóm vùng?

Lấy danh mục /v2/country, lọc các mục có region khác Aggregates, rồi chỉ giữ dữ liệu của những mã đó. Lần thử ngày 29/10/2026 cho 217 nền kinh tế và 79 nhóm tổng hợp.

Có thư viện Python riêng cho World Bank không?

Có một số thư viện cộng đồng bọc API này. Bài dùng requests trực tiếp để thấy rõ từng trường và từng mã lỗi. Khi dùng thư viện bọc, vẫn nên kiểm tra cách nó xử lý null.

Dùng proxy nước ngoài có lấy được số liệu khác không?

Không. Quốc gia nằm trong đường dẫn truy vấn. Lab so thân phản hồi qua proxy và gọi trực tiếp, hai thân giống nhau.

Bao lâu nên gọi lại một lần?

Theo dõi trường lastupdated trong metadata. Khi giá trị này chưa đổi, gọi lại không mang thêm dữ liệu mới. Bài OpenAlex API bằng Python áp dụng cách nghĩ tương tự cho một API công khai khác.

World Bank API bằng Python và những điều cần nhớ

World Bank API bằng Python dễ bắt đầu vì không cần khóa, nhưng dễ đọc sai ở ba chỗ: lỗi tham số vẫn trả mã 200, null bị biến thành 0, và nhóm vùng lẫn vào danh sách quốc gia. Lab ngày 29/10/2026 thu 30 dòng qua 3 trang, thấy 8 năm null trong chỉ số Gini của Việt Nam và xác nhận proxy không đổi nội dung phản hồi. Giữ file CSV có cột is_null và ngày cập nhật để dữ liệu luôn đối soát được. Cần đường ra mạng ổn định cho World Bank API bằng Python, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam.

TIN TỨC LIÊN QUAN