2012-11-03 40 views
8

Vì vậy, tôi có một danh sách các phụ reddits và tôi đang sử dụng urllib để mở chúng. Như tôi đã đi qua họ cuối cùng urllib không thành công với:Lỗi HTTP urllib2 429

urllib2.HTTPError: HTTP Error 429: Unknown 

Làm một số nghiên cứu tôi thấy rằng reddit giới hạn số tiền của các yêu cầu đến các máy chủ của họ bằng cách chỉ IP:

Hãy không quá một yêu cầu mỗi hai giây . Có một số phụ cấp cho các vụ yêu cầu, nhưng giữ cho nó tỉnh táo. Nói chung, hãy giữ không quá 30 yêu cầu trong một phút.

Vì vậy, tôi figured tôi muốn sử dụng time.sleep() để giới hạn yêu cầu của tôi vào một trang mỗi 10 giây. Điều này cũng không thành công.

Trích dẫn ở trên được lấy từ trang reddit API. Tôi không sử dụng API reddit. Tại thời điểm này tôi đang suy nghĩ hai điều. Giới hạn đó chỉ áp dụng cho API reddit hoặc urllib cũng có giới hạn.

Có ai biết một trong hai điều đó là gì không? Hoặc làm thế nào tôi có thể đi xung quanh vấn đề này?

+3

Không có giới hạn trong 'urllib2', như bạn có thể đã tìm ra bằng cách thử một số trang web khác. Họ có thể đã chặn IP của bạn khỏi quyền truy cập API, hãy thử gửi email cho họ. –

+0

@larsmans Các reqeusts đi qua ngẫu nhiên. Tôi nhận được một số sau đó nó không thành công trong một thời gian và sau đó nó hoạt động trở lại. Ngoài ra họ không thể chặn tôi khỏi API của họ vì tôi không sử dụng API của họ. –

Trả lời

16

Từ https://github.com/reddit/reddit/wiki/API:

Nhiều mặc định User-Agent (như "Python/urllib" hay "Java") đang quyết liệt hạn chế để khuyến khích chuỗi user-agent độc đáo và mô tả.

Điều này cũng áp dụng cho các yêu cầu thông thường. Bạn cần cung cấp tiêu đề tác nhân người dùng của riêng mình khi thực hiện yêu cầu.

#TODO: change user agent string 
hdr = { 'User-Agent' : 'super happy flair bot by /u/spladug' } 
req = urllib2.Request(url, headers=hdr) 
html = urllib2.urlopen(req).read() 

Tuy nhiên, điều này sẽ tạo kết nối mới cho mọi yêu cầu. Tôi khuyên bạn nên sử dụng thư viện khác có khả năng sử dụng lại kết nối, ví dụ: httplib hoặc Request. Nó sẽ đưa ít căng thẳng trên máy chủ và đẩy nhanh tiến độ yêu cầu:

import httplib 
import time 

lst = """ 
science 
scifi 
""" 

hdr= { 'User-Agent' : 'super happy flair bot by /u/spladug' } 
conn = httplib.HTTPConnection('www.reddit.com') 
for name in lst.split(): 
    conn.request('GET', '/r/'+name, headers=hdr) 
    print conn.getresponse().read() 
    time.sleep(2) 
conn.close() 
+0

Lý do duy nhất làm việc này là vì bạn không sử dụng tác nhân người dùng phổ biến. Tuy nhiên, theo quy tắc API, bạn vẫn cần đặt một tác nhân người dùng duy nhất và giải pháp này cuối cùng có thể khiến bạn nhận được 429 lỗi. – bboe

+0

Cảm ơn bạn đã sửa lỗi đánh giá sai. Tôi đã thay đổi câu trả lời của mình để phản ánh điều này. –

4

reddit thực hiện giới hạn tốc độ theo yêu cầu (không kết nối như suggested bởi Anonymous Coward) cho cả địa chỉ IP và các đại lý người dùng. Vấn đề bạn đang gặp phải là tất cả những người cố gắng truy cập reddit bằng urllib2 sẽ bị giới hạn tỷ lệ như một người dùng.

Giải pháp là đặt đại lý người dùng mà bạn có thể tìm thấy câu trả lời trong this question.

Ngoài ra, hãy bỏ qua viết mã của riêng bạn để thu thập thông tin reddit và sử dụng PRAW instead. Nó hỗ trợ hầu như tất cả các tính năng của API của reddit và bạn không cần phải lo lắng về việc tuân theo bất kỳ quy tắc API nào vì nó quản lý điều đó cho bạn.

+0

Cảm ơn bboe.Tôi bắt gặp bạn trên IRC reddit và bạn đã nói với tôi về PRAW. Chúc mừng một lần nữa. –

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