requests.exceptions.ConnectionError: HTTPSConnectionPool

herkese merhaba arkadaşlar. bir program yapmaya çalışıyorum. programın mantığı url listesindeki tüm url adreslerine request atıp response içindeki bilgileri kontrol etmem gerekiyor. Fakat url listemin içinde hem http hemde https protokolü kullanan siteler var. bu yüzden şöyle bir hata ile karşılaşıyorum

Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "hunter.py", line 14, in requesthome
    request_time = requests.get(domain,verify = True)
  File "/usr/local/lib/python3.7/dist-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 668, in send
    history = [resp for resp in gen] if allow_redirects else []
  File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 668, in <listcomp>
    history = [resp for resp in gen] if allow_redirects else []
  File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 247, in resolve_redirects
    **adapter_kwargs
  File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/requests/adapters.py", line 514, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='account-cn-prod.ec2-ap-northeast-1.ap1.svc.ubnt.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError("hostname 'account-cn-prod.ec2-ap-northeast-1.ap1.svc.ubnt.com' doesn't match 'account-cn.ubnt.com'")))

bu bir ssl sertifika hatası. python3.7 kullanıyorum. internette biraz araştırma yaptım ve requests yollarken verify = False seçeneğini eklem gerektiğini öğrendim.

r = requests.get(domain, verify = False)

fakat bu şekilde yaptığım da , şöyle bir hata alıyorum.

/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py:851: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)

biraz daha araştırma yaptım. bir yerde urllib3 modülünü içeri aktarıp şu komutu yazmamızı istemiş

import urllib3
urllib3.disable_warnings()

fakat bunu da yaptığım da şöyle bir hata alıyorum (ilk hata ile aynı hata)

raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='unifi-sdn.dev.ui.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f1e3cf324d0>: Failed to establish a new connection: [Errno -2] Name or service not known'))

lütfen birileri yardımcı olabilir mi ? linux kullanıyorum ve python sürümü 3.7.3

Kodundaki raise ConnectionError(e, request=request) satirini silersen hata gider.

Veya belki print("requests.exceptions.ConnectionError: HTTPSConnectionPool(host='unifi-sdn.dev.ui.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f1e3cf324d0>: Failed to establish a new connection: [Errno -2] Name or service not known'))") seklinde bir satir vardir, o zaman o satiri sil cunku hata oradan geliyor.

Bu arada hatalar ayni degil.

bölyle bir satır kodlar arasında yok ki

raise ConnectionError(e, request=request)

işte arkadaşlar gerçek kod.

import requests
import threading
import re

def gonder(domain):
    
    r = requests.get(domain)
    bul = re.findall("zaman", r.text) #regex ile response içinde zaman kelimelerini bulmaya çalışıyoruz

    #eğer zaman kelimesini regex ile bulduysak ekrana yazdırıyoruz
    if bul:
        print(bul)
    
if __name __ == "__main__":
    liste = list()
    with open("url_list.txt", "r", encoding = "urf-8") as file: #url listesini açıyoruz
        file = file.readlines():
        
        for i in file:
            i = i.rstrip()

            if i:
                liste.append(i) #url listesindeki tüm url adreslerini listeye ekliyoruz
    
	for loop in liste:
		speed = threading.Thread(target = gonder, args = (loop,))
                #thread ile url adreslerini fonksiyona gonderiyoruz
		speed.start()
		speed.join()



şimdi ben şundan şüpheleniyorum. Mesala tarayıcıda https protokolü kullanan bir siteyi açtığınızda google kırmızı bir sayfa ile güvenlik uyarısı verir. Bu uyarı hedef sitenin sertifikası ile alakalıdır. yinede devam etmek istiyorsanız tıklayın gibi bir yazı olur. url listesi içinde bu tarzda olan url adresleri de var. requests yolladığımda bunun bir zararı mı var diye düşünüyorum. bir arkadaş da head ile bunu yap dedi ama tam emin değilim. yardımcı olursanız çok makbule geçer.

Ben nereden bilebilirdim ki :slight_smile:

Kodda bir sorun goremedim. Baslatilan Thread’in hemen join edilmesi Thread kullanimini manasiz hale getiriyor (o uc satir gonder(loop) ile degistirilebilir) ama bu bir problem degil.


Sorun url_list.txt’de unifi-sdn.dev.ui.com gibi var olmayan domain’ler olmasi. Alinan (son) hata da bunu yansitiyor; HTTPS veya sertifikalarla bir alakasi yok.

