অনুরোধে ইউআরএল দিয়ে সর্বাধিক পুনরায় চেষ্টা করা ছাড়িয়েছে


151

আমি অ্যাপ স্টোর> ব্যবসায়ের সামগ্রী পাওয়ার চেষ্টা করছি :

import requests
from lxml import html

page = requests.get("https://itunes.apple.com/in/genre/ios-business/id6000?mt=8")
tree = html.fromstring(page.text)

flist = []
plist = []
for i in range(0, 100):
    app = tree.xpath("//div[@class='column first']/ul/li/a/@href")
    ap = app[0]
    page1 = requests.get(ap)

যখন আমি চেষ্টা rangeসঙ্গে (0,2)এটি কাজ করে, কিন্তু যখন আমি করা rangeমধ্যে 100গুলি এটা এই ত্রুটি দেখায়:

Traceback (most recent call last):
  File "/home/preetham/Desktop/eg.py", line 17, in <module>
    page1 = requests.get(ap)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 383, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 486, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 378, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='itunes.apple.com', port=443): Max retries exceeded with url: /in/app/adobe-reader/id469337564?mt=8 (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)

1
আপনি iকোথাও ভেরিয়েবল ব্যবহার করবেন না for?
লরেন্ট এস

আপনি একই অ্যাপ্লিকেশনটিকে 100 বার অনুরোধ করার মতো। এটা কিসের জন্য ?
njzk2

আমি বাকী কোডটিতে ব্যবহার করছি। আমি পুরো কোডটি পোস্ট
করিনি

আমি একই অ্যাপ্লিকেশনটির জন্য 100 বার অনুরোধ করছি না। আমি একই বিভাগে 100 টি আলাদা অ্যাপের জন্য অনুরোধ করছি।
ব্যবহারকারী 3446000

3
দেখে মনে হচ্ছে আপনার ডিএনএস রেজোলভার সমাধান করতে অক্ষম itunes.apple.com। আপনি কি dig itunes.apple.comআপনার কমান্ড লাইনে দৌড়াতে পারেন এবং ফলাফলগুলি এখানে পোস্ট করতে পারেন?
থমাস অরোজকো

উত্তর:


141

এখানে যা ঘটেছিল তা হ'ল এটিউনস সার্ভার আপনার সংযোগটি প্রত্যাখ্যান করেছে (আপনি অল্প সময়ের মধ্যে একই আইপি ঠিকানা থেকে অনেকগুলি অনুরোধ প্রেরণ করছেন)

ইউআরএল: / ইন / অ্যাপ / অ্যাডোব-রিডার / আইডি 469337564? এমটি = 8 দিয়ে সর্বাধিক পুনরায় চেষ্টা করা ছাড়িয়েছে

ত্রুটির চিহ্নটি বিভ্রান্ত করছে এটি এমন কিছু হওয়া উচিত যা "কোনও সংযোগ তৈরি করা যায়নি কারণ টার্গেট মেশিনটি সক্রিয়ভাবে এটি অস্বীকার করেছিল"

গিথুব-এ পাইথন সম্পর্কিত প্রায় একটি সমস্যা রয়েছে, এটি এখানে দেখুন

এই সমস্যাটি কাটিয়ে ওঠার জন্য (এটি এতক্ষণের কোনও সমস্যা নয় যেহেতু এটি ডিবাগ ট্রেসকে বিভ্রান্ত করছে) আপনার এই জাতীয় সংযোগ সম্পর্কিত ব্যতিক্রমগুলি ধরা উচিত:

try:
    page1 = requests.get(ap)
except requests.exceptions.ConnectionError:
    r.status_code = "Connection refused"

এই সমস্যাটি কাটিয়ে ওঠার আরেকটি উপায় হ'ল যদি আপনি সার্ভারের কাছে অনুরোধগুলি প্রেরণের জন্য পর্যাপ্ত সময় ব্যবধান ব্যবহার sleep(timeinsec)করেন তবে অজগরটি ফাংশন দ্বারা এটি অর্জন করা যেতে পারে (ঘুম আমদানি করতে ভুলবেন না)

from time import sleep

