[英]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這里有一些:
您的請求似乎被某些東西阻止了。 唯一的問題是,這是您自己造成的,還是 AWS 阻止了它? 大多數時候,你自己引入錯誤,每個人都會遇到這種情況。 嘗試以下所有方法來查找原因:
curl -I https://www.niederglatt-zh.ch/amtlichepublikationen
。 應該給出狀態 200。429
。另外,查看您的代碼,我建議使用 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.