अनुरोधों में अधिकतम URL URL से अधिक है


151

मैं App Store> Business की सामग्री प्राप्त करने की कोशिश कर रहा हूँ :

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

मैं बाकी कोड में i का उपयोग कर रहा हूँ। मैंने पूरा कोड पोस्ट नहीं किया है
user3446000

मैं एक ही ऐप के लिए 100 बार अनुरोध नहीं कर रहा हूं। मैं एक ही श्रेणी के तहत 100 विभिन्न ऐप्स के लिए अनुरोध कर रहा हूं।
user3446000

3
ऐसा लगता है कि आपका DNS रिज़ॉल्वर हल करने में असमर्थ है itunes.apple.com। क्या आप dig itunes.apple.comअपनी कमांड लाइन पर चल सकते हैं और यहां परिणाम पोस्ट कर सकते हैं?
थॉमस ओरोज़्को

जवाबों:


141

यहाँ क्या हुआ कि itunes सर्वर आपके कनेक्शन को मना कर देता है (आप एक ही आईपी पते से बहुत कम समय में कई अनुरोध भेज रहे हैं)

Url के साथ अधिकतम रिट्रीस पार हो गई: / in / app / adobe-reader / id469337564? Mt 8

त्रुटि ट्रेस भ्रामक है यह कुछ ऐसा होना चाहिए जैसे "कोई संबंध नहीं बनाया जा सकता क्योंकि लक्ष्य मशीन ने इसे सक्रिय रूप से मना कर दिया"

गितुब में अजगर के बारे में एक मुद्दा है, यह यहाँ की जाँच करें

इस समस्या को दूर करने के लिए (इतना मुद्दा नहीं है क्योंकि यह भ्रामक ट्रेस ट्रेस है) आपको कनेक्शन से संबंधित अपवाद जैसे:

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

इस समस्या को दूर करने का एक अन्य तरीका यह है कि यदि आप सर्वर से अनुरोध भेजने के लिए पर्याप्त समय अंतराल का उपयोग sleep(timeinsec)करते हैं तो यह अजगर में कार्य द्वारा प्राप्त किया जा सकता है (नींद आयात करना न भूलें)

from time import sleep

सभी अनुरोधों में सभी भययोग्य अजगर हैं, आशा है कि आपकी समस्या हल हो जाएगी।


2
स्लीप लूप ने मेरी समस्या को ठीक कर दिया - एक हैक का थोड़ा सा, लेकिन त्रुटि प्रतिक्रिया को संभालने के दौरान एक-दो बार लूप करके, मैं एक समाधान को मजबूर करने में सक्षम था।
इलास्टैस्टर

14
यह उत्तर वास्तव में गलत है। यह एक रिज़ॉल्वर लुकअप समस्या है, जैसा कि (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)भाग से संकेत मिलता है । "gai" का अर्थ है getaddrinfo, और संभावित संबंधित त्रुटि है: EAI_NONAME नोड या सेवा ज्ञात नहीं है; या नोड और सेवा दोनों NULL हैं; या AI_NUMERICSERV संकेत में निर्दिष्ट किया गया था। aaiflfl और सेवा एक संख्यात्मक पोर्ट-संख्या स्ट्रिंग नहीं थी। यह शायद ऐसा लगता था कि नींद ने इसे ठीक कर दिया था, लेकिन आप शायद एक क्षणिक डीएनएस रिसोल्वर मुद्दे के माध्यम से सोए थे।
लिंगफिश

4
यह उत्तर समझ में नहीं आता है क्योंकि 'r' ऑब्जेक्ट है जो request.get () से आता है इसलिए अपवाद के साथ यह सिर्फ एक और त्रुटि की ओर जाता है।
मकोकोटीला

इस जवाब का कोई मतलब नहीं है। ओपी की त्रुटि यह नहीं कहती है कि "कनेक्शन ने इनकार कर दिया", यह कहता है "नाम या सेवा ज्ञात नहीं है"। यह उत्तर लगता है कि सभी ConnectionError "कनेक्शन मना कर दिया" के कारण हैं।
११:०२

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)

यह GETURL और 3 बार के मामले में पुन: प्रयास करेगा requests.exceptions.ConnectionErrorbackoff_factorआवधिक अनुरोध कोटा के मामले में फिर से विफल होने से बचने के प्रयासों के बीच देरी को लागू करने में मदद करेगा।

