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!
Socrata API bằng Python: SoQL, phân trang và đối soát hàng

Socrata API bằng Python: SoQL, phân trang và đối soát hàng

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

Socrata API bằng Python là cách truy vấn thẳng từng hàng của một dataset công khai trên cổng dữ liệu chạy Socrata, bằng ngôn ngữ SoQL gần giống SQL, rồi lấy về đủ hàng không lặp không thiếu. Khác với bảng kê catalog, đầu ra ở đây là bảng dữ liệu đã lọc. ProxyVN chạy thử ngày 29/10/2026: ba cổng Socrata của New York, Chicago và San Francisco đều trả 403 cho mạng lab. Vì vậy phần phân trang được kiểm trên máy chủ giả lập cục bộ, và bài ghi rõ phần nào chưa chạy với dữ liệu thật.

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

Phần đầu chốt mình lấy dữ liệu gì, ai được đọc, và vì sao Socrata cần cách làm khác với các cổng dữ liệu chỉ quản lý tệp.

Socrata trong bức tranh dữ liệu mở

Socrata là nền tảng cổng dữ liệu được nhiều thành phố, bang và cơ quan công dùng. Điểm khác biệt lớn nhất là mỗi dataset dạng bảng đều có một endpoint truy vấn riêng. Anh em không cần tải cả tệp về rồi lọc, mà gửi truy vấn để máy chủ lọc giúp.

Cách này rất tiện khi dataset có hàng triệu dòng mà mình chỉ cần vài nghìn dòng của một tuần. Nhưng nó cũng đặt ra yêu cầu mới: truy vấn phải tái lập được, và phân trang phải ổn định.

Đầu ra mà bài này hướng tới

Ví dụ xuyên suốt là dataset Motor Vehicle Collisions của New York, mã h9gi-nx95. Đầu ra là tệp CSV các vụ va chạm trong tuần đầu tháng 9 năm 2026, gồm mã vụ, ngày, giờ, quận, mã bưu chính, tọa độ, số người bị thương, số người tử vong và nguyên nhân chính.

Kèm theo tệp là một bản ghi đối soát. Bản ghi cho biết máy chủ báo có bao nhiêu hàng khớp điều kiện, script lấy được bao nhiêu, bao nhiêu mã khác nhau, có trùng hay thiếu không.

Mã dataset bốn cộng bốn

Mỗi dataset Socrata có mã dạng bốn ký tự, gạch ngang, bốn ký tự, ví dụ h9gi-nx95. Mã này xuất hiện trong URL trang dataset và trong endpoint truy vấn. Tên dataset có thể đổi, mã thì không.

Lưu mã dataset cùng tên miền của cổng. Cùng một mã trên hai tên miền khác nhau là hai dataset khác nhau, hoặc là một dataset được chia sẻ qua liên kết giữa hai cổng.

Quyền đọc dataset công khai

Dataset công khai đọc được mà không cần đăng nhập. Tài liệu Socrata khuyên dùng app token để được giới hạn request cao hơn và để chủ cổng biết ai đang gọi. Không có token, request bị gom chung vào nhóm ẩn danh với giới hạn thấp hơn.

Dataset riêng tư cần tài khoản có quyền, xác thực qua HTTP Basic hoặc OAuth theo cấu hình của cổng. Bài này chỉ bàn dataset công khai.

Giấy phép và ghi công

Metadata của dataset có trường license và attribution. Mỗi thành phố có điều khoản sử dụng riêng cho cổng dữ liệu của mình. Bảng kết quả nên mang theo tên cổng, mã dataset, giấy phép và thời điểm lấy.

Bài không tư vấn pháp lý. Nhưng mang giấy phép theo dữ liệu là thói quen giúp người dùng sau biết họ được làm gì với bảng.

Ranh giới với CKAN

CKAN quản lý catalog: dataset là cái bìa, tệp nằm trong resource. Bài CKAN cùng cụm dựng bảng kê tệp từ catalog đó. Socrata thì cho truy vấn hàng ngay trên API.

