Hướng Dẫn Cạo Dữ Liệu Steam: Cách Thu Thập Dữ Liệu Cửa Hàng Trò Chơi Công Khai
TL;DR
Các phương thức Steam Web API, giao diện cửa hàng và HTML cửa hàng có các hợp đồng và điều kiện truy cập khác nhau.
Dự án này kết hợp một ví dụ API tin tức đã được tài liệu hóa với một trình nhập dữ liệu theo dõi giá có thể chạy cho dữ liệu được ủy quyền.
Các giá game và App ID được cung cấp là các bộ dữ liệu giả lập. Chúng không phải là các đề nghị từ Steam thực tế.
So sánh giá chỉ trong cùng một App ID, khu vực, loại tiền tệ, loại gói và ngữ cảnh quan sát.
Thiếu, không khả dụng, miễn phí, và có phí là các trạng thái riêng biệt; không bao giờ biến một giá thiếu thành số không.
Những gì bạn sẽ xây dựng: Một Trình thu thập dữ liệu Steam Game
Bạn sẽ xây dựng một quy trình làm việc dữ liệu game nhỏ với hai lối đi: lấy tin tức thông qua một phương thức Steam Web API đã được tài liệu hóa, và chuẩn hóa một tập dữ liệu giá được phép vào CSV, JSON, và SQLite.
Trình theo dõi giá chạy cục bộ với một bộ dữ liệu giả lập để toàn bộ quá trình phân tích và lưu trữ có thể được tái tạo mà không cần phải lấy dữ liệu từ một cửa hàng trực tiếp. Để lấy giá sản xuất, kết nối một nguồn mà các điều khoản truy cập và sử dụng dữ liệu của nó bao gồm quy trình làm việc của bạn. Sự phân biệt này quan trọng vì một URL cửa hàng có thể đến được không tự động trở thành một API giá công khai được hỗ trợ.
Nguồn Dữ liệu Steam: API Cửa hàng, Steam Web API và HTML
Việc thu thập dữ liệu Steam bắt đầu bằng cách lựa chọn giao diện thực sự cung cấp các trường cần thiết và cho phép sử dụng như dự định.
Lựa chọn Nguồn Dữ liệu Steam Phù hợp
Nguồn
Mục đích phù hợp
Giới hạn quan trọng
Steam Web API đã được tài liệu hóa
Các phương thức đã được tài liệu hóa cụ thể, như tin tức ứng dụng
Không phải mọi trường cửa hàng hay giá đều được công khai
Giao diện đối tác/người xuất bản đã được phê duyệt
Trải nghiệm Nstproxy Crawl - Bắt Đầu Dùng Thử Miễn Phí Hôm Nay
Dữ liệu trong quyền lợi của nhà phát triển
Thông tin đăng nhập và quyền truy cập ứng dụng có thể bị hạn chế
Tập dữ liệu giá đã được cấp phép
Lịch sử đề nghị khu vực theo hợp đồng
Phạm vi và phân phối lại phụ thuộc vào giấy phép
JSON mặt trước cửa hàng
Chi tiết triển khai tiềm năng của trang web
Khả năng tiếp cận không đảm bảo về độ ổn định hay quyền hạn
HTML cửa hàng
Nghiên cứu cấp độ trang đã được phê duyệt
Quy tắc truy cập, trạng thái khu vực, đánh dấu, và giới hạn độ tuổi
Tài liệu tổng quan về Web API của Valve mô tả việc sử dụng API đã được tài liệu hóa. Giao diện appdetails của cửa hàng thường được tham chiếu không nên được coi là một API giá hoàn chỉnh với các cam kết đã được tài liệu hóa giống nhau.
Hiểu về App ID Steam và Giá cả Khu vực
Một App ID xác định một ứng dụng, có thể là một trò chơi, DLC, bản demo, hoặc một loại ứng dụng khác. Một đề nghị cũng có thể liên quan đến các gói hoặc bộ, vì vậy một nhãn cấp độ ứng dụng không phải là một danh tính thương mại hoàn chỉnh.
App ID cửa hàng, loại đề nghị, khu vực, loại tiền tệ, số tiền ban đầu và hiện tại, trạng thái giá, nguồn, và thời gian quan sát. Bảo tồn các giá trị nguồn số nguyên với một quy ước đơn vị rõ ràng. Không chia mỗi loại tiền tệ cho 100 mà không kiểm tra định nghĩa đơn vị của nguồn.
Các yêu cầu và Thiết lập Môi trường Python
Trình theo dõi được cung cấp sử dụng thư viện tiêu chuẩn của Python. Tạo một thư mục chứa steam_tracker.py và steam_prices_fixture.json, sau đó sử dụng một môi trường ảo.
Bộ dữ liệu chứa tên game và giá giả tưởng, bao gồm các trạng thái có phí, miễn phí và không khả dụng. Nó tồn tại để xác thực hành vi; không sử dụng nó như một mẫu lịch sử thị trường.
Bước 1: Lấy Thông tin Game Steam
Lấy dữ liệu chỉ qua một giao diện bao gồm các dữ liệu yêu cầu và sử dụng. Đối với một ví dụ hẹp đã được tài liệu hóa, phương thức GetNewsForApp của Valve trả về tin tức ứng dụng bằng cách sử dụng một App ID và số lượng kết quả hạn chế.
Trình theo dõi bao gồm lệnh tùy chọn này:
python steam_tracker.py --news570
Yêu cầu dựa trên tài liệu này đã không được thực hiện như một bài kiểm tra Steam trực tiếp cho bài viết. Nó lấy tin tức thay vì giá, tên nhà phát triển, hoặc một danh mục sản phẩm chính thức. Sự phân biệt ngăn chặn một phản hồi tin tức bị ghi nhãn sai là metadata cửa hàng hoàn chỉnh.
Đối với thông tin game và giá cả, nhập một phản hồi nguồn được phép thông qua một bộ chuyển đổi ánh xạ vào sơ đồ bên dưới.
Bước 2: Trích xuất Metadata Game và Giá cả
Sơ đồ chuẩn hóa giữ các giá trị không xác định một cách rõ ràng.
Đối với dữ liệu thực, cũng bảo tồn loại ứng dụng, danh tính gói, ngôn ngữ nguồn, và định nghĩa đơn vị số tiền của nhà cung cấp. Tên nhà phát triển, ngày phát hành, và thể loại nên vẫn có thể null khi vắng mặt. Một chuỗi ngày phát hành hiển thị không phải lúc nào cũng là một ngày ISO có thể sắp xếp được.
Bộ phân tích từ chối các giá miễn phí không đồng nhất và các trạng thái giá không xác định với số lượng số. Một đề nghị khu vực không khả dụng có giá null thay vì một số không được tạo ra.
Bước 3: Thu Thập Nhiều Trò Chơi Steam
Áp dụng thực tiễn thu thập có giới hạn và sử dụng danh sách cho phép của App ID và ghi lại từng kết quả. Giữ các ID không hợp lệ, các ưu đãi không có sẵn theo vùng, lỗi nguồn, và các giá thiếu riêng biệt.
Khi sử dụng một nguồn trực tuyến được phê duyệt, chia sẻ một ngân sách tỷ lệ giữa các công nhân và lưu trữ metadata ổn định. Đừng diễn giải một khuyến nghị đồng thời phổ quát như là sự cho phép để vượt quá giới hạn của một phương pháp.
Mẫu này xử lý ba bản ghi cục bộ. Tăng kích thước thiết bị mẫu để kiểm tra phân tích cú pháp và lưu trữ trước khi thêm một bộ điều hợp thu thập trực tiếp.
Bước 4: Xuất Dữ Liệu Steam Ra CSV và JSON
CSV hữu ích cho việc xem xét; JSON bảo tồn giá trị null và loại trường rõ ràng hơn. SQLite hỗ trợ các quan sát lịch sử.
Bộ thu thập hoàn chỉnh ghi tất cả ba đầu ra:
"""Phân tích một luồng giá được ủy quyền/cục bộ; tùy chọn gọi API tin tức công khai đã được tài liệu."""import argparse
import csv
import json
import sqlite3
import time
from datetime import datetime
from pathlib import Path
from urllib.parse import urlencode
from urllib.request import Request, urlopen
defnormalize(item): appid =int(item["appid"])if appid <=0:raise ValueError("ID Ứng Dụng Không Hợp Lệ") observed = item["observed_at"]if datetime.fromisoformat(observed.replace("Z","+00:00")).utcoffset()isNone:raise ValueError("Thời gian quan sát phải bao gồm múi giờ") state = item["price_state"]if state notin("paid","free","unavailable","undisclosed"):raise ValueError("Trạng thái giá không xác định") initial, final = item.get("initial_minor"), item.get("final_minor") currency, region = item.get("currency"), item["region"]if state in("paid","free"):ifnot currency orany(type(v)isnotintor v <0for v in(initial, final)):raise ValueError("Thiếu giá so sánh")if state =="free"and(initial !=0or final !=0):raise ValueError("Giá miễn phí phải bằng không")elif initial isnotNoneor final isnotNone:raise ValueError("Giá không xác định phải giữ nguyên null")returndict(appid=appid, name=item["name"], region=region, currency=currency, initial_minor=initial, final_minor=final, price_state=state, observed_at=observed, source=item["source"])defsave(rows, database):with sqlite3.connect(database)as db: db.execute("""CREATE TABLE IF NOT EXISTS prices(
appid INTEGER,name TEXT,region TEXT,currency TEXT,
initial_minor INTEGER,final_minor INTEGER,price_state TEXT,
observed_at TEXT,source TEXT,
PRIMARY KEY(appid,region,observed_at,source))""") columns =list(rows[0]) db.executemany("INSERT OR REPLACE INTO prices VALUES(?,?,?,?,?,?,?,?,?)",[tuple(row[k]for k in columns)for row in rows])defnews(appid): query = urlencode(dict(appid=appid, count=3, maxlength=200,format="json")) request = Request("https://api.steampowered.com/ISteamNews/GetNewsForApp/v2/?"+ query, headers={"User-Agent":"GameResearchDemo/1.0"})with urlopen(request, timeout=20)as response: payload = json.load(response) data = payload.get("appnews",{})ifint(data.get("appid",-1))!= appid:raise ValueError("Phản hồi tin tức không như mong đợi")return data.get("newsitems",[])if __name__ =="__main__": parser = argparse.ArgumentParser() parser.add_argument("--fixture", default="steam_prices_fixture.json") parser.add_argument("--db", default="steam.sqlite") parser.add_argument("--news",type=int) args = parser.parse_args()if args.news:print(json.dumps(news(args.news), ensure_ascii=False, indent=2))else: rows =[normalize(item)for item in json.loads(Path(args.fixture).read_text())]ifnot rows:raise SystemExit("Không có bản ghi nào") save(rows, args.db) Path("steam_prices.json").write_text(json.dumps(rows, indent=2))withopen("steam_prices.csv","w", newline="")as handle: writer = csv.DictWriter(handle, fieldnames=list(rows[0])) writer.writeheader() writer.writerows(rows)print(f"số_bản_ghi_chấp_nhận={len(rows)}")
Giữ các chuỗi giá định dạng như là giá trị hiển thị tùy chọn. Sử dụng các số lượng đã chuẩn hóa và tiền tệ cho các phép so sánh. Không bao giờ suy luận tiền tệ từ vị trí hoặc ngôn ngữ của người dùng một mình.
Bước 5: Thêm Xử Lý Lỗi và Giới Hạn Tần Suất
Xử lý các ID Ứng Dụng không hợp lệ, phản hồi không phải JSON, lỗi HTTP, timeout, vùng không có sẵn, và các trường thiếu như là các thất bại hoặc trạng thái rõ ràng.
Ví dụ này thực hiện một yêu cầu tin tức có giới hạn và dừng lại khi có lỗi. Một bộ điều hợp nguồn được phê duyệt cần thêm một ngân sách thử lại nhỏ cho các lỗi tạm thời, tôn trọng Retry-After, và tránh thử lại các lỗi quyền hạn. Không có tỷ lệ yêu cầu nào được đảm bảo sẽ chấp nhận qua tất cả các giao diện Steam.
Bước 6: Lấy dữ liệu từ các trang Steam Store khi APIs không đủ
Sử dụng HTML chỉ khi thỏa thuận truy cập của bạn cho phép. Kiểm tra xem các trường cấu trúc có hiện diện trong tài liệu trước khi khởi động trình duyệt.
Phát triển bộ phân tích dựa trên HTML được ủy quyền đã lưu và kiểm tra các trường hợp thiếu giá, trò chơi miễn phí, DLC và không có sẵn theo khu vực. Không tìm cách tránh xác minh độ tuổi, yêu cầu đăng nhập hoặc từ chối rõ ràng. Nếu không được phê duyệt truy cập giá, hãy sử dụng bộ dữ liệu có giấy phép hoặc giao diện đối tác thích hợp thay thế.
Thỏa thuận Thỏa thuận Đăng ký của Valve bao gồm các hạn chế về tự động hóa. Điều khoản API Web điều chỉnh việc sử dụng API; chúng nên được xem xét riêng biệt với hành vi của cửa hàng.
Bước 7: Lập Lịch Giám sát Giá Steam
Lập lịch theo giấy phép của nguồn đã chọn và yêu cầu tính mới, sử dụng một pipeline giám sát giá được tài liệu hóa. Một nguồn thông tin hàng ngày đã được phê duyệt có thể đủ cho bảng điều khiển nghiên cứu; nó không cung cấp thực hiện giá theo thời gian giao dịch.
Lưu trữ quan sát với thời gian UTC và danh tính nguồn. Tính toán một sự thay đổi chỉ giữa các ưu đãi tương đương. Cảnh báo về sự thay đổi tiền tệ bất ngờ hoặc ưu đãi bị thiếu thay vì gọi đó là một khoản giảm giá.
Ví dụ về Trình lấy dữ liệu Steam: Xây dựng Trình theo dõi Giá Trò chơi
Chạy fixture được bao gồm, kiểm tra ba bản ghi đã chuẩn hóa, và xác nhận rằng bản ghi miễn phí vẫn bằng không trong khi bản ghi không có sẵn vẫn là null.
Để phát hiện một sự thay đổi giá, truy vấn hai quan sát gần nhất đã được chấp nhận cho cùng một ứng dụng, khu vực, tiền tệ, nguồn và loại ưu đãi. So sánh số tiền cuối cùng chỉ khi cả hai đều có trạng thái giá hợp lệ. Thêm một bảng thay đổi chỉ ghi đè bao gồm số tiền trước, số tiền mới, thời gian và các tham chiếu chứng cứ.
Các kiểm tra cục bộ bao gồm chuẩn hóa, xử lý null, xuất khẩu, và lưu trữ lặp lại cùng một ảnh chụp. Chúng không xác lập độ chính xác giá Steam trực tiếp hoặc quyền hạn giao diện hiện tại.
Các Lỗi và Cách Khắc Phục Thường Gặp Khi Lấy Dữ Liệu Steam
Triệu chứng
Giải thích khả dĩ
Cách điều trị đúng
Không có giá
Miễn phí, không có sẵn, không được công bố, hoặc không thành công trong việc lấy dữ liệu
Bảo toàn trạng thái riêng biệt và kiểm tra chứng cứ
Số tiền khác nhau
Mismatch khu vực/tiền tệ/gói
So sánh các khóa danh tính khớp nhau
Thiếu nhà phát triển
Nguồn không cung cấp trường này
Giữ nguyên null; không suy ra
Thay đổi ngôn ngữ
Địa phương hoặc phiên làm việc đã thay đổi
Lưu trữ địa phương với quan sát
Phản hồi trống
ID không hợp lệ, vấn đề phương thức, hoặc thất bại nguồn
Giữ thất bại bên ngoài các quan sát đã chấp nhận
Trò chơi “miễn phí” đột ngột
Giá trị thiếu bị ép thành không
Sửa chữa xác thực và khôi phục các bản ghi bị ảnh hưởng
Lấy Dữ Liệu Steam Quy Mô Lớn: Kiến Trúc và Chi Phí
Đối với triển khai sản xuất, tách biệt việc phát hiện, siêu dữ liệu ổn định, các ưu đãi thay đổi, chuẩn hóa và báo cáo. Lưu cache các trường ổn định, chỉ cập nhật nhóm ưu đãi đã được phê duyệt, và lưu trữ các công việc thất bại với việc thử lại giới hạn.
Dự toán dữ liệu có giấy phép, yêu cầu, phân tích nơi cần thiết, lưu trữ, bảo trì, và xem xét nguồn. Sử dụng Nstdata Crawl cho một đường dẫn trang được phê duyệt có thể cung cấp hạ tầng thu thập; nó không cung cấp quyền dữ liệu cụ thể của Steam hoặc sơ đồ giá đảm bảo.
Xác nhận quyền truy cập giao diện, điều khoản API, ghi nhận, lưu cache, tái phân phối, và điều kiện sử dụng thương mại trước khi triển khai. Không mở rộng độ khả dụng của phương thức thành quyền thu thập dữ liệu người dùng không liên quan.
Giữ dữ liệu người chơi cá nhân ra ngoài dự án giá cửa hàng trừ khi nó rõ ràng cần thiết và được ủy quyền thích hợp. Nghiên cứu giá sản phẩm không yêu cầu hồ sơ người chơi hoặc hoạt động tài khoản.
Danh Sách Kiểm Tra Dự Án Cuối Cùng
Xác thực App IDs và danh tính ưu đãi, bảo tồn ngữ cảnh khu vực, phân biệt cái thiếu với cái miễn phí, kiểm tra xuất khẩu, xác nhận tính liên tục của ảnh chụp, và xem xét điều khoản truy cập. Kết nối nguồn giá trực tiếp chỉ sau khi cả bộ nhập khẩu cục bộ và thỏa thuận sử dụng dữ liệu đều được xác minh.
Xác thực nội dung cửa hàng cho phép
Giữ cho việc thu thập đã được phê duyệt tách biệt với phân tích trò chơi cụ thể và quyền của nguồn.
Có. Valve tài liệu các phương thức Steam Web API, nhưng điều đó không đồng nghĩa với việc có một điểm cuối giá chung được hỗ trợ cho mọi sử dụng.
Q: Làm thế nào tôi có thể lấy giá game trên Steam?
Sử dụng một giao diện đã được phê duyệt hoặc nguồn cấp phép mà bao gồm các trường, khu vực và mục đích bạn cần. Dự án này chuẩn hóa đầu vào đó và kiểm tra nó với một bộ thử nghiệm.
Q: Mẫu có chứa giá trò chơi thực không?
Không. Các bản ghi giá được cung cấp và ID Ứng dụng là nhân tạo, rõ ràng là dữ liệu thử nghiệm đã được gán nhãn.
Q: Tôi có thể theo dõi các chương trình giảm giá không?
Có, nếu nguồn cho phép giám sát và các bản ghi đề nghị có thể so sánh có sẵn. Giữ cho đơn vị tiền tệ, khu vực, gói và thời gian nhất quán.
Q: Tại sao appdetails không được sử dụng làm hợp đồng hướng dẫn trực tiếp?
Một điểm cuối hướng tới cửa hàng không nên được trình bày như một API giá cả chung được tài liệu đầy đủ và được ủy quyền chỉ vì nó có thể truy cập được.
Q: Phương thức tin tức đã được tài liệu có thể thay thế nguồn giá không?
Không. Tin tức và giá cửa hàng là các tập dữ liệu khác nhau và phải giữ các sơ đồ và quyền riêng biệt.
Lena Zhou
Oct. 19th 2026
Thu thập toàn bộ trang web chỉ với một yêu cầu API
Tỷ lệ thành công 99,8% với kết xuất JavaScript
Nhận dữ liệu sạch, sẵn sàng cho LLM ở nhiều định dạng
Chuyển mọi trang web thành Markdown, HTML, JSON, liên kết, PDF và hơn thế nữa mà không cần quản lý hạ tầng thu thập dữ liệu.