কীভাবে এইচটিটিপি ত্রুটি 429 (অনেকগুলি অনুরোধ) অজগর এড়ানো যায়


94

আমি একটি ওয়েবসাইটে লগিন করতে এবং বেশ কয়েকটি ওয়েবপৃষ্ঠাগুলি থেকে তথ্য সংগ্রহ করার জন্য পাইথনটি ব্যবহার করার চেষ্টা করছি এবং আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

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

আমি ব্যবহার করেছি time.sleep()এবং এটি কাজ করে, তবে এটি অজ্ঞাতসারে এবং অবিশ্বাস্য মনে হয়, এই ত্রুটিটিকে ফাঁসানোর কোনও অন্য উপায় আছে কি?

আমার কোডটি এখানে:

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")

6
এর আশেপাশে কোনও উপায় নেই, এটি আপনি কতগুলি অনুরোধ / সময়-ইউনিট করেন তা ট্র্যাক করে সার্ভার-সাইডে প্রয়োগ করা। আপনি যদি এই ইউনিটটি অতিক্রম করেন তবে আপনাকে অস্থায়ীভাবে অবরুদ্ধ করা হবে। কিছু সার্ভার শিরোনামে এই তথ্যটি প্রেরণ করে তবে এই অনুষ্ঠানগুলি বিরল। সার্ভার থেকে প্রাপ্ত শিরোলেখগুলি পরীক্ষা করুন, উপলভ্য তথ্যগুলি ব্যবহার করুন .. যদি না হয়, ধরা না পড়ে আপনি কত দ্রুত হাতুড়ি করতে পারেন তা পরীক্ষা করুন এবং এ ব্যবহার করুন sleep
টর্ক্সড

উত্তর:


158

429 স্থিতি পাওয়া ত্রুটি নয় , এটি অন্য সার্ভারটি "দয়া করে" আপনাকে স্প্যামিংয়ের অনুরোধগুলি বন্ধ করতে বলছে। স্পষ্টতই, আপনার অনুরোধের হার খুব বেশি হয়ে গেছে এবং সার্ভার এটি মানতে রাজি নয়।

আপনার এটি "ডজ" করার চেষ্টা করা উচিত নয়, এমনকি আপনার আইপিটি ফাঁকি দেওয়ার চেষ্টা করেও সার্ভারের সুরক্ষা সেটিংসকে অবরুদ্ধ করার চেষ্টা করা উচিত নয়, খুব বেশি অনুরোধ না প্রেরণ করে আপনার কেবল সার্ভারের উত্তরকে সম্মান করা উচিত।

যদি সবকিছু সঠিকভাবে সেট আপ করা হয় তবে আপনি 429 প্রতিক্রিয়া সহ একটি "পুনরায় চেষ্টা করুন" শিরোনামও পাবেন। এই শিরোনামটি অন্য কল করার আগে আপনাকে যে সেকেন্ড অপেক্ষা করতে হবে তা নির্দিষ্ট করে। এই "সমস্যা" মোকাবেলা করার সঠিক উপায় হ'ল এই শিরোনামটি পড়া এবং আপনার প্রক্রিয়াটি কয়েক সেকেন্ডের জন্য ঘুমানো।

আপনি এখানে 429 স্ট্যাটাসের আরও তথ্য পেতে পারেন: http://tools.ietf.org/html/rfc6585#page-3


23
ভাল, কেউ কখনও বলেনি যে সমস্ত ওয়েব সার্ভারগুলি সঠিকভাবে কনফিগার করা হয়েছে। এছাড়াও, যেহেতু বেশিরভাগ হার সীমাবদ্ধকারীরা আইপি দ্বারা দর্শনার্থীদের সনাক্ত করছে, এর ফলে আইপিগুলি গতিশীলভাবে ভাগ করা হয় এমন একটি পরিস্থিতিতে সমস্যার সৃষ্টি হতে পারে। আপনি যদি 429 স্থিতি পেতে থাকেন তবে আপনি নিশ্চিত যে আপনি মোটেও অনেকগুলি অনুরোধ প্রেরণ করেন নি, আপনি সাইটের প্রশাসকের সাথে যোগাযোগ করার কথা বিবেচনা করতে পারেন।
এমআরএ