সমস্ত অনুরোধ সমস্ত দুর্দান্ত অজগর lib, আশা করি যে আপনার সমস্যার সমাধান করে।


2
ঘুমের লুপটি আমার সমস্যার সমাধান করেছে - কিছুটা হ্যাক, তবে ত্রুটিটির প্রতিক্রিয়াটি পরিচালনা করার সময় কয়েকবার লুপ করে আমি একটি সমাধান জোর করে নিতে সক্ষম হয়েছি।
এলপাস্টার

14
এই উত্তরটি আসলে ভুল। এটি (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)অংশটি দ্বারা নির্দেশিত হিসাবে এটি একটি সমাধানকারী দেখার সমস্যা । "গাই" এর অর্থ দাঁড়ায় getaddrinfoএবং সম্ভাব্য সম্পর্কিত ত্রুটি হ'ল: EAI_NOName নোড বা পরিষেবাটি জানা যায় না; অথবা নোড এবং পরিষেবা উভয়ই নুল; বা AI_NUMERICSERV hints.ai_flags এ নির্দিষ্ট করা হয়েছিল এবং পরিষেবাটি কোনও সংখ্যার পোর্ট-নম্বর স্ট্রিং ছিল না। ঘুম সম্ভবত এটি স্থির করে দেওয়ার মতো দেখেছিল তবে আপনি সম্ভবত একটি ক্ষণস্থায়ী ডিএনএস রেজলভার ইস্যুতে ঘুমিয়েছিলেন।
লিঙ্গফিশ

4
এই উত্তরটি বোঝায় বলে মনে হয় না কারণ 'আর' তে অনুরোধটি আসে যা অনুরোধ.জেট () থেকে আসে তাই ব্যতিক্রম ছাড়া এটি কেবল অন্য ত্রুটির দিকে পরিচালিত করে।
মিক্কোটোটিলা

এই উত্তরটির কোনও অর্থ নেই। ওপির ত্রুটিটি "সংযোগ অস্বীকার করেছে" বলে না, এটিতে "নাম বা পরিষেবা জানা নেই" বলে। এই উত্তরটি ধরে নিয়েছে বলে মনে হচ্ছে যে সমস্ত সংযোগইরর "সংযোগ অস্বীকার" এর কারণে।
এরজিয়াং

1
আমার জন্য এটি ঠিক ঠিক থাকতে হবে, সার্ভারের দ্বারা নির্ধারিত হারের সীমা। আমি 80 টি কল করতে পারি এবং তারপরে এই বার্তাটি আমার কাছে উপস্থিত হবে। তারপরে অল্প সময়ের পরে সার্ভারটি আরও 80 টি কলের জন্য উপলব্ধ এবং চক্র পুনরাবৃত্তি করে। এটি অন্য কিছু হতে খুব নিয়মিত।
ডেমোঙ্গোলেম

122

কেবল requests'বৈশিষ্ট্যগুলি ব্যবহার করুন :

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry


session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

session.get(url)

এটি GETইউআরএল হবে এবং ক্ষেত্রে 3 বার আবার চেষ্টা করবে requests.exceptions.ConnectionErrorbackoff_factorপর্যায়ক্রমিক অনুরোধ কোটার ক্ষেত্রে আবারও ব্যর্থ না হওয়ার চেষ্টাগুলির মধ্যে বিলম্ব প্রয়োগ করতে সহায়তা করবে।

একবার দেখুন requests.packages.urllib3.util.retry.Retry, এর পুনরায় চেষ্টা সহজ করার জন্য অনেকগুলি বিকল্প রয়েছে।


যে কারণেই হোক না কেন, এটি উইন্ডোজ 10 এ কাজ করে না এবং শেলটি python manage.py shellব্যবহার করে শুরু করছি session.get('http://localhost:8000/api/')। কোন সাহায্য? @ জুলু
মওয়ামিটোভি

আমার সমস্যাটি সাজানো হয়েছে শুরু করতে dev-serverএবং এটি প্রথমে চালিয়ে যেতে ভুলে গিয়েছিলেন ।
মাওয়ামিটোভি

কেন এটি এখনও সেরা উত্তর না?
পাভেল দ্রুজিনিন