एक नज़र डालें requests.packages.urllib3.util.retry.Retry, तो रिट्रीट को सरल बनाने के लिए कई विकल्प हैं।


जो भी कारण के लिए, यह विंडोज़ 10 पर काम नहीं करता है। शेल python manage.py shellका उपयोग करना शुरू कर रहा है session.get('http://localhost:8000/api/')। कोई मदद? @ ज़ुलू
MwamiTovi

मेरा मुद्दा सुलझ गया। को शुरू करना dev-serverऔर पहले उसे चालू रखना भूल गया था ।
MwamiTovi

यह अभी भी सबसे अच्छा जवाब क्यों नहीं है?
पावेल द्रुजिनेन

मैंने यह कोशिश की, लेकिन मुझे अनुरोध मिलने के बाद भी यह पीछे नहीं हटेगा। लेकिन मैंने अनुरोध प्राप्त करने के लिए एक समय सीमा तय की।
ज़गफ़ई

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()केवल अगर वह अपवाद होता है। (या अभी तक बेहतर है, बस उस अंतर्निहित Retry()वर्ग का उपयोग करें जो requests@Zulu द्वारा सुझाए गए हैं)।
जे टेलर


15

मुझे भी ऐसी ही समस्या हुई लेकिन निम्न कोड ने मेरे लिए काम किया।

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

"सत्यापन = गलत" एसएसएल सत्यापन को निष्क्रिय करता है। कोशिश करो और पकड़ हमेशा की तरह जोड़ा जा सकता है।


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
मैंने कुछ वीपीएन सेवा IPVanish और Hide My Ass का उपयोग किया था। वे ओपन-वीपीएन का उपयोग करके कॉन्फ़िगर किए गए हैं और ओपन-वीपीएन में आईपी पते को नवीनीकृत करने वाली शेल कमांड पंक्ति है। आप अजगर से शेल या बैश कमांड को कॉल कर सकते हैं। इस तरह, आप इसे लागू कर सकते हैं।
तन्मय दत्त

5

कॉर्पोरेट वातावरण में प्रॉक्सी को निर्दिष्ट करना मेरे लिए इसे हल करता है।

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

पूर्ण त्रुटि है:

request.exception.ConnectionError: HTTPSConnectionPool (host = 'www.google.com', port = 80): अधिकतम पुनर्प्राप्त url के साथ: / (NewConnectionError द्वारा उत्पन्न) (': नया कनेक्शन स्थापित करने में विफल: [WinError 10060] एक कनेक्शन। प्रयास विफल हो गया क्योंकि कनेक्टेड पार्टी ने समय की अवधि के बाद ठीक से जवाब नहीं दिया, या स्थापित कनेक्शन विफल रहा क्योंकि कनेक्टेड होस्ट प्रतिक्रिया देने में विफल रहा है ')


2

मैं pyopenssl को स्थापित करने और विभिन्न अजगर संस्करणों की कोशिश करने के बाद भी खिड़कियों पर काम करने में सक्षम नहीं था (जबकि यह मैक पर ठीक काम किया), इसलिए मैंने urllib पर स्विच किया और यह python 3.6 (python .org से) और 3.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()जेएस एपीआई कॉल के उपयोग से पहले कॉल करते समय इस त्रुटि का सामना करना पड़ा। याद रखें कि वेबड्राइवर को छोड़ना आखिरी बात है!


1

भविष्य में जो लोग इसका अनुभव कर रहे हैं, उनके लिए मेरा अपना अनुभव जोड़ना। मेरी विशिष्ट त्रुटि थी

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

यह पता चला है कि यह वास्तव में था क्योंकि मैं अपने सिस्टम पर अधिकतम खुली फ़ाइलों तक पहुंच गया था। यह विफल कनेक्शन के साथ, या यहाँ तक कि संकेत के रूप में एक DNS त्रुटि के साथ कुछ नहीं करना था।


0

मेरा अपना अनुभव जोड़ना:

r = requests.get(download_url)

जब मैंने url में निर्दिष्ट फ़ाइल डाउनलोड करने का प्रयास किया।

त्रुटि थी

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.