4
"পুনরায় চেষ্টা করুন" শিরোনাম উল্লেখ করার জন্য ধন্যবাদ এই মানটি কীভাবে পাওয়া যায় তা দেখার জন্য আমি একটি কোড উদাহরণ পছন্দ করব (আমি urlib ব্যবহার করছিলাম, ওপি যান্ত্রিকীকরণের জন্য, উভয় ক্ষেত্রেই আমি মনে করি না যে শিরোনামগুলি উত্থাপিত ব্যতিক্রমের অন্তর্ভুক্ত করা হয়েছে)
ম্যাকফ্রিক

@MacFreek আমি কোন বিশেষ পাইথন কোড উদাহরণ প্রস্তুত হবে না, কিন্তু আমি কিভাবে প্রতিক্রিয়া হেডার সাধারণভাবে এই প্রশ্নের উত্তর থেকে গ্রহণ করা যেতে পারে উদ্ধার সম্পর্কে কিছু উদাহরণ অনুমান: stackoverflow.com/q/843392
এমআরএ

ধন্যবাদ @ এমআরএ আমি দেখতে পেয়েছি যে শিরোনামগুলি ব্যতিক্রমটিতেও পাওয়া যায়: ধরা পরে HTTPError as my_exception, এটি my_exception.headersঅন্তত urlib2 এর জন্য উপলব্ধ।
ম্যাকফ্রিক

38

এই কোডের টুকরোটি লিখে আমার সমস্যাটি স্থির করেছে:

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


26
এই উত্তরটি নিম্নচঞ্চলযুক্ত, তবে কিছু ব্যক্তি স্বয়ংক্রিয়ভাবে ত্রুটি কোড 429 ফিরিয়ে দেয় যদি ব্যবহারকারী এজেন্ট অন্য ব্যক্তির অপব্যবহারের কারণে নিষিদ্ধ থাকে। আপনি যদি কেবল কয়েকটি অনুরোধ প্রেরণ করেন তবেও যদি আপনি ত্রুটি কোড 429 পান তবে ব্যবহারকারী এজেন্টকে অন্য কোনও কিছুতে সেট করার চেষ্টা করুন।
ফেরি বোন্ডার

7
এটি যুক্ত করতে চাই, কোনও ব্যবহারকারী-এজেন্ট প্রেরণ না করা পর্যন্ত কিছু সাইট স্পষ্টভাবে অনুরোধগুলি প্রত্যাখ্যান করে এবং আপনি অন্যান্য প্রতিক্রিয়াগুলির একটি অগণিত পেতে পারেন: 503/403 / কিছু জেনেরিক সূচক পৃষ্ঠা।
ব্যবহারকারী 3791372

4
এটি নিশ্চিত করতে পারে। কেবলমাত্র রেডডিট দিয়ে
অজগরকে

4
আপনি কিছু ব্যাখ্যা যোগ করতে পারেন দয়া করে?
টোকি

আপনি এই কোডের টুকরোটি কোথায় লিখবেন? এই সমাধানটির আরও বিশদ প্রয়োজন।
জো ম্যাকলিন

29

এমআরএ যেমন বলেছে, আপনার কোনও ডজ করার চেষ্টা করা উচিত নয়, 429 Too Many Requestsবরং এটি অনুযায়ী হ্যান্ডেল করা উচিত। আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে:

1) আপনার প্রক্রিয়া ঘুমRetry-afterআপনার পুনরায় চেষ্টা করার আগে অপেক্ষা করা সেকেন্ডের সংখ্যার সাথে জবাবটিতে সার্ভারটি সাধারণত একটি শিরোনাম অন্তর্ভুক্ত করে । মনে রাখবেন যে কোনও প্রক্রিয়া ঘুমানোর ফলে সমস্যা হতে পারে, যেমন একটি টাস্ক কাতারে, যেখানে আপনাকে অন্য কাজের জন্য কর্মীকে মুক্ত করার জন্য পরবর্তী সময়ে কার্যটির পুনরায় চেষ্টা করা উচিত।

2) সূচকীয় ব্যাক অফ । যদি সার্ভার আপনাকে কতক্ষণ অপেক্ষা করতে না জানায়, আপনি মাঝখানে ক্রমবর্ধমান বিরতি ব্যবহার করে আপনার অনুরোধটি আবার চেষ্টা করতে পারেন। জনপ্রিয় টাস্ক কিউ সেলারিটিতে এই বৈশিষ্ট্যটি ডান-ইন অন্তর্নির্মিত রয়েছে

3) টোকেন বালতি । আপনি যদি নির্দিষ্ট সময়ে কতগুলি অনুরোধ করতে সক্ষম হবেন যদি আপনি আগেই জানতেন তবে এই কৌশলটি কার্যকর। প্রতিবার আপনি API এ অ্যাক্সেস করলে আপনি প্রথমে বালতি থেকে একটি টোকেন আনেন। বালতিটি একটি স্থির হারে পুনরায় পূরণ করা হয়। যদি বালতিটি খালি থাকে তবে আপনি জানেন যে আপনাকে আবার এপিআই হিট করার আগে অপেক্ষা করতে হবে। টোকেন বালতিগুলি সাধারণত অন্য প্রান্তে (এপিআই) প্রয়োগ করা হয় তবে এগুলি এড়াতে আপনি এগুলি প্রক্সি হিসাবেও ব্যবহার করতে পারেন 429 Too Many Requests। সেলারি এর রেট_লিমিট বৈশিষ্ট্যটি একটি টোকেন বালতি অ্যালগরিদম ব্যবহার করে।

এক্সফেনশনাল ব্যাকঅফ এবং রেট-সীমাবদ্ধকরণ / টোকেন বালতি ব্যবহার করে পাইথন / সেলারি অ্যাপের উদাহরণ এখানে রয়েছে:

class TooManyRequests(Exception):
"""Too many requests"""

@task(
   rate_limit='10/s',
   autoretry_for=(ConnectTimeout, TooManyRequests,),
   retry_backoff=True)
def api(*args, **kwargs):
  r = requests.get('placeholder-external-api')

  if r.status_code == 429:
    raise TooManyRequests()

9

আরেকটি কর্মসূচী হ'ল কিছু ধরণের পাবলিক ভিপিএন বা টোর নেটওয়ার্ক ব্যবহার করে আপনার আইপিটি ফাঁকি দেওয়া। এটি আইপি স্তরে সার্ভারে হার-সীমাবদ্ধতা ধরে নেওয়া হবে।

Urlib2 এর সাথে টর ব্যবহারের একটি উপায় প্রদর্শন করে একটি সংক্ষিপ্ত ব্লগ পোস্ট রয়েছে:

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


8
এই কারণেই আমি সর্বদা আমার API এর ব্যবহারকারীদের কাছে অনুরোধ করার জন্য কোনও কীতে নিবন্ধন করার প্রয়োজন। এইভাবে আমি আইপি না দিয়ে কী দ্বারা অনুরোধগুলি সীমাবদ্ধ করতে পারি। অন্য কিটির জন্য নিবন্ধন করা উচ্চতর সীমাবদ্ধতার একমাত্র উপায়।
ম্যানেবুয়েরকো


0

সাইটগুলি স্ক্র্যাপ করার সময় আমি আইপি ব্লক করার একটি দুর্দান্ত কাজ খুঁজে পেয়েছি । এটি আপনাকে গুগল অ্যাপ ইঞ্জিন থেকে চালিত করে অনির্দিষ্টকালের জন্য স্ক্র্যাপার চালাতে দেয় এবং যখন আপনি 429 পাবেন তখন তা স্বয়ংক্রিয়ভাবে পুনরায় চালনা করতে পারে।

পরীক্ষা করে দেখুন এই নিবন্ধটি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.