เกินความพยายามสูงสุดที่มี URL ในคำขอ


151

ฉันพยายามรับเนื้อหาของApp Store> ธุรกิจ :

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?
Laurent S.

คุณต้องการขอแอปเดียวกัน 100 ครั้ง เพื่ออะไร
njzk2

ฉันใช้ i ในส่วนที่เหลือของรหัส ฉันยังไม่ได้โพสต์รหัสทั้งหมด
user3446000

ฉันไม่ได้ร้องขอแอพเดียวกัน 100 ครั้ง ฉันขอแอพ 100 แอปที่แตกต่างกันในประเภทเดียวกัน
user3446000

3
ดูเหมือนว่าตัวแก้ไข DNS ของคุณไม่สามารถแก้ไขitunes.apple.comได้ คุณสามารถเรียกใช้dig itunes.apple.comที่บรรทัดคำสั่งของคุณและโพสต์ผลลัพธ์ได้ที่นี่?
โทมัส Orozco

คำตอบ:


141

สิ่งที่เกิดขึ้นที่นี่ก็คือ เซิร์ฟเวอร์itunesปฏิเสธการเชื่อมต่อของคุณ (คุณส่งคำขอมากเกินไปจากที่อยู่ IP เดียวกันในช่วงเวลาสั้น ๆ )

เกินความพยายามสูงสุดแล้วด้วย url: / in / app / adobe-reader / id469337564? mt = 8

การติดตามข้อผิดพลาดทำให้เข้าใจผิดควรเป็นสิ่งที่ต้องการ "ไม่มีการเชื่อมต่ออาจจะทำเนื่องจากเครื่องเป้าหมายปฏิเสธมัน"

มีปัญหาเกี่ยวกับ python.requests lib ที่ Github ลองดูสิ ที่นี่

หากต้องการเอาชนะปัญหานี้ (ไม่มากปัญหาเนื่องจากเป็นการติดตามการดีบักที่ทำให้เข้าใจผิด) คุณควรตรวจสอบข้อยกเว้นที่เกี่ยวข้องกับการเชื่อมต่อดังนี้:

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

อีกวิธีหนึ่งในการเอาชนะปัญหานี้คือถ้าคุณใช้ช่องว่างเวลาเพียงพอในการส่งคำขอไปยังเซิร์ฟเวอร์สิ่งนี้สามารถทำได้โดยการsleep(timeinsec)ทำงานในหลาม (อย่าลืมที่จะนำเข้าโหมดสลีป)

from time import sleep

ทั้งหมดในคำขอทั้งหมดคือ lib python ที่ยอดเยี่ยมหวังว่าจะช่วยแก้ปัญหาของคุณได้


2
การนอนหลับวนกลับแก้ไขปัญหาของฉัน - แฮ็คสักหน่อย แต่ด้วยการวนรอบสองสามครั้งในขณะที่จัดการกับการตอบสนองข้อผิดพลาดทำให้ฉันสามารถบังคับวิธีแก้ปัญหาได้
elPastor

14
คำตอบนี้ผิดจริงๆ นี่เป็นปัญหาการค้นหาตัวแก้ไขตามที่ระบุโดย(Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)ส่วนหนึ่ง "gai" หมายถึงgetaddrinfoและข้อผิดพลาดที่เกี่ยวข้องน่าจะเป็น: EAI_NONAMEไม่รู้จักโหนดหรือบริการ หรือทั้งสองโหนดและบริการเป็น NULL; หรือ AI_NUMERICSERV ถูกระบุใน hints.ai_flags และบริการไม่ใช่สตริงหมายเลขพอร์ตที่เป็นตัวเลข อาจดูเหมือนว่าการนอนหลับได้รับการแก้ไข แต่คุณอาจเพิ่งผ่านปัญหาการแก้ไข DNS ชั่วคราว
lingfish

4
คำตอบนี้ดูเหมือนจะไม่สมเหตุสมผลเหมือนใน 'r' คือวัตถุที่มาจากคำร้องขอ get () ดังนั้นด้วยข้อยกเว้นนี้จะทำให้เกิดข้อผิดพลาดอื่น
mikkokotila

คำตอบนี้ไม่สมเหตุสมผล ข้อผิดพลาดของ OP ไม่ได้บอกว่า "การเชื่อมต่อถูกปฏิเสธ" มันบอกว่า "ไม่ทราบชื่อหรือบริการ" คำตอบนี้ดูเหมือนว่าจะถือว่า ConnectionError ทั้งหมดเป็นเพราะ "การเชื่อมต่อถูกปฏิเสธ"
erjiang

1
สำหรับฉันสิ่งนี้จะต้องถูกต้องแน่นอนขีด จำกัด อัตราที่เซิร์ฟเวอร์กำหนดไว้ ฉันสามารถโทร 80 ครั้งจากนั้นข้อความนี้จะปรากฏขึ้นสำหรับฉัน หลังจากนั้นไม่นานเซิร์ฟเวอร์จะพร้อมใช้งานสำหรับการโทรอีก 80 ครั้งและวนซ้ำ ปกติเกินไปที่จะเป็นอย่างอื่น
demongolem

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.ConnectionErrorครั้งในกรณีของ backoff_factorจะช่วยในการใช้ความล่าช้าระหว่างความพยายามที่จะหลีกเลี่ยงความล้มเหลวอีกครั้งในกรณีของโควต้าคำขอเป็นระยะ