Hai bài cùng cụm giữ hai đầu ra khác nhau. Bài CKAN ra bảng kê tệp có URL và mã HEAD. Bài Socrata ra bảng hàng dữ liệu đã lọc kèm đối soát số hàng.

Ai cần bảng hàng đã lọc

Nhà báo dữ liệu cần số vụ va chạm theo quận trong một tuần để viết bài. Nhóm nghiên cứu giao thông cần tọa độ để vẽ điểm nóng. Nhóm phân tích cần chuỗi thời gian để so sánh các tháng.

Cả ba đều cần cùng một thứ: đủ hàng, đúng điều kiện, không trùng. Phần còn lại của bài tập trung vào việc bảo đảm điều đó.

Những gì bài không làm

Bài không ghi dữ liệu lên cổng, không dùng tài khoản thật, không đăng ký app token. Bài không hướng dẫn đổi IP hay đổi User-Agent để vượt 403, vì đó là quyết định của chủ cổng.

Dùng SODA/SoQL truy vấn dataset công khai với chọn cột, lọc và phân trang ổn định bằng Socrata API bằng Python

$select, $where, $order

$select, $where, $order

Phần này giải thích endpoint, cú pháp SoQL và nguyên tắc phân trang mà tài liệu Socrata nhấn mạnh.

Endpoint SODA 2.x

Endpoint truy vấn có dạng tên miền cổng cộng /resource/ cộng mã dataset cộng .json. Ví dụ https://data.cityofnewyork.us/resource/h9gi-nx95.json. Theo tài liệu endpoint của Socrata, có thể đổi đuôi thành .csv hoặc .geojson để nhận định dạng khác.

Tham số SoQL viết dưới dạng tham số URL bắt đầu bằng dấu đô la: $select, $where, $order, $group, $limit, $offset. Cũng có thể gộp tất cả vào một tham số $query.

Chọn cột bằng $select

Dataset va chạm có hàng chục cột. Chỉ lấy cột cần giúp response nhỏ hơn và giúp CSV gọn. Lab chọn 10 cột từ collision_id tới contributing_factor_vehicle_1.

$select còn dùng cho hàm tổng hợp. count(*) AS n trả một hàng duy nhất với số hàng khớp. Đây là phép đếm chuẩn để đối soát sau khi lấy dữ liệu.

Lọc bằng $where

$where nhận biểu thức kiểu SQL. Lab dùng crash_date between hai mốc thời gian của tuần đầu tháng 9. Kiểu ngày trong Socrata là floating timestamp, viết dạng ISO không có múi giờ.

Chuỗi trong $where đặt trong nháy đơn. Khi ghép tham số từ đầu vào, phải thoát nháy đơn để tránh làm hỏng truy vấn. Để requests mã hóa URL thay vì tự nối chuỗi.

Đếm trước, lấy sau

import requests
D = "https://data.cityofnewyork.us"
B = f"{D}/resource/h9gi-nx95.json"
W = "crash_date between '2026-09-01T00:00:00' and '2026-09-07T23:59:59'"
r = requests.get(B, timeout=60, params={"$select": "count(*) AS n", "$where": W},
                 headers={"User-Agent": "ProxyVN-lab/1.0 (lab@example.com)"})
expected = int(r.json()[0]["n"])

Số expected là mốc để kiểm khi gom xong. Kết quả count trả về là chuỗi, không phải số, nên phải ép kiểu.

$limit và $offset

$limit đặt số hàng mỗi trang, $offset đặt vị trí bắt đầu. Tài liệu ghi SODA 2.1 cho $limit tới 50.000 hàng mỗi request. Lab dùng 1.000 để mỗi trang nhỏ, lỗi trang nào chạy lại trang đó.

Vòng lặp dừng khi một trang trả ít hơn $limit. Cách dừng này đơn giản và đúng, miễn là thứ tự hàng ổn định.

Vì sao bắt buộc có $order

Thiếu $order: 655 lặp, 655 mất

Thiếu $order: 655 lặp, 655 mất

Tài liệu về $order của Socrata nói rõ: muốn phân trang ổn định thì phải có $order. Không có $order, máy chủ không bảo đảm thứ tự giữa hai request. Trang 2 của lần gọi này có thể chồng lên trang 1 của lần gọi trước.

