Percobaan maksimum terlampaui dengan URL dalam permintaan

151

Saya mencoba untuk mendapatkan konten dari App Store> Bisnis :

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)

Ketika saya mencoba rangedengan (0,2)itu berfungsi, tetapi ketika saya meletakkan rangedi 100s itu menunjukkan kesalahan ini:

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)
user3446000
sumber
1
Bukankah Anda seharusnya menggunakan ivariabel di suatu tempat di for?
Laurent S.
Anda seperti meminta aplikasi yang sama 100 kali. untuk apa itu ?
njzk2
Saya menggunakan saya di sisa kode. Saya belum memposting seluruh kode
user3446000
Saya tidak meminta aplikasi yang sama 100 kali. Saya meminta 100 aplikasi berbeda di bawah kategori yang sama.
user3446000
3
Sepertinya resolver DNS Anda tidak dapat menyelesaikan itunes.apple.com. Bisakah Anda menjalankan dig itunes.apple.comdi baris perintah dan memposting hasilnya di sini?
Thomas Orozco

Jawaban:

141

Apa yang terjadi di sini adalah bahwa server itunes menolak koneksi Anda (Anda mengirim terlalu banyak permintaan dari alamat ip yang sama dalam waktu singkat)

Pengulangan maks terlampaui dengan url: / in / app / adobe-reader / id469337564? Mt = 8

jejak kesalahan menyesatkan itu seharusnya sesuatu seperti "Tidak ada koneksi dapat dibuat karena mesin target secara aktif menolaknya" .

Ada masalah di tentang python.requests lib di Github, periksa di sini

Untuk mengatasi masalah ini (tidak terlalu masalah karena jejak debug yang menyesatkan), Anda harus menangkap pengecualian terkait koneksi seperti:

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

Cara lain untuk mengatasi masalah ini adalah jika Anda menggunakan celah waktu yang cukup untuk mengirim permintaan ke server ini dapat dicapai dengan sleep(timeinsec)fungsi dalam python (jangan lupa untuk mengimpor sleep)

from time import sleep

Semua dalam semua permintaan adalah python lib yang luar biasa, harapan yang memecahkan masalah Anda.

djra
sumber
2
Loop tidur memperbaiki masalah saya - sedikit peretasan, tetapi dengan mengulang beberapa kali sambil menangani respons kesalahan, saya dapat dengan kasar memaksa solusi.
elPastor
14
Jawaban ini sebenarnya salah. Ini adalah masalah pencarian resolver, seperti yang ditunjukkan oleh (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)bagian. "gai" adalah singkatan getaddrinfo, dan kemungkinan kesalahan terkait adalah: EAI_NONAME Node atau layanan tidak dikenal; atau kedua simpul dan layanan NULL; atau AI_NUMERICSERV ditentukan dalam hints.ai_flags dan layanan bukan string nomor porta numerik. Itu mungkin tampak seperti tidur memperbaikinya, tetapi Anda mungkin hanya tidur melalui masalah DNS resolver sementara.
lingfish
4
Jawaban ini tampaknya tidak masuk akal karena di 'r' adalah objek yang berasal dari requests.get () jadi dengan pengecualian ini hanya mengarah ke kesalahan lain.
mikkokotila
Jawaban ini tidak masuk akal. Kesalahan OP tidak mengatakan "Koneksi ditolak", ini mengatakan "Nama atau layanan tidak dikenal". Jawaban ini tampaknya menganggap bahwa semua ConnectionError disebabkan oleh "Koneksi ditolak".
erjiang
1
Bagi saya ini harus tepat, batas nilai yang ditempatkan oleh server. Saya dapat melakukan 80 panggilan dan kemudian pesan ini akan muncul untuk saya. Kemudian setelah waktu yang singkat, server tersedia untuk 80 panggilan lain dan siklus berulang. terlalu teratur untuk menjadi hal lain.
demongolem
122

Cukup gunakan requests'fitur:

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)

Ini akan GETURL dan coba lagi 3 kali dalam kasus requests.exceptions.ConnectionError.backoff_factorakan membantu menerapkan penundaan antar upaya untuk menghindari kegagalan lagi jika terjadi kuota permintaan berkala.

Lihatlah requests.packages.urllib3.util.retry.Retry, ia memiliki banyak opsi untuk menyederhanakan percobaan.

Zulu
sumber
Untuk alasan apa pun, ini tidak berfungsi pada windows 10. Memulai shell dengan python manage.py shelldan saya gunakan session.get('http://localhost:8000/api/'). Ada bantuan? @Cepat
MwamiTovi
menyelesaikan masalah saya. dev-serverSudah lupa untuk memulai dan menjalankannya terlebih dahulu.
MwamiTovi
Mengapa itu masih bukan jawaban terbaik?
Pavel Druzhinin
Saya mencoba ini tetapi itu tidak akan mencoba lagi ketika saya mendapat requests.exceptions.ConnectionError Baca habis waktu. tapi saya menetapkan batas waktu untuk permintaan dapatkan.
Zagfai
34

