Python Kullanarak Herkese Açık GitHub Depoları Nasıl Kazınır?

Yorumlar: 0

Bu makalede, Python kullanarak GitHub depolarının nasıl kazınacağını analiz edeceğiz. BeautifulSoup ve Requests gibi iyi bilinen kütüphaneleri inceleyeceğiz ve GitHub kazıma betiğini oluştururken ayrıntılı bir açıklama yapacağız, böylece kolayca takip edebilirsiniz.

Neden GitHub depoları kazınıyor?

Github kazıma nedir ve ne için kullanılır? Kullanmak için çok sayıda amaç vardır, ancak en sık kullanılanlar şunlardır:

  • Teknolojik gelişmeleri izlemek için. Yıldızları ve depoları izlemek, programlama dilleri, çerçeveler ve kütüphanelerle ilgili eğilimleri takip etmenin harika bir yoludur. Bu bilgiler, teknolojilerin uygulanması, beceri geliştirme veya kaynak tahsisi ile ilgili kararlar almak söz konusu olduğunda çok önemli olabilir.
  • Bir programlama havuzundan yararlanmak. GitHub'da çok sayıda açık kaynaklı proje, örnek ve çözüm bulunabilir. Bu nedenle, eğitim amaçlı, programlama becerilerini geliştirmek ve teknoloji uygulamasını anlamak için yararlı olan büyük miktarda programlama bilgisi ve tekniği platformda kolayca mevcuttur.

GitHub yalnızca depolar için barındırma sunmakla kalmaz, aynı zamanda büyük bir kullanıcı tabanına sahiptir ve büyük bir üne sahip olmaları onları güvenilir bir seçenek haline getirir.

GitHub'da depolanan bilgiler, teknolojinin ilerleme modellerini izlemenin yanı sıra yazılımın geliştirilmesinde de faydalıdır. Bu bilgiler, bilgi teknolojisi dünyasındaki rakiplere ayak uydurmak için kritik öneme sahiptir.

GitHub'ı Kazımak için Temel Kütüphaneler ve Araçlar

Bir web sayfasını kazımak söz konusu olduğunda, kütüphaneleri ve modülleri çok fazla olduğu için çalışılması en kolay dil Python'dur. Python'u Github'a kazımak için aşağıdaki modüllerin eklenmesi gerekir:

  • requests: HTTP isteklerini ve cevaplarını tutan ve en çok kullanılan istemci lib.
  • BeautifulSoup: Verilerde gezinme ve veri alma söz konusu olduğunda gelişmiş özelliklerle birlikte geldiği için HTML'den ayrıntıların çıkarılması söz konusu olduğunda sofistike.
  • Selenium: gerçek bir tarayıcı başlatır ve sayfanın öğelerine tıklamayı ve yazmayı sağlar.

Bu, Github kazıma araçları kullanılarak çok kolay bir şekilde yapılabilir. Ancak, bunu nasıl yapacağımızı detaylandıralım.

Beautiful Soup ile GitHub Depo Kazıma Komut Dosyası Oluşturma

Bu bölümde Github depolarının nasıl kazınacağı gösterilecektir. Kazıyıcı yapımındaki önemli adımlar şunlardan oluşur:

  1. Set tabanının oluşturulması - Python ve ilgili kütüphanelerin indirilmesini gerektirir.
  2. GitHub sayfasının HTML kodunun kaydedilmesi.
  3. Gerekli öğeleri belirlemek için sayfanın düzenini incelemek.
  4. Diğer şeylerin yanı sıra hesap adlarını, açıklamalarını ve kazanılan yıldız miktarını almayı içeren bilgi toplama.
  5. Dosya sistemi türlerine veri depolama.

Şu andan itibaren, tüm bu adımlar için ayrıntıları, tam olarak oluşturulmuş bir Github kazıma betiği ile birlikte paylaşacağız.

Adım 1: Python Proje Ortamınızı Kurma

Makinenizde Python olduğundan emin olun. Ardından, Github'ı kazıma işlemine başlamak için yeni bir Python sanal ortamı oluşturun.


python -m venv github_scraper
source github_scraper/bin/activate  # MacOS ve Linux için
github_scraper\Scripts\activate     # Windows için

Adım 2: Gerekli Python Kütüphanelerinin Kurulması

