簡體   English   中英

如何修復請求庫中的“最大重試次數超出 url”錯誤?

[英]How to fix "Max retries exceeded with url" error in requests lib?

我編寫了一個在 AWS Lambdas 上運行的網絡爬蟲。 它每 60 分鍾運行一次。 它工作了一年,但最近我開始遇到這種錯誤:

HTTPSConnectionPool(host='www.niederglatt-zh.ch', port=443): Max retries exceeded with url: /amtlichepublikationen (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f449f63a2d0>: Failed to establish a new connection: [Errno 111] Connection refused')) 

這是我要抓取的鏈接:

https://www.niederglatt-zh.ch/amtlichepublikationen

這是我的代碼:

def sending_request(input_url):

    try:
        response = requests.get(input_url, allow_redirects=True, headers=get_random_header())
        print("Connection Response:", response, "Status Code:", response.status_code)
        if response.status_code != 200:
            time.sleep(random.randint(3, 7))
            response = requests.get(input_url, allow_redirects=True, headers=get_random_header(), verify = False, timeout=15)
            print("Connection Response - Second Try:", response)
    except:
        time.sleep(random.randint(4, 7))
        response = requests.get(input_url, allow_redirects=True, headers=get_random_header(), verify = False, timeout=15)
        print("Connection Response (verify == False):", response)    
    
    return response

我試圖用allow_redirects = True/False “玩”,用verify==True/False timeout但我總是遇到同樣的錯誤。

您可以忽略headers=get_random_header()

get_random_header()是一個從用戶代理列表中為我提供隨機用戶代理的函數。

我也有抓取活動代理的腳本:

# LIST OF FREE PROXY APIs, THESE PROXIES ARE LAST TIME TESTED 60 MINUTES AGO, PROTOCOLS: HTTP, HTTPS, SOCKS4 AND SOCKS5
proxy_url = "https://proxylist.geonode.com/api/proxy-list?limit=200&page=1&sort_by=lastChecked&sort_type=desc&speed=fast"

# EXTRACTING JSON DATA FROM THIS LIST OF PROXIES

# Sending request to API
proxy_json = requests.get(proxy_url, headers=get_random_header()).text
proxy_json = json.loads(proxy_json)
full_proxy_list = proxy_json["data"]

# CREATING PROXY DICT
final_proxy_list = []
for proxy in full_proxy_list:

    #print(proxy) # JSON VALUE FOR ALL DATA THAT GOES INTO PROXY

    # Extracting protocol, ip address and port
    protocol = proxy['protocols'][0]
    if protocol != "https":
        ip_ = proxy['ip']
        port = proxy['port']

        # Creating PROXY dict
        proxy = {protocol : protocol + '://' + ip_ + ':' + port}

        final_proxy_list.append(proxy)

我試圖將隨機代理傳遞給這樣的代碼:

response = requests.get(input_url, allow_redirects=True, headers=get_random_header(), proxies = random.choice(final_proxy_list))

但我仍然遇到同樣的錯誤。

有沒有辦法解決這個錯誤? 我應該在我的 Python 代碼中添加一些東西,還是應該在 lambdas 中改變一些東西?

謝謝 :)

如前所述,目標網絡可能已阻止您所在區域的公共 IP 地址。您的 lambda 函數將具有動態內部 IP 地址,但目標網絡看不到這些地址。 您可以在不同的地區設置您的 EXACT 應用程序,看看是否能解決您的問題。

此外,您可能需要遵循本文中提到的一些最佳實踐:

https://www.blog.datahut.co/post/web-scraping-best-practices-tips這里有一些:

  1. 要溫柔
  2. 尊重 robots.txt

您的請求似乎被某些東西阻止了。 唯一的問題是,這是您自己造成的,還是 AWS 阻止了它? 大多數時候,你自己引入錯誤,每個人都會遇到這種情況。 嘗試以下所有方法來查找原因:

  • 首先是一個簡單的命令行測試: curl -I https://www.niederglatt-zh.ch/amtlichepublikationen 應該給出狀態 200。
  • 其次,我認為這不是速率限制問題,因為您可能會返回狀態碼429
  • 例如,將您的網站替換為https://google.com ,響應應該會成功。
  • 在您的域名中添加一些額外的隨機字符,然后重試,您應該會收到類似“無法解析主機”的錯誤。
  • https://ifconfig.me發出請求,響應應該成功並帶有 lambda 的出站 IP 地址。
  • 如果上述任何一項失敗,我會尋找網絡配置的方向(如果存在)。 是有關如何配置 lamdas 和 VPC 的詳細指南。
  • 您最近是否對 Lambda 的網絡配置進行了任何更改?
  • 嘗試在本地運行代碼,我想你已經這樣做了。 我自己嘗試過,它成功了。
  • 作為最后的手段,重新部署一個新的干凈的 Lambda(到另一個區域)。 只有在所有其他步驟都沒有成功的情況下,因為您可能無法從中找到確切的根本原因。

另外,查看您的代碼,我建議使用 requests 包中的重試機制。 如果您需要調試,這使代碼更容易理解。 請參見以下示例:

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

retry_strategy = Retry(
  total=3,
  backoff_factor=1
)
adapter = HTTPAdapter(max_retries=retry_strategy)
http = requests.Session()
http.mount("https://", adapter)
http.mount("http://", adapter)

response = http.get("https://www.niederglatt-zh.ch/amtlichepublikationen")

這很可能是由提供程序阻止爬網嘗試引起的。 通常,他們可能已經查看了他們的日志,並注意到了爬蟲程序的嘗試並阻止了您的 IP。 或者他們可能已經配置了某種形式的防火牆。 查看主機的條款和條件,看看是否有任何關於爬網或機器人網站的內容。 您可以嘗試的一件事是移動到不同的區域並嘗試爬網,如果它成功則它是一個 IP 塊。 希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM