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.
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:
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.
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:
Bu, Github kazıma araçları kullanılarak çok kolay bir şekilde yapılabilir. Ancak, bunu nasıl yapacağımızı detaylandıralım.
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:
Ş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.
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
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
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)
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.
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:
İş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.
Ş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.
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.
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.
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.
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()
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(',', '')
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(',', '')
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(',', '')
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.
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
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)
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)
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