Daha önce de söylediğimiz gibi, BeautifulSoup ve Requests GitHub depolarını kazımak için yardımcı olacaktır. Şu anda etkinleştirilmiş sanal ortamda, bunları proje bağımlılıklarınıza dahil etmek için bu komutu çalıştırın:


pip install beautifulsoup4 requests

Adım 3: Hedef GitHub Sayfasına Erişme ve İndirme

Github kazıma işlemini gerçekleştirmek istediğiniz herhangi bir depoyu seçin. İlk olarak, bağlantıyı bir değişkende tanımlayın, ardından sayfa kodunu alacak bir HTTP isteği yapın.


url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)

Adım 4: HTML Yapısını Anlama ve Ayrıştırma

HTML'nizi analiz etmek için, onu BeautifulSoup'a beslersiniz.


soup = BeautifulSoup(page.text, 'html.parser')

BeautifulSoup() yapıcısına iki şey sağlanmalıdır.

  1. page.text değişkeninde saklanan HTML içeriğini içeren bir dize.
  2. Beautiful Soup'un kullanacağı ayrıştırıcı: "html.parser" yerleşik Python HTML ayrıştırıcısının adıdır.

HTML, BeautifulSoup tarafından ayrıştırılacak ve bir ağaç yapısı oluşturulacaktır. Daha spesifik olarak, soup değişkeni DOM ağacından ilgili öğeleri seçmek için gereken tüm yöntemleri içerir:

  • find(): sağlanan seçici stratejisine karşılık gelen ilk HTML öğesini döndürür.
  • find_all(): girdi seçici stratejisiyle eşleşen HTML öğelerinin bir listesini döndürür.
  • select_one(): girdi CSS seçicisiyle eşleşen ilk HTML öğesini döndürür.
  • select(): sağlanan CSS seçicisine karşılık gelen HTML öğelerinin bir listesini döndürür.

Adım 5: İlgili Veriler için Hedef Sayfayı Analiz Etme

İşte bir başka önemli adım: basit HTML öğelerini seçmek ve bunlardan Github verilerini kazımak. Bu adım aslında Python Github depoları betiğini yazmadan önce gelir.

Github'ı kazımadan önce, web sayfasının kendisini tanıyın. Bundan sonra, F12'ye tıklayarak geliştirici araçlarını açın. Artık kodu açtığınıza göre, sayfadaki birçok öğenin uygun öğeye gitmeyi kolaylaştıracak benzersiz sınıflara veya niteliklere sahip olmadığını fark edeceksiniz. Sayfayı gözden geçirin ve verileri ayıklamaya hazırlanın.

Adım 6: Depo Ayrıntılarını Çıkarma

Şimdi GitHub depolarını kazımak için bize yardımcı olacak bir Python betiği oluşturmaya hazırız. Bu betik, GitHub'da depolanan yıldızlar, açıklamalar, son taahhütler vb. gibi yararlı bilgileri çıkarabilir. Bunun için gerekli özellikleri belirtmemiz ve ilgili metin değerlerini almamız gerekir.

  • Depo adı:
    
    repo_title = soup.select_one('[itemprop="name"]').text.strip()
    

    itemprop="name" özniteliğinin benzersiz bir kimliği olan bir öznitelik değeri vardır, bu nedenle onu alırız. GitHub'daki metin alanları genellikle boşluk ve satırsonu karakterleri içerir ve strip() kullanılarak temizlenebilir.

  • Şu anki şube:
    
    git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
    

    Ana dalın başlığını taşıyan HTML bileşenini seçmenin daha basit bir yöntemi olmadığına dikkat edin. Ne yapabilirsiniz? Benzersiz bir sınıf seçin ve metni alın.

  • Son taahhüt:
    
    relative_time_html_element = soup.select_one('relative-time')
    latest_commit = relative_time_html_element['datetime']
    

    Kullanıcı tarafından yapılan son işlemin depolandığı göreli zaman etiketinin zaten seçili olduğunu ve tarihin datetime aracılığıyla seçildiğini fark ettik.

