2014-04-01 20 views
42

Tôi cố gắng để sử dụng Python để đăng nhập vào một trang web và thu thập thông tin từ một số trang web và tôi nhận được lỗi sau:Làm thế nào để tránh Lỗi HTTP 429 (Quá nhiều yêu cầu) python

Traceback (most recent call last): 
    File "extract_test.py", line 43, in <module> 
    response=br.open(v) 
    File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open 
    return self._mech_open(url, data, timeout=timeout) 
    File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open 
    raise response 
mechanize._response.httperror_seek_wrapper: HTTP Error 429: Unknown Response Code 

tôi đã sử dụng time.sleep() và nó hoạt động, nhưng có vẻ không thông minh và không đáng tin cậy, có cách nào khác để né tránh lỗi này không?

Dưới đây là mã của tôi:

import mechanize 
import cookielib 
import re 
first=("example.com/page1") 
second=("example.com/page2") 
third=("example.com/page3") 
fourth=("example.com/page4") 
## I have seven URL's I want to open 

urls_list=[first,second,third,fourth] 

br = mechanize.Browser() 
# Cookie Jar 
cj = cookielib.LWPCookieJar() 
br.set_cookiejar(cj) 

# Browser options 
br.set_handle_equiv(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 

# Log in credentials 
br.open("example.com") 
br.select_form(nr=0) 
br["username"] = "username" 
br["password"] = "password" 
br.submit() 

for url in urls_list: 
     br.open(url) 
     print re.findall("Some String") 
+5

Không có cách nào xung quanh nó, đây là một thực thi trên Server- bên theo dõi bao nhiêu yêu cầu/đơn vị thời gian bạn thực hiện. Nếu bạn vượt quá đơn vị này, bạn sẽ tạm thời bị chặn. Một số máy chủ gửi thông tin này trong tiêu đề, nhưng những dịp đó rất hiếm. Kiểm tra tiêu đề đã nhận được từ máy chủ, sử dụng thông tin có sẵn .. Nếu không, hãy kiểm tra tốc độ bạn có thể búa mà không bị bắt và sử dụng 'ngủ '. – Torxed

+1

http://stackoverflow.com/questions/15648272/how-do-you-view-the-request-headers-that-mechanize-is-using – Torxed

Trả lời

6

workaround khác là giả mạo IP của bạn sử dụng một số loại công VPN hoặc mạng Tor. Điều này sẽ giả định tỷ lệ giới hạn trên máy chủ ở cấp IP.

Có một bài viết trên blog ngắn gọn thể hiện một cách để sử dụng tor cùng với urllib2:

http://blog.flip-edesign.com/?p=119

78

Tiếp nhận một tình trạng 429 là không phải là một lỗi, nó là máy chủ khác "vui lòng" yêu cầu bạn để vui lòng ngừng yêu cầu gửi spam. Rõ ràng, tỷ lệ yêu cầu của bạn quá cao và máy chủ không sẵn sàng chấp nhận điều này.

Bạn không nên tìm cách "né tránh" điều này, hoặc thậm chí cố gắng phá vỡ cài đặt bảo mật máy chủ bằng cách cố gắng giả mạo IP của bạn, bạn chỉ nên tôn trọng câu trả lời của máy chủ bằng cách không gửi quá nhiều yêu cầu.

Nếu mọi thứ được thiết lập đúng cách, bạn cũng sẽ nhận được tiêu đề "Thử lại sau" cùng với phản hồi 429. Tiêu đề này chỉ định số giây bạn nên đợi trước khi thực hiện một cuộc gọi khác. Cách thích hợp để giải quyết vấn đề này là đọc tiêu đề này và ngủ quá trình của bạn trong nhiều giây.

Bạn có thể tìm thêm thông tin về tình trạng 429 ở đây: http://tools.ietf.org/html/rfc6585#page-3

+5

Tôi vừa nhận được 429 yêu cầu đầu tiên của mình .. – geotheory

+9

Vâng, không ai nói rằng tất cả các máy chủ web được cấu hình đúng. Ngoài ra, vì hầu hết các giới hạn tốc độ đều xác định khách truy cập theo IP, điều này có thể dẫn đến các sự cố trong trường hợp các IP được chia sẻ động. Nếu bạn tiếp tục nhận trạng thái 429 mặc dù bạn tự tin rằng bạn chưa gửi quá nhiều yêu cầu, bạn có thể xem xét liên hệ với quản trị viên của trang web. – MRA

10

Viết đoạn mã này cố định vấn đề của tôi:

requests.get(link, headers = {'User-agent': 'your bot 0.1'})

+5

Câu trả lời này được giảm xuống, nhưng một số trang web tự động trả về mã lỗi 429 nếu tác nhân người dùng bị cấm do lạm dụng từ người khác. Nếu bạn nhận được mã lỗi 429 ngay cả khi bạn chỉ gửi một vài yêu cầu, hãy thử đặt tác nhân người dùng thành một cái gì đó khác. –

+1

Cũng muốn thêm, một số trang web từ chối yêu cầu trừ khi tác nhân người dùng được gửi và bạn có thể nhận được vô số các phản hồi khác: 503/403/một số trang chỉ mục chung. – user3791372

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