Sayfanın olup olmadığını kontrol etmek

Merhabalar,

Bir web sitesinin var olup olmadığını Python ile nasıl kontrol edebiliriz?

1 Beğeni
import requests
from requests.exceptions import ConnectionError

try:
    request = requests.get('http://www.example.com')
except ConnectionError:
    print('Web site does not exist')
else:
    print('Web site exists')

Merhaba, eğer internet kapalı iken yazbel sitesinden senin kodla veri çekmeye çalışırsak yine site oluşmadı bastırmaz mı? Üstelik yazbel sitesi varken? Sadece bir soru benimki. Ama sanırım senin algoritma patlar.

Burada sanırım InvalidUrl diye bir şey var. Bilgisayarı açınca bir bakayım.

1 Beğeni

Hıımm, evet, algoritma patladı.

İnternet varken:

İnternet yokken:

Öyleyse algoritma aşağıdaki gibi olmalı zannımca.

  1. İnternet bağlantısının olup olmadığını test et.
  2. İnternet bağlantısı varsa kendi kodunu(mümkünse başka bir kod. Çünkü bu kod buglarla dolu. Aşağıda açıklayacağım.) çalıştır.

İnternet bağlantısını kontrol eden şu kod çok hoşuma gitti.

import socket
ipaddress=socket.gethostbyname(socket.gethostname())
if ipaddress=="127.0.0.1":
    print("You are not connected to the internet!")
else:
    print("You are connected to the internet with the IP address of "+ ipaddress )

Açıklamaya gelince:

pastebin.com Türkiye’de yasaklı bir sitedir. Senin kodları bunun için de denedim. Uzun bir süre bekledikten sonra 'Web site does not exist' bastırdı.

2 Beğeni

İnternete bağlı olup olmadığını zaten kontrol ediyorum. Cevabınız, uğraşınız ve ilginiz için teşekkür ederim.

1 Beğeni

Paylaştığınız kod bende çalışmadı. İnternet bağlantısı olsa da olmasa da aynı sonucu döndürüyor.

Şu daha uygun bir örnek gibi

import socket

def internet(host="8.8.8.8", port=53, timeout=3):
    """
    Host: 8.8.8.8 (google-public-dns-a.google.com)
    OpenPort: 53/tcp
    Service: domain (DNS/TCP)
    """
    try:
        socket.setdefaulttimeout(timeout)
        socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
        return True
    except socket.error as ex:
        print(ex)
        return False

internet()
1 Beğeni

Ben de bu kodu paylaşmadan önce bir araştırma yaptım internette. Sonra bu kodu bulup kendi bilgisayarımda çalıştırdıktan sonra paylaşmıştım. Bende çalışıyordu. Bu alana vakıf değilim. Sizin yazdığınız daha doğru olabilir. Bu arada ikimizin attığı kod da aynı posta ait

edit: attığınız koddaki yorum satırlarına bakınca bu koda güçlü bir şekilde inanmaya başladım.

1 Beğeni

Konuya pek aşina değilim ama, belki şu kodlar işe yarayabilir:

 |
V

import requests
from requests.exceptions import InvalidURL

try:
    request = requests.get('http://www.example.com')
    print('Web site exists')
except InvalidURL:
    print('Web site does not exist')
else:
    print('Unknown error')

Not: Kodu deneme fırsatım olmadı ve internet bağlantısı için bir except bloku daha eklenebilir.

InvalidURL’i de konrtrol ediyorum :joy:

Yine de ilgin, uğraşın ve cevabın için teşekkür ederim.

Bu arada kendi yazdığım kodları yazmak için ne kadar uğraşsam da sizin attıklarınız daha stabil ve kısa. Ayrıca anlaşılabiliritesi yüksek. Bu yüzden sizin cevaplarınızı projenin içine dahil ettim. Emeği geçenler listesinde isminiz var :slight_smile:

Konuyu tekrar gündeme getirmek zorundayım.

Kendimce bir uygulama güncelleme projesi geliştirmekteyim. Bu proje aslında GitHub sayfasının olup olmadığını kontrol edecekti. Ancak internet bağlantısının olmaması da ayrı bir sorun olurdu. Bunu gündeme getirdiğiniz için teşekkür ederim @Cihat_Altiparmak.

Yazdığım kodlar bir modüle ait, yani siz de modül şeklinde kullanmalısınız. Şu kodları uptodater.py olarak kaydedin :

# -*- coding: utf-8 -*-


"""
Who Contributed

gncmnc <https://github.com/gncmnc>
Samet195 <https://github.com/Samet195>
CihatAltiparmak <http://github.com/CihatAltiparmak>
"""