Cột dùng cho $order nên là cột duy nhất cho mỗi hàng, như collision_id hoặc trường hệ thống :id. Sắp theo crash_date không đủ, vì nhiều vụ cùng ngày và thứ tự giữa chúng vẫn không xác định.

Khung code phân trang

SEL = ("collision_id,crash_date,crash_time,borough,zip_code,latitude,"
       "longitude,number_of_persons_injured,number_of_persons_killed,"
       "contributing_factor_vehicle_1")
rows, off = [], 0
while True:
    j = requests.get(B, timeout=60, params={"$select": SEL, "$where": W,
        "$order": "collision_id", "$limit": 1000, "$offset": off}).json()
    rows += j
    if len(j) < 1000:
        break
    off += 1000
ids = [x["collision_id"] for x in rows]
assert len(ids) == len(set(ids)) == expected

Dòng assert cuối là đối soát ba chiều: số hàng lấy được, số mã khác nhau và số máy chủ đếm phải bằng nhau.

Chọn cột $order khi dataset không có mã riêng

Không phải dataset nào cũng có một cột mã duy nhất như collision_id. Dataset tổng hợp theo tháng hay theo quận thường chỉ có tổ hợp nhiều cột mới xác định được một hàng. Khi đó, $order có thể ghép nhiều cột, cách nhau bằng dấu phẩy.

Cách chắc hơn là dùng trường hệ thống :id mà Socrata gán cho mọi hàng. Thêm :id vào $select để lấy ra, và đặt $order bằng :id. Trường này không hiện trên trang dataset nhưng có trong API theo tài liệu.

Dù chọn cách nào, hãy chạy thử truy vấn đếm số giá trị khác nhau của cột $order. Nếu số này nhỏ hơn tổng số hàng, cột chưa đủ để phân trang ổn định.

Gộp tổng hợp ngay trên máy chủ

Khi chỉ cần số vụ theo quận, không cần lấy từng hàng. $query với SELECT borough, count(*) AS n, cùng điều kiện, GROUP BY borough, ORDER BY n DESC trả vài hàng thay vì vài nghìn hàng.

Tổng hợp trên máy chủ nhẹ hơn cho cả hai bên. Nhưng hãy giữ truy vấn gốc trong tệp kết quả để người đọc tái lập được con số.

Chuẩn bị truy vấn, ID, token và phiên bản API khi dùng Socrata API bằng Python

Phần này gom các quyết định nhỏ trước khi chạy: phiên bản endpoint, app token, tên cột và định danh request.

SODA 2.x và SODA 3

Socrata có hai thế hệ endpoint. SODA 2.x là /resource/ quen thuộc, dùng tham số dấu đô la. SODA 3 là /api/v3/views/ cộng mã cộng /query.json, nhận truy vấn trong thân request. Tài liệu hiện hành mô tả SODA 3 yêu cầu app token cho mọi request.

Lab dự định gọi cả hai, nhưng cổng trả 403 trước khi tới bước đó. Bài dùng SODA 2.x cho ví dụ vì phổ biến hơn và đọc được ẩn danh theo tài liệu. Ghi rõ phiên bản endpoint trong cấu hình để khi cổng đổi chính sách, chỉ cần sửa một chỗ.

App token

App token đăng ký miễn phí trong trang nhà phát triển của cổng. Gửi qua header X-App-Token hoặc tham số $$app_token. Theo tài liệu app token, request có token được giới hạn theo token, request không token bị giới hạn chung theo IP.

Token không phải mật khẩu nhưng vẫn là định danh của anh em. Đọc từ biến môi trường, không ghi vào code, không in ra log. Bài này không đăng ký và không dùng token thật.

Tên cột là field name, không phải tên hiển thị

Trang dataset hiển thị tên cột như CRASH DATE hay NUMBER OF PERSONS INJURED. API dùng field name như crash_date và number_of_persons_injured. Dùng tên hiển thị trong $select sẽ nhận lỗi.