আমি এটি চেষ্টা করেছিলাম কিন্তু অনুরোধগুলি পেয়ে যাওয়ার সময় এটি পুনরায় চেষ্টা করবে না ceptions তবে আমি অনুরোধের জন্য একটি সময়সীমা নির্ধারণ করেছি।
জাগফাই

34

শুধু এই কাজ,

নিম্নলিখিত কোডটি এর জায়গায় আটকে দিন page = requests.get(url):

import time

page = ''
while page == '':
    try:
        page = requests.get(url)
        break
    except:
        print("Connection refused by the server..")
        print("Let me sleep for 5 seconds")
        print("ZZzzzz...")
        time.sleep(5)
        print("Was a nice sleep, now let me continue...")
        continue

আপনাকে স্বাগতম :)


3
মনে রাখবেন import time
ইউয়ান তাও

3
requestsএর ত্রুটিটি পরিচালনা করতে এবং পুনরায় চেষ্টা করার জন্য তার নিজস্ব কোড রয়েছে
জুলু

5
এটি কখনই লুপ থেকে বের হয় না। @jatin
Alper

10
এছাড়াও, প্রতিক্রিয়া except: ...থেকে requestsএবং কেবল কোনও ধরণের ব্যতিক্রম (সহ ) ধরা ভাল ধারণা নয় sleep()। পরিবর্তে, তাদের ধরা উচিত requests.exceptions.ConnectionErrorএবং sleep()কেবলমাত্র যদি ব্যতিক্রম ঘটে। (বা আরো ভালো এখনো, শুধু builtin ব্যবহার Retry()বর্গ যে দিয়ে আসে requests, যেমন @Zulu দ্বারা প্রস্তাবিত)।
জে টেলর

32

pip install pyopenssl আমার জন্য এটি সমাধান বলে মনে হয়েছিল।

https://github.com/requests/requests/issues/4246


1
এসএসএল আমার সমস্যা তা খুঁজে পেতে আমাকে সহায়তা করেছে
মিলাড্রয়েড

একই এখানে =) ধন্যবাদ!
রডরিগো ই। প্রিন্সিপ

15

আমি একই সমস্যা পেয়েছি তবে নিম্নলিখিত কোডটি আমার পক্ষে কাজ করেছে।

url = <some REST url>    
page = requests.get(url, verify=False)

"যাচাই = মিথ্যা" SSL যাচাইকরণ অক্ষম করে। চেষ্টা করুন এবং ধরা যথারীতি যোগ করা যেতে পারে।


5

ব্যতিক্রম হ্যান্ডলিং বাস্তবায়ন করা সর্বদা ভাল। এটি কেবল স্ক্রিপ্টের অপ্রত্যাশিত প্রস্থান এড়াতে সহায়তা করে না তবে ত্রুটিগুলি এবং তথ্য বিজ্ঞপ্তি লগ করতে সহায়তা করতে পারে। পাইথন অনুরোধগুলি ব্যবহার করার সময় আমি এই জাতীয় ব্যতিক্রমগুলি ধরতে পছন্দ করি:

    try:
        res = requests.get(adress,timeout=30)
    except requests.ConnectionError as e:
        print("OOPS!! Connection Error. Make sure you are connected to Internet. Technical Details given below.\n")
        print(str(e))            
        renewIPadress()
        continue
    except requests.Timeout as e:
        print("OOPS!! Timeout Error")
        print(str(e))
        renewIPadress()
        continue
    except requests.RequestException as e:
        print("OOPS!! General Error")
        print(str(e))
        renewIPadress()
        continue
    except KeyboardInterrupt:
        print("Someone closed the program")

এখানে রিনিউআইপিড্রেস () হ'ল একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন যা এটি আটকে গেলে আইপি ঠিকানাটি পরিবর্তন করতে পারে। আপনি এই ফাংশন ছাড়া যেতে পারেন।


আপনার সমাধানটি দুর্দান্ত তবে কীভাবে ip-adrress
অজগরটি

