2012-01-22 52 views
8

Tôi đã chạy một công việc định kỳ trên Google App Engine trong hơn một tháng mà không gặp bất kỳ sự cố nào. Công việc làm nhiều thứ, một là nó sử dụng urllib2 để thực hiện một cuộc gọi để lấy một phản ứng json từ Reddit cũng như một vài trang web khác. Khoảng hai tuần trước, tôi bắt đầu thấy lỗi khi gọi Reddit, nhưng không có lỗi khi gọi các trang web khác. Lỗi tôi nhận được là lỗi HTTP 429.Lỗi 429 khi gọi API Reddit từ Google App Engine

Tôi đã thử thực thi cùng một mã bên ngoài Google App Engine và không có bất kỳ sự cố nào. Tôi đã thử sử dụng urlFetch, nhưng nhận được lỗi tương tự.

Bạn có thể thấy lỗi khi sử dụng ứng dụng engine's interactive shell bằng mã sau.

import urllib2 
data = urllib2.urlopen('http://www.reddit.com/r/Music/.json', timeout=60) 

Chỉnh sửa: Không chắc chắn tại sao nó luôn thất bại đối với tôi chứ không phải ai khác. Đây là lỗi mà tôi nhận được:

>>> import urllib2 
>>> data = urllib2.urlopen('http://www.reddit.com/r/Music/.json', timeout=60) 
Traceback (most recent call last): 
    File "/base/data/home/apps/s~shell-27/1.356011914885973647/shell.py", line 267, in get 
    exec compiled in statement_module.__dict__ 
    File "<string>", line 1, in <module> 
    File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 400, in open 
    response = meth(req, response) 
    File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 513, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 438, in error 
    return self._call_chain(*args) 
    File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 372, in _call_chain 
    result = func(*args) 
    File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 521, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
HTTPError: HTTP Error 429: Unknown 

mã tương tự như chạy bên ngoài của động cơ ứng dụng không có vấn đề:

print urllib2.urlopen('http://www.reddit.com/r/Music/.json').read() 

Lúc đầu, tôi nghĩ rằng nó đã phải làm với một vấn đề thời gian chờ vì nó ban đầu được làm việc , nhưng vì không có lỗi hết thời gian chờ nhưng một mã HttpError lạ, tôi không chắc chắn. Bất kỳ ý tưởng nào?

+0

Sử dụng trình bao tương tác và mã bạn đã cung cấp cho tôi. – cheeken

+6

Điều đó có nghĩa là bạn đang thực hiện quá nhiều yêu cầu. Không có gì bạn có thể làm như một lập trình viên. Để tránh những lỗi này, bạn thường có thể đặt một giấc ngủ giữa các yêu cầu. http://tools.ietf.org/html/draft-nottingham-http-new-status-02#page-4 –

+0

@ user947240: theo lời khuyên của shadyabhi. – RanRag

Trả lời

13

Tỷ lệ rút lại giới hạn api khá nghiêm trọng đối với tác nhân người dùng mặc định cho trình bao python. Bạn cần phải thiết lập một đại lý người dùng duy nhất với Tên truy nhập reddit của bạn trong nó, như thế này:

User-Agent: siêu hạnh phúc flair bot bởi/u/spladug

Thông tin thêm về reddit api đây https://github.com/reddit/reddit/wiki/API.

+0

Đây phải là câu trả lời được chấp nhận.Thẳng ra khỏi tài liệu trong liên kết đó "Nhiều người dùng mặc định-đại lý (như" Python/urllib "hoặc" Java ") là rất hạn chế để khuyến khích chuỗi tác nhân người dùng duy nhất và mô tả." – yiati

0

Có thể Reddit đang tính các cuộc gọi dựa trên IP - điều đó có nghĩa là các ứng dụng khác trên GAE chia sẻ IP của bạn có thể đã cạn hết dung lượng.

Điều này có thể tốt hơn nếu bạn sử dụng các khóa API Reddit (Tôi không biết liệu chúng có phát hành chúng không) hoặc nếu chúng đồng ý xếp hạng các cuộc gọi API giới hạn dựa trên tiêu đề ứng dụng.

+0

Sudhir, đây chỉ là suy đoán. – Jason

+1

Yup ... nó đã được. Tôi không nghĩ câu trả lời là một cách chắc chắn. –

Các vấn đề liên quan