import requests, socket
from requests.exceptions import ConnectionError
from requests.exceptions import InvalidURL
from colorama import Fore, init

init(autoreset=True)

class Uptodater():
    def github_informations(github_link, version, version_file):
        try:
            request = requests.get(github_link)
        except ConnectionError:
            ipaddress=socket.gethostbyname(socket.gethostname())
            if ipaddress=="127.0.0.1":
                print(Fore.RED + "You are not connected to the internet!")
            else:
                pass

        else:
            print(Fore.LIGHTGREEN_EX  + "GitHub address : " + github_link) 
            
        print(Fore.LIGHTGREEN_EX + "This version : " + version)
        print(Fore.LIGHTGREEN_EX + "Version file to search : " + version_file)

    def connect(version, version_file):
        try:
            pass

        except InvalidURL:
            pass

        except ConnectionError:
            pass
        
        def compare(version, version_file):
            pass

    def uptodate():
        pass

Ve aynı dizine herhangi bir Python dosyası oluşturup şu kodları yazın :

from uptodater import Uptodater

Uptodater.github_informations(github_link = "https://github.com/gncmnc/deneme", version = "1.0", version_file = "version.txt")
input()

(Version & version file değişkenlerini başka bir konuda modülün tanıtımını yaparken göstereceğim, şimdilik pek bi önem arz etmiyorlar.)

Eğer internet varken son yazdığımız kodları çalıştırırsak şu çıktıyı elde ediyoruz :

İnternet bağlantısını kesersek şöyle oluyor :

yazbel2

Yani internet bağlantısının olup olmadığı düzgünce kontrol edilebiliyor.

Ben, asıl sorunuma, sayfanın olup olmamasına bakmak istiyorum. Ancak kodları nereye yazacağım hakkında bir bilgim yok. Bu konuda yardımcı olabilir misiniz?

1 Beğeni

O zaman küçük bir katkıda bulunayım. SOLID prensiplerinden birincisi der ki;

Her metot, fonksiyon veya sınıfın sadece bir görevi olmalıdır (single responsibility)

Öyleyse sizin yazdığınız şu koda bakalım.

class Uptodater():
    def github_informations(github_link, version, version_file):
        try:
            request = requests.get(github_link)
        except ConnectionError:
            ipaddress=socket.gethostbyname(socket.gethostname())
            if ipaddress=="127.0.0.1":
                print(Fore.RED + "You are not connected to the internet!")
            else:
                pass

Burada github_informations() metodunun amacı github bilgileri almak sanırım. Ama içerisinde internet bağlantısının olup olmadığı da kontrol ediliyor. Öyleyse bu metot amacı dışında bir iş yapmış oluyor.

Yapılması gereken, internet bağlantısının kontrolünü başka bir sınıf, fonksiyon altında yaparak bu işlemi github_informations() metodundan koparmak. Sonra ya decorator ya da basit bir if-else ile github_informations() metoduna eklemek

Ben decorator ile yapmayı tercih ettim. Gayet temiz bir görüntü oluştu bence.

def with_internet(func):
	TIMEOUT = 3
	HOST = "8.8.8.8"
	PORT = 53

	def wrapper(*args,**kwargs):
	    try:
	        socket.setdefaulttimeout(TIMEOUT)
	        socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((HOST, PORT))
	        return func(*args,**kwargs)
	    except socket.error as ex:
	        print(ex)
	        sys.exit(1)

	return wrapper

Şimdi bunu Uptodater sınıfımızdaki github_informations() metoduna ekleyelim

class Uptodater():

	@with_internet
	def github_informations(github_link, version, version_file):
		print(Fore.LIGHTGREEN_EX  + "GitHub address : " + github_link)     
		print(Fore.LIGHTGREEN_EX + "This version : " + version)
		print(Fore.LIGHTGREEN_EX + "Version file to search : " + version_file)
2 Beğeni

Hayır, aslında linkin olup olmadığını kontrol edecek. Yine de hatalı oluyor dediğiniz gibi.

Onu connect adlı fonksiyonun altına yazacağım, ancak internet bağlantısının kontrolü önceden yapılmazsa GitHub bilgilerinin kontrolü yapılırken sayfa olsa bile yok diye çıktı verir internetin olmadığı zamanlarda.

Yine de fonksiyonun adından bir şeyler anlaşılabilmesi iyi oldu, birkaç saat isim düşünmeme değmiş :joy:

Bunu tam olarak nereye yazmalıyım?

İnternet bağlantısı başka, github linkinin olup olmadığını kontrol etmek başka bir iş. İnternet bağlantısı var ama kullanıcı olmayabilir.

Uptodater sınıfının görebileceği herhangi bir yere

1 Beğeni