Cách nhanh nhất để biết field name là gọi endpoint với $limit bằng 1 rồi đọc header X-SODA2-Fields. Header X-SODA2-Types đi kèm cho biết kiểu của từng cột.

Đọc metadata của dataset

Endpoint /api/views/ cộng mã cộng .json trả metadata: tên, mô tả, giấy phép, thời điểm cập nhật hàng rowsUpdatedAt và danh sách cột. Lab có code đọc endpoint này nhưng cổng New York trả 403 trong 2,5 giây.

Khi đọc được, lưu rowsUpdatedAt vào tệp kết quả. Đây là mốc cho biết dữ liệu mới tới đâu, khác với thời điểm anh em chạy script.

Kiểu dữ liệu trong JSON

Socrata trả mọi giá trị số dưới dạng chuỗi trong JSON. number_of_persons_injured là "2" chứ không phải 2. Tọa độ latitude, longitude cũng là chuỗi. Ép kiểu sau khi lấy, dựa vào X-SODA2-Types.

Ép kiểu sớm trong vòng lặp là cách dễ làm hỏng dữ liệu khi gặp giá trị lạ. Lấy về nguyên dạng, lưu thô, rồi chuẩn hóa ở một bước riêng.

Định danh bằng User-Agent

Lab đặt User-Agent ProxyVN-lab/1.0 kèm email giả [email protected]. Khi chạy thật, thay bằng tên dự án và email thật, cộng app token. Chủ cổng có thể liên hệ khi truy vấn gây tải bất thường.

Không đổi User-Agent sau khi bị 403. Đổi chuỗi định danh để có kết quả khác là lẩn tránh, không phải sửa lỗi.

Môi trường lab

Python 3.12.10, requests 2.34.2, csv và json của thư viện chuẩn. Có thư viện bọc sodapy, nhưng lab gọi thẳng để thấy rõ từng tham số. Ghi phiên bản vào requirements.txt.

Thu dữ liệu có phân trang hoặc trạng thái job theo đúng nguồn với Socrata API bằng Python

Phần này ghi lại kết quả gọi thật, kết quả máy chủ giả lập và những gì rút ra từ hai bên.

Kết quả gọi thật ngày 29/10/2026

Bảng: Kết quả gọi thật ngày 29/10/2026

Request

Mã

Giây

Ghi chú

NYC /api/views/h9gi-nx95.json

403

2,50

nginx, có X-Socrata-RequestId

NYC /resource/h9gi-nx95.json?$limit=1

403

2,05

Trang 403 của nginx

Chicago /resource/ijzp-q8t2.json?$limit=1

403

2,44

Trang 403 của nginx

Catalog api.us.socrata.com

403

3,08

Trang 403 của nginx

SF /resource/wg3w-h783.json?$limit=1

403

5,76

Trang 403 của nginx

dev.socrata.com tài liệu

200

không ghi

Đọc được bình thường

Mọi endpoint dữ liệu đều trả 403, trong khi trang tài liệu trả 200. Lab không biết lý do cụ thể. Có thể là chặn theo dải mạng hoặc chính sách mới cho request ẩn danh. Lab dừng ở đó, không thử né.

Vì sao không thử qua đường khác

Đổi IP, đổi User-Agent hay chuyển request qua proxy để có kết quả khác là lẩn tránh quyết định của chủ cổng. Cách đúng khi bị 403 là đăng ký app token, liên hệ chủ cổng hoặc chờ. Bài ghi trung thực: lab chưa lấy được hàng dữ liệu thật nào từ Socrata trong ngày chạy.

Máy chủ giả lập để kiểm logic phân trang

Lab dựng một máy chủ HTTP cục bộ ở cổng 9603, có đường /resource/demo-0001.json. Máy chủ giữ 2.350 hàng giả với collision_id, borough và number_of_persons_injured. Khoảng một phần năm hàng thiếu hẳn khóa borough, giống cách Socrata bỏ trường rỗng khỏi JSON.

Điểm quan trọng nhất: khi request không có $order, máy chủ xáo trộn thứ tự hàng ở mỗi lần gọi. Đây là mô phỏng đúng cảnh báo trong tài liệu, không phải hành vi đo được trên Socrata thật.

