Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 GitHub 월간 스타 상위 10개 저장소 크롤링하기

Git은 전 세계에서 가장 널리 사용되는 버전 관리 시스템(VCS)으로, 수백만 명의 개발자가 자신의 프로젝트와 코드를 관리하는 데 활용하고 있습니다. 이 글에서는 Python을 사용해 GitHub 트렌딩 페이지에서 최근 한 달 동안 가장 많은 스타(별표)를 받은 상위 10개 저장소를 가져오는 방법을 알아보겠습니다.

GitHub 저장소 데이터를 직접 크롤링하는 방식이므로, 아래 두 라이브러리가 핵심적인 역할을 담당합니다.

  • requests: GitHub 트렌딩 페이지의 HTML을 가져옵니다.
  • BeautifulSoup: 가져온 HTML에서 원하는 데이터를 추출합니다.

크롤링한 결과는 starred-repos.txt 파일에 저장한 뒤 화면에 출력하며, 순위(스타 수)별로 사용자 이름과 저장소명을 함께 보여줍니다.

사전 준비

두 라이브러리가 설치되어 있지 않다면 pip 명령어로 간단히 설치할 수 있습니다.

pip install requests beautifulsoup4 lxml

구현 코드

import requests
from bs4 import BeautifulSoup

# 월간 트렌딩 페이지 요청 (언어: lua)
r = requests.get('https://github.com/trending/lua?since=monthly')
bs = BeautifulSoup(r.text, 'lxml')

# 저장소 목록 추출 후 임시 파일에 기록
lista_repo = bs.find_all('ol', class_='repo-list')
f1 = open('starred-repos.txt', 'w')
for lr in lista_repo:
    aux = lr.find_all('div', class_='d-inline-block col-9 mb-1')
    for ld in aux:
        rank = ld.find_all('a')
        f1.writelines(str(rank))
        f1.writelines('\n')
f1.close()

# 파일에서 저장소 경로만 추출
f1 = open('starred-repos.txt', 'r')
texto = []
for x in f1:
    if x[0] == '[' and x[1] == '<' and x[2] == 'a':
        na = x.split('"')
        texto.append(na[1])
f1.close()

# 순위, 이름, 저장소 형식으로 정리해 다시 저장
f1 = open('starred-repos.txt', 'w')
f1.writelines('{}\t {}\t\t {}\t\n\n'.format('Position ', 'Name ', 'Repositories '))
for i in range(10):
    tex = texto[i].split('/')
    name = tex[1]
    repos = tex[2]
    f1.writelines('{}- \t {}\t\t {}'.format(i + 1, name, repos))
    f1.writelines('\n')
f1.close()

# 최종 결과 출력
f1 = open('starred-repos.txt', 'r')
print(f1.read())
f1.close()

코드 단계별 설명

1. 트렌딩 페이지 요청 및 파싱

requests.get()으로 월간 트렌딩 페이지(?since=monthly)를 요청한 뒤, BeautifulSoup의 lxml 파서로 HTML을 파싱합니다. URL에서 lua 부분을 python, javascript 등 다른 언어로 바꾸면 해당 언어의 트렌딩 목록을 가져올 수도 있습니다.

2. 저장소 링크 추출

ol.repo-list 요소 안에서 각 저장소 항목(div.d-inline-block.col-9.mb-1)을 찾아 앵커 태그를 문자열로 변환한 후 임시 파일에 기록합니다.

3. 문자열 정제

파일에 저장된 각 줄이 앵커 태그로 시작하는 경우에만 큰따옴표를 기준으로 분리하여, 그중 사용자명/저장소명 형태의 경로 값만 추출합니다.

4. 결과 포맷팅 및 출력

추출한 경로를 다시 슬래시(/)로 나눠 사용자 이름과 저장소 이름을 구분하고, 순위 번호와 함께 탭으로 정렬된 표 형태로 파일에 기록한 뒤 내용을 읽어 화면에 출력합니다.

실행 결과

Position          Name              Repositories

1-                skywind3000       z.lua
2-                Kong              kong
3-                Gawen             WireHub
4-                PapyElGringo      material-awesome
5-                koreader          koreader
6-                stijnwop          guidanceSteering
7-                Courseplay        courseplay
8-                Tencent           LuaPanda
9-                ntop              ntopng
10-               awesomeWM         awesome

참고 사항

GitHub는 UI 개편에 따라 HTML 구조가 수시로 변경될 수 있으므로, 위 코드의 CSS 선택자(class_ 값)는 실행 시점의 실제 페이지 구조에 맞게 조정해야 할 수 있습니다. 또한 대량 크롤링 시에는 GitHub 이용약관과 robots.txt를 반드시 준수해야 하며, 안정성과 유지보수 측면에서는 공식 GitHub API를 활용하는 것이 더 권장됩니다.