Sol tarafta bulunan bilgileri toplayın: açıklama, yıldızlar, görünümler, çatallar.

  • Açıklama:
    
    bordergrid_html_element = soup.select_one('.BorderGrid')
    about_html_element = bordergrid_html_element.select_one('h2')
    description_html_element = about_html_element.find_next_sibling('p')
    description = description_html_element.get_text().strip()
    
  • Yıldızlar:
    
    star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
    stars_html_element = star_icon_html_element.find_next_sibling('strong')
    stars = stars_html_element.get_text().strip().replace(',', '')
    
  • Görüşler:
    
    eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
    watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
    watchers = watchers_html_element.get_text().strip().replace(',', '')
    
  • Çatallar:
    
    fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
    forks_html_element = fork_icon_html_element.find_next_sibling('strong')
    forks = forks_html_element.get_text().strip().replace(',', '')
    

Adım 7: Benioku Dosyalarının Toplanması ve Analiz Edilmesi

Benioku dosyası çok önemlidir. Depoların açıklamalarını ve kodun nasıl uygulanacağına ilişkin talimatları sağlar. Benioku.md dosyasını kontrol etmeniz durumunda, hangi bağlantıya sahip olduğunu fark edebilirsiniz:


https://raw.githubusercontent.com///readme.md

'ye sahip olduğumuzdan, bir f dizesi kullanarak URL'yi programlı olarak oluşturabilir, kullanabilir ve dosya kodunu almak için bir HTTP isteği yapabiliriz.


readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)

readme = None
if readme_page.status_code != 404:
    readme = readme_page.text

Deponun bir benioku dosyası yoksa GitHub 404 web sayfasının içeriğini kaydetmeyi önlemek için 404 hatasını kontrol etmeyi unutmayın.

Adım 8: Kazınan Verilerin Verimli Bir Şekilde Düzenlenmesi ve Depolanması

Tüm bilgiler tek bir sözlükte saklanacaktır, böylece bunları kolayca bir JSON dosyasına yazabiliriz.


repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme

Adım 9: Kazınan Verileri JSON Formatında Dışa Aktarma

Verileri analiz etmek ve JSON formatında saklamak için yerleşik Python kütüphanesinden yararlanacağız, çünkü bizim durumumuzda olduğu gibi makalelerin listeleri olduğunda iç içe geçmiş yapılar için mükemmeldir.


with open('github_data.json', 'w', encoding='utf-8') as json_file:
  json.dump(repo, json_file, ensure_ascii=False, indent=4)

Adım 10: Tüm Adımları Eksiksiz Bir Senaryoya Entegre Etme


import json
import requests
from bs4 import BeautifulSoup

url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")

repo_title = soup.select_one('[itemprop="name"]').text.strip()

# şube
main_branch = soup.select_one(
   '[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()

# son taahhüt
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']

# açıklama
bordergrid_html_element = soup.select_one('.BorderGrid')
about_html_element = bordergrid_html_element.select_one('h2')
description_html_element = about_html_element.find_next_sibling('p')
description = description_html_element.get_text().strip()

# yıldızlar
star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
stars_html_element = star_icon_html_element.find_next_sibling('strong')
stars = stars_html_element.get_text().strip().replace(',', '')

# i̇zleyi̇ci̇ler
eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
watchers = watchers_html_element.get_text().strip().replace(',', '')

# çatallar
fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
forks_html_element = fork_icon_html_element.find_next_sibling('strong')
forks = forks_html_element.get_text().strip().replace(',', '')

# readme
readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)

readme = None
if readme_page.status_code != 404:
   readme = readme_page.text

repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme

with open('github_data.json', 'w', encoding='utf-8') as json_file:
   json.dump(repo, json_file, ensure_ascii=False, indent=4)

Github'ı kazıma: Sonuç

BeautifulSoup ve Requests yardımıyla depolar için bir GitHub kazıma betiği oluşturma sürecini inceledik. Artık web sayfalarına nasıl erişeceğinizi, ilgili verileri nasıl çekeceğinizi ve bunları kullanıcı dostu bir şekilde nasıl kodlayacağınızı biliyorsunuz. Bu tür beceriler, iyi bilinen projeleri analiz etmede, koddaki değişiklikleri izlemede veya rapor oluşturmada yararlı olacaktır.

Bununla birlikte, mantıklı kullanım için özen gösterin. Çoğu zaman, GitHub'da çalışmak için daha basit ve daha pratik olacak bir API kullanılabilir. Web kazıma yapmaya karar verirseniz, sitenin yönergelerine uyduğunuzdan ve sunucuları çok fazla istekle bombalamadığınızdan emin olun.

Yorumlar:

0 yorumlar