Kết quả phân trang giả lập

Bảng: Kết quả phân trang giả lập

Cách gọi

Hàng lấy được

Mã khác nhau

Trùng

Thiếu

Không có $order

2.350

1.695

655

655

$order=collision_id

2.350

2.350

0

0

$order=collision_id qua proxy HTTP

2.350

2.350

0

0

Không có $order, số hàng lấy được vẫn đúng 2.350. Đếm dòng thì trông như đủ. Nhưng chỉ có 1.695 mã khác nhau: 655 hàng bị lặp và đúng 655 hàng khác bị mất. Đây là lý do đối soát phải đếm mã khác nhau, không chỉ đếm dòng.

Bài học từ cột đếm

Nếu script chỉ kiểm len(rows) bằng expected, nó sẽ báo thành công cho bảng sai một phần tư. Lỗi này im lặng, không ném ngoại lệ, không có mã lỗi. Chỉ phép đếm mã khác nhau mới bắt được.

Kiểm thêm một bước nữa: tập mã lấy được phải bằng tập mã từ truy vấn chỉ lấy collision_id có $order. Khi hai tập khác nhau, in ra phần chênh để điều tra.

Header kiểu dữ liệu

Máy chủ giả lập trả X-SODA2-Fields là danh sách ba tên cột và X-SODA2-Types là text, text, number. Script đọc hai header này ở trang đầu và lưu vào tệp mô tả cột. Trên Socrata thật, hai header này có trên mọi response của endpoint /resource/ theo tài liệu.

Không có job bất đồng bộ

Truy vấn SODA 2.x là đồng bộ: gửi request, nhận hàng. Không có trạng thái job như các API xuất dữ liệu lớn. Khi cần cả dataset hàng triệu dòng, Socrata có đường xuất CSV trọn bộ, nên dùng đường đó thay vì phân trang hàng nghìn lần.

Mười ba request cho 2.350 hàng

Máy chủ giả lập đếm được 13 request trong toàn bộ lab: bốn lần gom đủ, mỗi lần ba trang với $limit 1.000, cộng một request đọc header. Với dữ liệu thật, tính trước số request bằng expected chia $limit để ước lượng tải.

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

Có bảng rồi, việc tiếp theo là kiểm từng cột và giữ dấu vết nguồn.

Khóa chính là collision_id

Mỗi vụ va chạm có collision_id duy nhất. Với dataset khác, tìm cột tương đương trong mô tả dataset. Nếu không có, dùng trường hệ thống :id, lấy bằng cách thêm :id vào $select.

Đếm mã khác nhau, so với expected, so với tập mã từ truy vấn có $order. Ba phép so này đủ cho phần lớn nhu cầu.

Trường rỗng biến mất khỏi JSON

Trường rỗng biến mất

Trường rỗng biến mất

Socrata không trả khóa có giá trị rỗng trong JSON. Hàng không có quận sẽ không có khóa borough chứ không phải borough bằng null. Trong máy chủ giả lập, 449 hàng thiếu khóa này.

Khi ghi CSV bằng csv.DictWriter, đặt restval bằng chuỗi rỗng để cột vẫn có mặt. Đếm số ô rỗng của từng cột và ghi vào bản đối soát.

Ép kiểu theo X-SODA2-Types

Cột number ép sang số nguyên hoặc số thực. Cột floating_timestamp ép sang datetime không múi giờ. Cột text giữ nguyên. Cột point hoặc location là đối tượng lồng, cần tách riêng kinh độ và vĩ độ.

Khi ép kiểu lỗi, đừng bỏ hàng. Ghi giá trị gốc vào cột phụ và đếm số lỗi. Bảng mất hàng âm thầm là lỗi khó phát hiện nhất.

Múi giờ của floating timestamp

Floating timestamp nghĩa là không gắn múi giờ. crash_date của New York là giờ địa phương New York. Khi gộp với dữ liệu từ thành phố khác hay so với giờ Việt Nam, phải gắn múi giờ đúng trước.

