İsteklerde URL ile maksimum yeniden deneme aşıldı


164

App Store> Business'ın içeriğini almaya çalışıyorum :

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)

Ben çalıştığınızda rangeile (0,2)buna çalışır, ancak ben koyduğunuzda rangeiçinde 100s bu hata gösterir:

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
iDeğişkeni içinde bir yerde kullanman gerekmez mi for?
Laurent S.

Aynı uygulamayı 100 defa talep etmek gibisiniz. o ne için ?
njzk2

Kodun geri kalanında i kullanıyorum. Kodun tamamını göndermedim
user3446000

Aynı uygulamayı 100 kez talep etmiyorum. Aynı kategori altında 100 farklı uygulama talep ediyorum.
user3446000

3
DNS çözümleyiciniz çözemiyor gibi görünüyor itunes.apple.com. Eğer çalışabilir dig itunes.apple.comKomut satırında ve burada sonuçlar sonrası?
Thomas Orozco

Yanıtlar:


150

Burada olan şey, itunes sunucusunun bağlantınızı reddetmesidir (kısa sürede aynı ip adresinden çok fazla istek gönderiyorsunuz)

URL ile maksimum yeniden deneme aşıldı: / in / app / adobe-reader / id469337564? Mt = 8

hata izleme yanıltıcıdır, "Hedef makine aktif olarak reddettiği için bağlantı kurulamadı" gibi bir şey olmalıdır .

Github'da python.requests lib ile ilgili bir sorun var, buradan kontrol edin

Bu sorunun üstesinden gelmek için (hata ayıklama izlemesi yanıltıcı olduğu kadar bir sorun değil) aşağıdaki gibi bağlantıyla ilgili istisnaları yakalamalısınız:

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

Bu sorunun üstesinden gelmenin başka bir yolu da, sunucuya istek göndermek için yeterli zaman aralığı kullanırsanız, bu, sleep(timeinsec)python'daki işlevle elde edilebilir (uyku aktarmayı unutmayın)

from time import sleep

Tüm isteklerde harika bir python lib var, umarım probleminizi çözer.


2
Uyku döngüsü sorunumu çözdü - biraz hack, ancak hata yanıtını işlerken birkaç kez döngü yaparak, bir çözümü kaba kuvvetle zorlamayı başardım.
elPastor

17
Bu cevap aslında yanlış. Bu, (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)parçada belirtildiği gibi bir çözümleyici arama sorunudur . "gai" kısaltmasıdır getaddrinfove olası ilgili hata şudur: EAI_NONAME Düğüm veya hizmet bilinmiyor; veya hem düğüm hem de hizmet NULL; veya AI_NUMERICSERV, hints.ai_flags içinde belirtildi ve hizmet sayısal bir bağlantı noktası numarası dizesi değildi. Muhtemelen uyku sorunu çözmüş gibi görünüyordu, ancak muhtemelen geçici bir DNS çözücü sorunu ile uyudunuz.
lingfish

4
Bu cevap, 'r' isteklerinden gelen nesne olduğu için mantıklı görünmüyor.
mikkokotila

1
Bu cevap mantıklı değil. OP'nin hatası "Bağlantı reddedildi" demiyor, "Ad veya hizmet bilinmiyor" diyor. Bu yanıt, tüm ConnectionError'ın "Bağlantı reddedildi" den kaynaklandığını varsayıyor gibi görünüyor.
erjiang

1
Benim için bu tam olarak doğru olmalı, sunucu tarafından konulan bir hız sınırı. 80 arama yapabilirim ve sonra bu mesaj benim için görünecek. Kısa bir süre sonra, sunucu 80 çağrı için daha kullanılabilir ve döngü tekrar eder. başka bir şey olamayacak kadar düzenli.
demongolem

133

Sadece requests'özellikleri kullanın :

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)

Bu GETURL olacak ve olması durumunda 3 kez yeniden deneyecek requests.exceptions.ConnectionError. backoff_factorperiyodik istek kotası durumunda tekrar başarısız olmaktan kaçınmak için denemeler arasında gecikmeler uygulanmasına yardımcı olacaktır.

Bir göz atın requests.packages.urllib3.util.retry.Retry, yeniden denemeleri basitleştirmek için birçok seçeneğe sahiptir.


Sebep ne olursa olsun, bu Windows 10'da çalışmaz. Kabuğu ile başlattım python manage.py shellve kullanıyorum session.get('http://localhost:8000/api/'). Herhangi bir yardım? @Zulu
MwamiTovi

sorunumu çözdü. dev-serverİlk önce çalıştırmayı ve çalıştırmayı unutmuştu .
MwamiTovi

Neden hala en iyi cevap değil?
Pavel Druzhinin