Lakukan saja ini,

Rekatkan kode berikut sebagai pengganti 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

Sama-sama :)

jatin
sumber
3
ingat untuk melakukan import time
Yuan Tao
3
requestsmemiliki kode sendiri untuk menangani kesalahannya dan coba lagi
Zulu
5
Tidak pernah keluar dari loop. @jatin
alper
11
Juga, bukan ide yang baik untuk menangkap semua jenis pengecualian (dengan except: ...) dari requestsdan sleep()sebagai respons. Sebaliknya, mereka harus menangkap requests.exceptions.ConnectionErrordan sleep()hanya jika pengecualian itu terjadi. (Atau lebih baik lagi, cukup gunakan Retry()kelas builtin yang datang dengan requests, seperti yang disarankan oleh @Score).
J. Taylor
32

pip install pyopenssl sepertinya menyelesaikannya untukku.

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

Akshar
sumber
1
Membantu saya mengetahui SSL adalah masalah saya
MilaDroid
Sama di sini =) Terima kasih!
Rodrigo E. Principe
15

Saya mendapat masalah serupa tetapi kode berikut ini berhasil untuk saya.

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

"memverifikasi = Salah" menonaktifkan verifikasi SSL. Coba dan tangkap dapat ditambahkan seperti biasa.

Raj Stha
sumber
5

Itu selalu baik untuk menerapkan penanganan pengecualian. Ini tidak hanya membantu untuk menghindari keluarnya script yang tidak terduga, tetapi juga dapat membantu untuk mencatat kesalahan dan pemberitahuan info. Saat menggunakan permintaan Python, saya lebih suka menangkap pengecualian seperti ini:

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

Di sini renewIPadress () adalah fungsi yang ditentukan pengguna yang dapat mengubah alamat IP jika diblokir. Anda dapat pergi tanpa fungsi ini.

Tanmoy Datta
sumber
solusi Anda bagus tetapi bagaimana cara mengubahnya ip-adrressdengan python, apakah Anda tahu sesuatu tentang itu, lalu beri tahu saya
Haritsinh Gohil
1
Saya telah menggunakan beberapa layanan VPN IPVanish dan Hide My Ass. Mereka dikonfigurasi menggunakan open-vpn dan open-vpn memiliki baris perintah shell yang memperbarui alamat IP. Anda dapat memanggil perintah shell atau bash dari python. Dengan cara ini, Anda bisa menerapkannya.
Tanmoy Datta
5

Menentukan proksi di lingkungan perusahaan menyelesaikannya untuk saya.

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

Kesalahan penuh adalah:

requests.exceptions.ConnectionError: HTTPSConnectionPool (host = 'www.google.com', port = 80): Retries maksimum melebihi dengan url: / (Disebabkan oleh NewConnectionError (': Gagal membuat koneksi baru: [WinError 10060] Sebuah koneksi upaya gagal karena pihak yang terhubung tidak merespons dengan benar setelah periode waktu tertentu, atau koneksi yang dibuat gagal karena tuan rumah yang terhubung gagal merespons '))

Jeremy Thompson
sumber
2

saya tidak dapat membuatnya bekerja di windows bahkan setelah menginstal pyopenssl dan mencoba berbagai versi python (sementara itu berfungsi dengan baik pada mac), jadi saya beralih ke urllib dan bekerja pada python 3.6 (dari python .org) dan 3.7 (anaconda )

import urllib 
from urllib.request import urlopen
html = urlopen("http://pythonscraping.com/pages/page1.html")
contents = html.read()
print(contents)
alex
sumber
Saya cukup kesal bahwa hal-hal bekerja hanya jika dijalankan dengan Anaconda prompt.
BingLi224
1

Ketika saya sedang menulis skrip uji browser selenium, saya menemukan kesalahan ini ketika menelepon driver.quit()sebelum penggunaan panggilan JS api. Ingat bahwa berhenti dari webdriver adalah hal terakhir yang harus dilakukan!

Saleh
sumber
1

Menambahkan pengalaman saya sendiri untuk mereka yang mengalami ini di masa depan. Kesalahan spesifik saya adalah

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

Ternyata ini sebenarnya karena saya telah mencapai jumlah maksimum file terbuka di sistem saya. Itu tidak ada hubungannya dengan koneksi yang gagal, atau bahkan kesalahan DNS seperti yang ditunjukkan.

Oded
sumber
0

Menambahkan pengalaman saya sendiri:

r = requests.get(download_url)

ketika saya mencoba mengunduh file yang ditentukan di url.

Kesalahannya adalah

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

Saya memperbaikinya dengan menambahkan verify = Falsefungsi sebagai berikut:

r = requests.get(download_url + filename)
open(filename, 'wb').write(r.content)
Suraj Subramanian
sumber
-1

Tambahkan tajuk untuk permintaan ini.

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)
Michael Yang
sumber