Ghi rõ múi giờ giả định trong tệp mô tả. Người đọc sau cần biết 2026-09-01T00:00:00 là nửa đêm ở đâu.

Dữ liệu được sửa sau khi đăng

Dataset va chạm được cập nhật thường xuyên, vụ cũ có thể được sửa số người bị thương sau khi điều tra. Hai lần chạy cùng truy vấn cách nhau một tuần có thể ra con số khác.

Lưu rowsUpdatedAt và thời điểm chạy cùng kết quả. Khi so sánh với báo cáo cũ, mốc này giải thích vì sao số không khớp.

Giữ truy vấn để tái lập

Ghi tên miền, mã dataset, $select, $where, $order và phiên bản endpoint vào phần đầu tệp hoặc tệp nhật ký. Ai có các tham số này cũng tái lập được bảng, miễn là dữ liệu nguồn chưa đổi.

Bài JSON và CSV khi crawl dữ liệu bàn khi nào nên giữ thêm JSON thô. Với Socrata, JSON thô giữ được cả cột lồng mà CSV làm phẳng mất.

Đối chiếu với tổng hợp trên máy chủ

Sau khi có bảng chi tiết, đếm số vụ theo quận bằng pandas. Rồi gọi truy vấn GROUP BY borough trên máy chủ. Hai kết quả phải khớp. Nếu lệch, hoặc bảng chi tiết thiếu hàng, hoặc dữ liệu vừa đổi giữa hai lần gọi.

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

Phần cuối bàn chuyện lưu trữ, nhịp gọi và vị trí đúng của proxy với cổng dữ liệu công.

Lưu CSV kèm bản đối soát

Tệp CSV chứa hàng dữ liệu. Tệp JSON nhỏ đi kèm chứa expected, got, unique, dupes, số ô rỗng mỗi cột, truy vấn, thời điểm chạy và rowsUpdatedAt. Hai tệp đặt cùng tên gốc, khác đuôi.

Nhịp gọi và app token

Không có token, request bị giới hạn chung theo IP và có thể bị chặn khi nhiều người cùng mạng gọi. Đăng ký token là cách đúng để có hạn mức riêng. Bài rate limit API khi dùng proxy có mẫu bộ đếm request theo phút.

Nghỉ một giây giữa các trang là mức lịch sự với cổng công. Dataset lớn thì dùng đường xuất CSV trọn bộ, đừng phân trang hàng nghìn lần.

Khi nhận 429

Lab không chạm được tới giới hạn vì bị 403 trước. Khi gặp 429, đọc header Retry-After nếu có, chờ rồi thử lại trang đó, giảm nhịp cho phần còn lại. Bài proxy bị lỗi 429 giải thích vì sao đổi IP không phải cách sửa 429.

Proxy trong lab kiểm ở đâu

Lab chạy proxy HTTP có xác thực cục bộ và gom lại 2.350 hàng từ máy chủ giả lập qua proxy. Kết quả giống hệt gọi thẳng: 2.350 hàng, 0 trùng. Log proxy ghi request GET tới đường /resource/demo-0001.json kèm đủ tham số $limit, $offset và $order.

Chi tiết này đáng chú ý. Máy chủ giả lập chạy HTTP thường, nên proxy HTTP thấy toàn bộ truy vấn. Với Socrata thật qua HTTPS, proxy chỉ thấy lệnh CONNECT tới tên miền và cổng 443, còn tham số truy vấn và app token nằm trong kênh mã hóa.

Không bao giờ gọi Socrata qua HTTP thường

Nếu anh em lỡ viết URL http thay vì https, mọi tham số kể cả $$app_token sẽ đi dạng rõ qua proxy và mọi máy trung gian. Luôn dùng https và gửi token qua header X-App-Token thay vì tham số URL, để token không lọt vào log truy cập.

Proxy không phải cách vượt 403

Lab nhận 403 từ ba cổng và cố ý không thử lại qua proxy hay IP khác. 403 là quyết định truy cập của chủ cổng. Đổi đường đi để vượt qua là lẩn tránh, dù dữ liệu công khai.