ลองดูที่requests.packages.urllib3.util.retry.Retryมันมีตัวเลือกมากมายในการลองใหม่ได้ง่ายขึ้น


ไม่ว่าจะด้วยเหตุผลใดก็ตามสิ่งนี้จะไม่ทำงานบน windows 10 เริ่มเชลล์ด้วยpython manage.py shellและกำลังใช้งานsession.get('http://localhost:8000/api/')อยู่ ความช่วยเหลือใด ๆ @Zulu
MwamiTovi

ได้รับการจัดเรียงปัญหาของฉัน ลืมที่จะเริ่มต้นdev-serverและให้มันทำงานก่อน
MwamiTovi

ทำไมมันยังไม่ได้คำตอบที่ดีที่สุด?
Pavel Druzhinin

ฉันลองสิ่งนี้ แต่จะไม่ลองอีกครั้งในขณะที่ได้รับคำขอข้อยกเว้นการเชื่อมต่อหมดเวลาอ่านหมดเวลา แต่ฉันกำหนดหมดเวลาสำหรับการร้องขอรับ
Zagfai

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
Yuan Tao

3
requestsมีรหัสของตัวเองเพื่อจัดการข้อผิดพลาดและลองใหม่อีกครั้ง
Zulu

5
มันไม่เคยออกจากลูป @jatin
alper

10
นอกจากนี้ไม่ใช่ความคิดที่ดีที่จะตรวจสอบข้อยกเว้นใด ๆ (พร้อมexcept: ...) จากrequestsและsleep()ตอบสนอง แต่พวกเขาควรจับrequests.exceptions.ConnectionErrorและsleep()เฉพาะในกรณีที่มีข้อยกเว้นเกิดขึ้น (หรือยังดีกว่าให้ใช้Retry()คลาสbuiltin ที่มาพร้อมกับrequestsที่แนะนำโดย @Zulu)
เจเทย์เลอร์


15

ฉันมีปัญหาที่คล้ายกัน แต่รหัสต่อไปนี้ทำงานให้ฉัน

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

"Verify = False" ปิดใช้งานการตรวจสอบ SSL สามารถเพิ่มลองและจับได้ตามปกติ


5

มันเป็นการดีเสมอที่จะใช้การจัดการข้อยกเว้น มันไม่เพียง แต่ช่วยหลีกเลี่ยงการออกจากสคริปต์ที่ไม่คาดคิด แต่ยังช่วยในการบันทึกข้อผิดพลาดและการแจ้งเตือนข้อมูล เมื่อใช้คำขอ Python ฉันชอบจับข้อยกเว้นดังนี้:

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

นี่คือ renIPadress () เป็นฟังก์ชั่นที่ผู้ใช้กำหนดซึ่งสามารถเปลี่ยนที่อยู่ IP ได้หากถูกบล็อก คุณสามารถไปได้โดยไม่มีฟังก์ชั่นนี้


วิธีการแก้ปัญหาของคุณเป็นสิ่งที่ดี แต่วิธีการที่จะเปลี่ยนip-adrressในหลามคุณจะรู้อะไรเกี่ยวกับมันแล้วแจ้งให้เราทราบ
Haritsinh Gohil

1
ฉันใช้บริการ VPN IPVanish และ Hide My Ass แล้ว พวกเขาถูกกำหนดค่าโดยใช้ open-vpn และ open-vpn มีแถวคำสั่งเชลล์ต่ออายุ IP แอดเดรส คุณสามารถเรียกคำสั่ง shell หรือ bash จาก python ด้วยวิธีนี้คุณสามารถใช้มันได้
Tanmoy Datta

5

การระบุพร็อกซีในสภาพแวดล้อมขององค์กรแก้ไขได้สำหรับฉัน

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

ข้อผิดพลาดทั้งหมดคือ:

requests.exceptions.ConnectionError: HTTPSConnectionPool (โฮสต์ = 'www.google.com', พอร์ต = 80): มีการลองซ้ำเกินจำนวนสูงสุดด้วย url: / (เกิดจาก NewConnectionError (': ล้มเหลวในการสร้างการเชื่อมต่อใหม่: [WinError 10060] ความพยายามล้มเหลวเนื่องจากบุคคลที่เชื่อมต่อไม่ตอบสนองอย่างเหมาะสมหลังจากช่วงระยะเวลาหนึ่งหรือการเชื่อมต่อที่สร้างขึ้นล้มเหลวเนื่องจากโฮสต์ที่เชื่อมต่อล้มเหลวในการตอบสนอง '))


2

ฉันไม่สามารถทำให้มันทำงานบน windows ได้แม้หลังจากติดตั้ง pyopenssl และลองใช้เวอร์ชั่นไพ ธ อนต่าง ๆ (ในขณะที่มันทำงานได้ดีบน mac) ดังนั้นฉันจึงเปลี่ยนไปใช้ urllib และทำงานกับ python 3.6 (จาก python. org) และ 3.7 (anaconda) )

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

ฉันค่อนข้างรำคาญว่าสิ่งต่าง ๆ จะทำงานได้ก็ต่อเมื่อทำงานด้วยพรอมต์แอนาคอนดา
BingLi224

1

เมื่อฉันเขียนสคริปต์ทดสอบเบราว์เซอร์ซีลีเนียมฉันพบข้อผิดพลาดนี้เมื่อโทรdriver.quit()ก่อนการใช้งาน JS api call โปรดจำไว้ว่าการออกจาก webdriver เป็นสิ่งสุดท้ายที่ต้องทำ!


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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.