Pada artikel ini, kita akan membahas cara mengikis repositori GitHub menggunakan Python. Kami akan mengulas library terkenal seperti BeautifulSoup dan Requests dan memberikan penjelasan mendetail sambil membuat skrip scraping GitHub agar Anda dapat mengikutinya dengan mudah.
Apa itu pengikisan Github dan untuk apa? Ada banyak tujuan untuk menggunakannya, tetapi yang paling sering termasuk:
GitHub tidak hanya menawarkan hosting untuk repositori, tetapi mereka memiliki basis pengguna yang sangat besar, dan reputasi yang hebat menjadikannya pilihan yang dapat diandalkan.
Informasi yang tersimpan di GitHub berguna untuk melacak pola perkembangan teknologi serta meningkatkan pengembangan perangkat lunak. Informasi ini sangat penting untuk bersaing dengan kompetitor di dunia teknologi informasi.
Dalam hal scraping halaman web, bahasa yang paling mudah digunakan adalah Python, karena pustaka dan modulnya sangat banyak. Untuk melakukan scraping Python di Github, modul-modul berikut ini harus ditambahkan:
Hal ini dapat dilakukan dengan sangat mudah dengan menggunakan alat pengikisan Github. Namun, mari kita bahas lebih lanjut tentang cara melakukannya.
Bagian ini akan menunjukkan cara mengikis repositori Github. Langkah-langkah penting dalam membuat pengikis terdiri dari:
Mulai sekarang, kami akan membagikan detail untuk semua langkah ini bersama dengan skrip Github scraping yang sudah jadi.
Pastikan Anda memiliki Python di komputer Anda. Selanjutnya, buatlah lingkungan virtual Python baru untuk memulai proses scraping Github.
python -m venv github_scraper
source github_scraper/bin/activate # Untuk MacOS dan Linux
github_scraper\Scripts\activate # Untuk windows
Seperti yang kami katakan sebelumnya, BeautifulSoup dan Requests akan membantu untuk mengikis repositori GitHub. Di lingkungan virtual yang sedang diaktifkan, jalankan perintah ini untuk memasukkannya ke dalam dependensi proyek Anda:
pip install beautifulsoup4 requests
Pilih repositori mana saja yang ingin Anda gunakan untuk melakukan scraping Github. Pertama, tentukan tautan dalam sebuah variabel, lalu buat permintaan HTTP yang akan mendapatkan kode halaman.
url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
Untuk menganalisis HTML Anda, Anda memasukkannya ke dalam BeautifulSoup.
soup = BeautifulSoup(page.text, 'html.parser')
Konstruktor BeautifulSoup() perlu disediakan dengan dua hal.
HTML akan diuraikan oleh BeautifulSoup dan sebuah struktur pohon akan dihasilkan. Lebih khusus lagi, variabel sup berisi semua metode yang diperlukan untuk memilih elemen yang relevan dari pohon DOM seperti:
Inilah langkah penting lainnya: memilih elemen HTML sederhana dan mengambil data Github dari elemen tersebut. Langkah ini mendahului penulisan skrip repositori Python Github.
Sebelum melakukan scraping di Github, biasakan diri Anda dengan halaman web itu sendiri. Setelah itu, buka alat pengembang dengan mengklik F12. Setelah Anda membuka kode, Anda akan melihat bahwa banyak elemen pada halaman tersebut tidak memiliki kelas atau atribut unik yang akan memudahkan Anda untuk menavigasi ke elemen yang sesuai. Telusuri halaman tersebut dan bersiaplah untuk mengekstrak data.
Sekarang kita siap untuk membuat skrip Python yang akan membantu kita untuk melakukan scraping pada repositori GitHub. Skrip ini dapat mengekstrak informasi berguna yang tersimpan di GitHub seperti bintang, deskripsi, komit terakhir, dll. Untuk itu, kita perlu menentukan fitur-fitur yang diperlukan dan mengambil nilai teks yang sesuai.
repo_title = soup.select_one('[itemprop="name"]').text.strip()
Atribut itemprop="name" memiliki nilai atribut yang memiliki identitas unik, sehingga kita mengambilnya. Bidang teks di GitHub umumnya memiliki spasi dan karakter baris baru dan dapat dibersihkan dengan menggunakan strip().
git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
Perhatikan fakta bahwa tidak ada metode yang lebih sederhana untuk memilih komponen HTML yang memegang judul cabang utama. Apa yang dapat Anda lakukan? Pilih kelas yang unik dan dapatkan teksnya.
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
Kami mencatat bahwa tag waktu relatif, tempat komit terakhir oleh pengguna disimpan, sudah dipilih, dan tanggalnya dipilih melalui datetime.
Kumpulkan informasi yang ada di sisi kiri: deskripsi, bintang, pemandangan, garpu.
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(',', '')
Berkas readme sangat penting. File ini menyediakan deskripsi repositori dan instruksi tentang cara mengimplementasikan kode. Jika Anda memeriksa file readme.md, Anda dapat melihat tautan apa yang dimilikinya:
https://raw.githubusercontent.com///readme.md
Karena kita memiliki , kita dapat membuat URL secara terprogram menggunakan f-string, menggunakannya, dan membuat permintaan HTTP untuk mendapatkan kode file.
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
Ingatlah untuk memeriksa kesalahan 404 untuk menghindari penyimpanan konten halaman web GitHub 404 jika repositori tidak memiliki file readme.
Semua informasi akan disimpan dalam satu kamus sehingga kita dapat dengan mudah menuliskannya ke dalam file JSON.
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
Kita akan memanfaatkan pustaka Python bawaan untuk menganalisis data dan menyimpannya dalam format JSON, karena ini sangat cocok untuk struktur bersarang seperti dalam kasus kita ketika artikel memiliki daftar.
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()
# cabang
main_branch = soup.select_one(
'[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
# komit terbaru
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
# keterangan
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()
# bintang
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(',', '')
# pengamat
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(',', '')
# garpu
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)
Kita telah membahas proses pembuatan skrip scraping GitHub untuk repositori dengan bantuan BeautifulSoup dan Request. Anda sekarang tahu cara mengakses halaman web, mengambil data yang relevan, dan menyandikannya dengan cara yang ramah pengguna. Keterampilan tersebut akan berguna dalam menganalisis proyek-proyek terkenal, melacak perubahan pada kode, atau membuat laporan.
Meskipun demikian, berhati-hatilah dalam penggunaannya. Sebagian besar waktu, API tersedia untuk digunakan di GitHub, yang akan lebih sederhana dan lebih praktis untuk digunakan. Jika Anda membuat keputusan untuk melakukan scraping web, pastikan Anda mematuhi pedoman situs dan tidak membombardir server dengan terlalu banyak permintaan.
Komentar: 0