Khi nào cần proxy thật

Proxy cần khi máy chạy pipeline nằm trong mạng nội bộ chỉ được ra Internet qua proxy. Trường hợp thứ hai là tổ chức yêu cầu lưu lượng ra ngoài đi qua một IP cố định để giám sát. Cấu hình và cách mã hóa mật khẩu có ký tự đặc biệt có trong bài định dạng proxy.

Bài Web Scraping proxy là gì phân biệt các vai trò của proxy. Với Socrata, vai trò hợp lý là đường đi mạng, còn hạn mức đến từ app token.

Khi máy chủ của nhóm đặt tại Việt Nam và cần một IP thoát ổn định, proxy tĩnh dễ quản lý hơn proxy xoay. ProxyVN có proxy dân cư tĩnh, datacenter, 4G và proxy xoay qua HTTP hoặc SOCKS5. Anh em có thể mua proxy Việt Nam tại trang chủ ProxyVN rồi khai báo vào requests theo tham số proxies.

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

Lab chưa lấy được hàng dữ liệu thật nào từ Socrata ngày 29/10/2026: mọi endpoint dữ liệu của New York, Chicago, San Francisco và catalog đều trả 403 cho mạng lab. Số liệu 2.350 hàng, 655 trùng, 449 thiếu quận đến từ máy chủ giả lập tự viết, không phản ánh dataset va chạm thật.

Lab chưa thử SODA 3, chưa dùng app token, chưa chạm giới hạn 429 thật và chưa thử proxy thương mại. Cú pháp SoQL, giới hạn $limit và yêu cầu token của SODA 3 được trích từ tài liệu Socrata đọc cùng ngày.

Checklist Socrata API bằng Python

Checklist Socrata API

Checklist Socrata API

  • Dùng field name từ X-SODA2-Fields, không dùng tên hiển thị.
  • Đếm bằng count(*) trước khi lấy hàng.
  • Luôn có $order trên cột duy nhất khi phân trang.
  • Đối soát ba chiều: số dòng, số mã khác nhau, số máy chủ đếm.
  • Đặt restval cho trường rỗng bị bỏ khỏi JSON.
  • Ép kiểu ở bước riêng, theo X-SODA2-Types.
  • Gửi app token qua header, luôn dùng https.
  • Bị 403 thì xin token hoặc liên hệ cổng, không né.

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

Socrata có cần app token không?

SODA 2.x đọc được ẩn danh với giới hạn chung theo IP. Token cho hạn mức riêng. Tài liệu hiện hành mô tả SODA 3 cần token cho mọi request.

Vì sao phân trang ra đủ số dòng mà vẫn sai?

Vì thiếu $order. Thứ tự giữa hai request không ổn định, hàng bị lặp và hàng khác bị mất, tổng dòng vẫn đúng.

Vì sao số trong JSON lại là chuỗi?

Socrata trả giá trị dạng chuỗi trong JSON. Ép kiểu dựa trên header X-SODA2-Types.

Trường rỗng biến đi đâu?

Socrata bỏ khóa có giá trị rỗng khỏi JSON. Đặt restval khi ghi CSV để cột vẫn có mặt.

$limit tối đa là bao nhiêu?

Tài liệu ghi SODA 2.1 cho tới 50.000 hàng mỗi request. Trang nhỏ hơn giúp chạy lại dễ hơn khi lỗi.

Socrata khác CKAN ở điểm nào?

Socrata truy vấn hàng ngay trên API. CKAN quản lý catalog và tệp, chỉ truy vấn hàng khi resource có DataStore.

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

Socrata API bằng Python cho anh em bảng hàng đã lọc ngay từ máy chủ, với điều kiện phân trang có $order và đối soát bằng số mã khác nhau. Lab ngày 29/10/2026 bị 403 ở ba cổng thật nên kiểm logic trên máy chủ giả lập: thiếu $order thì 655 hàng lặp, 655 hàng mất mà tổng dòng vẫn đúng. Xin app token, dùng https, giữ truy vấn để tái lập. Cần IP thoát cố định cho pipeline chạy Socrata 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