Bunu denedim ama request.exceptions.ConnectionError Okuma zaman aşımına uğradığında tekrar denemedi. ancak alma isteği için bir zaman aşımı belirledim.
Zagfai

37

Sadece bunu yap,

Aşağıdaki kodu yerine yapıştırın 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

Rica ederim :)


3
yapmayı unutma import time
Yuan Tao

4
requestshatasını
Zulu

5
Döngüden asla çıkmaz. @jatin
alper

11
Ayrıca, herhangi bir tür istisnayı (ile except: ...) requestsve sleep()yanıt olarak yakalamak iyi bir fikir değildir . Bunun yerine, yakalamak gerektiğini requests.exceptions.ConnectionErrorve sleep()bu durum oluşur yalnızca. (Ya da daha iyisi, @Zulu tarafından önerildiği gibi Retry()birlikte gelen yerleşik sınıfı kullanın requests).
J. Taylor


20

Benzer bir sorunla karşılaştım ama aşağıdaki kod benim için çalıştı.

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

"doğrula = Yanlış" SSL doğrulamasını devre dışı bırakır. Dene ve yakala her zamanki gibi eklenebilir.


6

İstisna işlemeyi uygulamak her zaman iyidir. Yalnızca komut dosyasının beklenmedik şekilde çıkmasını önlemeye yardımcı olmaz, aynı zamanda hataları ve bilgi bildirimlerini günlüğe kaydetmeye de yardımcı olabilir. Python isteklerini kullanırken bunun gibi istisnaları yakalamayı tercih ederim:

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

Burada renewIPadress (), engellenmesi durumunda IP adresini değiştirebilen bir kullanıcı tanımlı işlevdir. Bu işlev olmadan gidebilirsiniz.


çözümünüz güzel ama ip-adrresspython nasıl değiştirilir , bunun hakkında bir şeyler biliyor musunuz, sonra bana bildirin
Haritsinh Gohil

1
Bazı VPN hizmeti IPVanish ve Hide My Ass kullandım. Open-vpn kullanılarak yapılandırılırlar ve open-vpn, IP adresini yenileyen kabuk komut satırına sahiptir. Python'dan shell veya bash komutunu çağırabilirsiniz. Bu şekilde uygulayabilirsiniz.
Tanmoy Datta

5

Proxy'yi kurumsal bir ortamda belirlemek benim için çözdü.

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

Tam hata şudur:

request.exceptions.ConnectionError: HTTPSConnectionPool (host = 'www.google.com', port = 80): url ile maksimum yeniden deneme aşıldı: / (NewConnectionError nedenli (': Yeni bir bağlantı kurulamadı: [WinError 10060] Bir bağlantı girişimi başarısız oldu çünkü bağlı taraf bir süre sonra düzgün yanıt vermedi veya bağlanan ana bilgisayar yanıt veremediği için kurulan bağlantı başarısız oldu '))


2

Gelecekte bunu deneyimleyenler için kendi deneyimlerimi ekliyorum. Benim özel hatam

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

Bunun aslında sistemimdeki maksimum açık dosya sayısına ulaştığım için olduğu ortaya çıktı. Başarısız bağlantılarla veya hatta belirtildiği gibi bir DNS hatasıyla ilgisi yoktu.


2

pyopenssl'i yükledikten ve çeşitli python sürümlerini denedikten sonra bile (mac'da iyi çalışıyor olsa da) pencerelerde çalışmasını sağlayamadım, bu yüzden urllib'e geçtim ve python 3.6 (python .org'dan) ve 3.7 (anaconda) üzerinde çalışıyor )

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

İşlerin yalnızca Anaconda komut istemiyle çalıştırıldığında işe yaraması beni oldukça rahatsız ediyor.
BingLi224

1

Bir selenyum tarayıcı test komut dosyası yazarken driver.quit(), bir JS api çağrısı kullanmadan önce arama yaparken bu hatayla karşılaştım. Webdriver'dan çıkmanın yapılacak en son şey olduğunu unutmayın!


0

Kendi deneyimimi eklemek:

r = requests.get(download_url)

url'de belirtilen bir dosyayı indirmeye çalıştığımda.

Hata

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

İşleve verify = Falseaşağıdaki gibi ekleyerek düzeltdim:

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

0

Ağ bağlantınızı kontrol edin. Buna sahiptim ve VM'nin düzgün bir ağ bağlantısı yoktu.


0

Rotayı tarayıcıda çalıştırdığımda da aynı hatayı aldım, ancak postacıda iyi çalışıyor. Benimki ile ilgili sorun /, sorgu dizesinden önce rotadan sonra hiçbir şeyin olmamasıydı .

127.0.0.1:5000/api/v1/search/?location=Madinabenim /için searchçalıştıktan sonra hatayı yükselt ve kaldır .


-1

Bu istek için başlıklar ekleyin.

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.