Ilk hatanin analizi de dogru bu arada. Sadece InsecureRequestWarning hata degil, uyari.

1 Beğeni

Gezdiginiz butun sitelerin listesini Google’a yollamayan bir tarayici (Firefox) kullanmanizi tavsiye ediyorum.

Sertifikada herhangi bir problem oldugunda cikar, evet. Bu arada bu uyarilarin tamami HTTPS kullanmayan butun siteler icin gecerli, ama henuz cikmiyorlar.

Kime, nasil bir zarar dusunuyorsun? Dedigim gibi, uyarilari gozardi etmek HTTP kullanmaktan farkli degil.

Ozaman nasıl bir çözüm bulmam gerekiyor. Dediğin gibi sitelerden kaynaklı birşey olablr. Mesala try except tarzı birşeyler yapsak,

Bide url listesi içinde bulunan sitelerin protokollerindeki yanlışlık buna sebebiyet verebilir. Mesala http sitenin url adresinin https ile başlaması gibi.

Request atarken sadece site adını yazıp requests yollayabileceğim bir yöntem varmı. Yani requests sitenin protokolünü kendi anlayacak ve site isminin başına http veya https ekleyip öyle request gönderecek?

Olur, ConnectionError’i catch edebilirsin. Muhtemelen icindeki exception’lara da bakip NewConnectionError’a ulasmanin bir yolu da vardir. (Bir Python klasigi olarak dokumentasyonda yok, deneyip bulmak lazim.)

Evet. HTTP olup HTTPS yoksa “connection refused” gibi bir hata gelir muhtemelen. Tam tersi oldugunda HTTP site HTTPS’e yonelten 301 donduruyor genelde.

Var, “4 satir kod yazmak” dedigimiz bir yontem var :stuck_out_tongue:

Yukarida dedigin gibi try/catch ile yapabilirsin.

Peki sağol…

@aib seni tekrar rahatsız ediyorum. kusura bakma. bu python beni deli etmeye başladı. python’ın artık stabil bir yazılım dili olmadığı düşüncesine kapıldım. şimdi de print problemim var. kod bloklarını if lerle sağ doğru kaydırdıkça , terminal ekranındakii print çıktısıda ekranın sağında çıkmaya başladı

def bastır(isim):
    if isim != "kemal":
        if len(isim) <= 20:
            if isim.startswith("k"):
                print(isim)

if __name__ == "__main__":
    bastır("kenan")

şimdi yukarıdaki fonksiyon içinde bulunan if leri görüyorsun. her if kullandığımda sağa doğru kaymış. buraya kadar problem yoktur. fakat ben bu programı terminal den çalıştırdığımda kenan terminalin sağ tarafında ekrana basılıyor. yani çıktı da if bloglarına göre sağa doğru kaymış bir şekilde çıkıyor.

olması gereken çıktı:

kenan

terminal ekranında görünen çıktı:

                    kenan

gördüğün gibi uç birim ekranında çıktı bu şekilde görünüyor. bunu ne yapmam gerekiyor düzeltmek için ???

Pardus 19 işletim sisteminde Geany editöründe kodunuzu denedim. bastır isimli fonksiyonunuzu bastir olarak değiştirip çalıştırdım kenan çıktısı en solda göründü. Sıkıntı olmadı.

O sadece sorunumu anlamanız için bire bir kopya kod. Yani gerçek kod bundan farksız ama yukarıdaki kod değil

Python’da boyle bir sorun olmasi mumkun degil. Sorun bariz bir sekilde terminalde veya programin geri kalaninda, fakat programin geri kalaninin kodlarini paylasmadigin icin buradan bir sey soyleyemiyoruz.

Insanlik/kulturel olarak dusuk kaliteli yazilimlara alismis olabiliriz, fakat programlama dillerinden, daha dogrusu 20+ senelik ve milyonlarca insanin kullandigi programlama dillerinden ayni kalitesizligi beklemek yanlis olur.

Hakikaten dilde hata oldugunu dusunuyorsan @Muallim’in ve benim kendi makinemizde gorebilecegimiz sekilde hatayi gosteren bir kod parcasi paylas, hatayi bulup patch’leyelim, Python’a katkimiz bulunmus olsun.

@aib al buyur…


import threading
import requests
import argparse
import textwrap
import urllib3
import re

def requesthome(domain):
	liste = list()
	regex = "paypal.com"

	urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
	header = {'user-agent': 'my-app/0.0.1'}
	request_time = requests.get(domain,headers = header,verify = False)

	bucket = re.findall(regex,request_time.text)

	if bucket:
		for i in bucket:
			if i.find("*.") == -1:
				if not i in liste:
					liste.append(i)
					print("""

					Request Url : {}

					Found Url : {}

					""".format(request_time.url,i))



	


if __name__ == "__main__":
	ap = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
                             description=textwrap.dedent("""\
                             
                             How To Use Hunter
                             -----------------
                             
                             python3 hunter.py --url-list links.txt

                             """))
	ap.add_argument("-u", "--url", required = True, metavar="", help = "path of url list")
	ap.add_argument("-v", "--version",action = "version",version="Hunter v1.0", help = "Version info")
	args = vars(ap.parse_args())

	URL_LIST = list()
	
	with open(args["url"], "r", encoding = "utf-8") as file:
		file = file.readlines()
		
		for _url_ in file:
			_url_ = _url_.rstrip()

			if _url_:
				URL_LIST.append(_url_)			

	for loop in URL_LIST:
		speed = threading.Thread(target = requesthome, args = (loop,))

		speed.start()
		speed.join()

işte buda terminal çıktısı… if bloklarını daha da uzatırsam çıktı daha da sağa gidiyor.

@aib çıktıyıı düzeltim ama kafam karıştı ? if blogu içindeki print işlemini şu şekilde yaptım. bu şekilde nasıl yanlış olmuyor aklım karıştı?


def requesthome(domain):
	liste = list()
	regex = "paypal.com"

	urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
	header = {'user-agent': 'my-app/0.0.1'}
	request_time = requests.get(domain,headers = header,verify = False)

	bucket = re.findall(regex,request_time.text)

	if bucket:
		for i in bucket:
			if i.find("*.") == -1:
				if not i in liste:
					liste.append(i)
					print("""

Request Url : {}

Found Url : {}

					""".format(request_time.url,i))

requests url ve found url 'yi def requesthome hizasına getirdim. bu şekilde hata vermesi gerekmezmiydi?

yukarıdaki program ile url adreslerine requests atarken aldığım hatalar :

Exception in thread Thread-150:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 159, in _new_conn
    (self._dns_host, self.port), self.timeout, **extra_kw)
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 57, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 354, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python3.7/http/client.py", line 1244, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.7/http/client.py", line 1290, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.7/http/client.py", line 1239, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.7/http/client.py", line 1026, in _send_output
    self.send(msg)
  File "/usr/lib/python3.7/http/client.py", line 966, in send
    self.connect()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 181, in connect
    conn = self._new_conn()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 168, in _new_conn
    self, "Failed to establish a new connection: %s" % e)
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fd8d81e9210>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 398, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='www.paypal-orbislibrary.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fd8d81e9210>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "test.py", line 18, in requesthome
    request_time = requests.get(domain,headers = header,verify = False, timeout = 3)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 516, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='www.paypal-orbislibrary.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fd8d81e9210>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))

Exception in thread Thread-161:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 384, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 380, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.7/http/client.py", line 1336, in getresponse
    response.begin()
  File "/usr/lib/python3.7/http/client.py", line 306, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.7/http/client.py", line 267, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/lib/python3.7/socket.py", line 589, in readinto
    return self._sock.recv_into(b)
  File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 307, in recv_into
    raise timeout('The read operation timed out')
socket.timeout: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 367, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/usr/lib/python3/dist-packages/six.py", line 693, in reraise
    raise value
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 386, in _make_request
    self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 306, in _raise_timeout
    raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='www.paypal.com', port=443): Read timed out. (read timeout=3)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "test.py", line 18, in requesthome
    request_time = requests.get(domain,headers = header,verify = False, timeout = 3)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 668, in send
    history = [resp for resp in gen] if allow_redirects else []
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 668, in <listcomp>
    history = [resp for resp in gen] if allow_redirects else []
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 247, in resolve_redirects
    **adapter_kwargs
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 529, in send
    raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='www.paypal.com', port=443): Read timed out. (read timeout=3)

çıktıyı """ """ arasına yazıyorsun """ açtığında bu kapanma işaretini görene kadar bıraktığın tüm boşlukları kullanacaktır şaşırılacak bir durum görmüyorum ben burada ?

1 Beğeni

Haklısın ama ben onu fonksiyondaki bloklara göre kullanablyrz sanyrdum.

Kanıtınız var mı?