1
আমি কিছু ভিপিএন পরিষেবা আইপিভ্যানিশ এবং আমার গাধা লুকান। এগুলি ওপেন-ভিপিএন এবং ওপেন-ভিপিএন ব্যবহার করে কনফিগার করা হয়েছে শেল কমান্ড সারি আইপি ঠিকানাটি পুনর্নবীকরণ করে। পাইথন থেকে আপনি শেল বা ব্যাশ কমান্ড কল করতে পারেন। এইভাবে, আপনি এটি বাস্তবায়ন করতে পারেন।
তন্ময় দত্ত

5

কর্পোরেট পরিবেশে প্রক্সি নির্দিষ্ট করে দেওয়া আমার জন্য এটি সমাধান করেছে।

page = requests.get("http://www.google.com:80", proxies={"http": "http://111.233.225.166:1234"})

সম্পূর্ণ ত্রুটিটি হ'ল:

অনুরোধসমূহ।অযুক্তি সংযোগের ত্রুটি: HTTPSConnicationPool (হোস্ট = 'www.google.com', পোর্ট = 80): ইউআরএল দিয়ে সর্বাধিক পুনরায় চেষ্টা করা হয়েছে: / (নিউ সংযোগআরারের কারণে হয়েছে (': একটি নতুন সংযোগ স্থাপন করতে ব্যর্থ হয়েছে: [উইনআরর 10060] একটি সংযোগ প্রচেষ্টা ব্যর্থ হয়েছে কারণ সংযুক্ত দলটি নির্দিষ্ট সময়ের পরে যথাযথভাবে প্রতিক্রিয়া জানায়নি, বা সংযুক্ত হোস্ট সাড়া দিতে ব্যর্থ হয়েছে বলে সংস্থার সংযোগ ব্যর্থ হয়েছে '))


2

পাইপেনসেল ইনস্টল করার পরেও এবং পাইথন বিভিন্ন সংস্করণ চেষ্টা করার পরেও এটি উইন্ডোতে কাজ করতে সক্ষম হয়েছি না (এটি ম্যাকের ক্ষেত্রে ভাল কাজ করেছে), তাই আমি urllib এ চলেছি এবং এটি পাইথন ৩.6 (পাইথন .org থেকে) এবং ৩.7 (অ্যানাকোন্ডা) এ কাজ করে )

import urllib 
from urllib.request import urlopen
html = urlopen("http://pythonscraping.com/pages/page1.html")
contents = html.read()
print(contents)

আমি বেশ বিরক্ত হয়েছি যে আন্যাকোন্ডা প্রম্পট দিয়ে চালানো হলেই জিনিসগুলি কাজ করে।
BingLi224

1

আমি যখন সেলেনিয়াম ব্রাউজার পরীক্ষার স্ক্রিপ্ট লিখছিলাম, তখন driver.quit()জেএস এপিআই কল ব্যবহারের আগে ফোন করার সময় আমি এই ত্রুটির মুখোমুখি হয়েছিলাম e মনে রাখবেন যে ওয়েবড্রাইভারকে উদ্ধৃতি করা শেষ কাজ!


1

যারা ভবিষ্যতে এটি অনুভব করছেন তাদের জন্য আমার নিজের অভিজ্ঞতা যুক্ত করা। আমার নির্দিষ্ট ত্রুটি ছিল

Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'

দেখা যাচ্ছে যে এটি আসলে ছিল কারণ আমি আমার সিস্টেমে সর্বাধিক সংখ্যক উন্মুক্ত ফাইল পৌঁছেছিলাম। ব্যর্থ সংযোগগুলির সাথে এটির কোনও সম্পর্ক ছিল না, বা নির্দেশিত হিসাবে একটি ডিএনএস ত্রুটিও ছিল।


0

আমার নিজের অভিজ্ঞতা যুক্ত করা:

r = requests.get(download_url)

আমি যখন url এ নির্দিষ্ট একটি ফাইল ডাউনলোড করার চেষ্টা করেছি to

ত্রুটি ছিল

HTTPSConnectionPool(host, port=443): Max retries exceeded with url (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')])")))

আমি verify = Falseনিম্নলিখিত হিসাবে ফাংশন যোগ করে এটি সংশোধন করেছি :

r = requests.get(download_url + filename)
open(filename, 'wb').write(r.content)

-1

এই অনুরোধের জন্য শিরোনাম যুক্ত করুন।

headers={
'Referer': 'https://itunes.apple.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}

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