Scrape github with python cover

開発者が集まり、協力し、つながれる場を探しているなら、GitHubは最適な選択肢です。個人でコーディングする場合でも、グローバルなテクノロジー企業で働く場合でも、技術データにアクセスするための重要なプラットフォームです。GitHubには関数豊富な公式APIがあり、通常はまずこちらを利用します。ただし、必要なデータをAPIから取得できない場合は、Webスクレイピングが有用な代替手段になります。  

このチュートリアルでは、GitHubの基本要素と、トレンドリポジトリをスクレイピングする方法を解説します。  

*Webスクレイピングは、常に法令と倫理を守って行ってください。本記事は違法行為を推奨するものではなく、責任ある利用方法のみを紹介します。

I am raw html block.
Click edit button to change this html

GitHubとは何か、どのように関数するのか

GitHubは、世界中の開発者が利用する中心的なプラットフォームです。コードのホスティング、プロジェクトでの共同作業、ソフトウェア開発に使われます。GitHubの名称は Gitに由来します。GitはGitHubの基盤となるバージョン管理システムです。変更履歴を一元管理できるため、複数のファイルを保存する手間が省けます。いつ、誰が、何を変更したかをいつでも確認できるので、チーム開発にも適しています。  

フォーク、リポジトリ、スター、ブランチといった用語は、最初は少し分かりにくいかもしれません。しかし、Gitの仕組みを理解すれば、それぞれの意味が見えてきます。Gitではリポジトリにプロジェクトと履歴を保存し、変更をコミットとして記録します。ブランチを使えば並行して開発でき、完成した作業はメインプロジェクトにマージできます。次の図で流れを確認しましょう。

これらの用語は事前に確認しておくことをおすすめします。詳しくは公式サイト

簡単に言うと、このシステムにより、開発者はお互いの作業を上書きすることなく共同作業することができます。  

*GitHubのスクレイピングは合法ですか?

はい。GitHubの要件に従い、 利用規約、著作権およびプライバシーに関する規則を尊重する限り、一般に合法です。パブリックリポジトリ、ユーザープロフィール、スター、フォーク、コミットなどのメタデータには、法令に違反しない範囲でアクセスできます。  

ただし、プライベートリポジトリや機密性の高いユーザー情報へのアクセス、GitHubのレート制限に違反する自動アクセスは、アカウントの停止や法的結果につながる可能性があります。スクレイピングは倫理的に行い、ユーザーのプライバシーを尊重し、GitHubのサーバーに過度な負荷をかけないよう常に注意してください。

GitHubはスクレイピングと不正利用にどう対応していますか?

多くのmainなプラットフォームと同様、GitHubは安定性を維持し、自動悪用を防ぐために厳格なレート制限を適用します。APIトークンまたは認証済みアカウントごとに、1時間あたりのリクエスト数が定められており、目安は5,000リクエストです。レート制限に達すると、通常は403 Forbiddenという応答が返されます。不正利用が伴う場合は、ユーザーは一時的または永久的なアカウント停止を受ける可能性があります。継続的なボットによるアクセスに備え、GitHubは異常なトラフィックパターン、IPアドレスからの急増、認証失敗の繰り返しを監視しています。

データを収集しつつアクセス量を許容範囲に抑えるため、開発者は追加の対策としてプロキシを利用します。プロキシは送信リクエストの送信元IPアドレスをローテーションし、トラフィックを複数のエンドポイントに分散できます。その結果、GitHubの不正利用防止システムに検知される可能性を抑えられます。どのタイプのプロキシを使用するのが良いかわからない場合は、スクレイピングの量やデータの機密性などの要素を考慮してください。 DataImpulseプロキシは、手頃な価格と高い信頼性、速度で知られています。プラットフォームのルールに違反することなく、責任を持って倫理的に使用することをお勧めします。

GitHubのAPIルールを尊重し、プライベート リポジトリや機密ユーザー データのスクレイピングを避けてください。

初期設定: 必要なもの  

  • Python 3(最新バージョン)

Pythonはこちらからダウンロードし、VS CodeにPython拡張関数をインストールします。ターミナルを開き、以下でインストールを確認します。  


python3 --version 
      
        
      

  • Visual Studio Code(または他のコードエディタの最新バージョン)

こちらからダウンロードしてインストールし、プロジェクトフォルダを開きます。

  • DataImpulseダッシュボードのプロキシ認証情報

DataImpulseにサインインし、プロキシのログイン情報をコピーします。

  • ライブラリ: Requests、BeautifulSoup、sys、typing(後者2つはPython標準モジュール)

Requests: HTTPリクエストの送信に使用します。

BeautifulSoup: HTMLを解析し、GitHubのトレンドページからデータを抽出するために使用します。

sys: 問題が発生したときにエラーメッセージを表示してプログラムを停止するために使用します (sys.exit(…))。

typing: 各関数で想定するデータ型を示す型ヒントに使用します。

まず、コンピュータでターミナルを開き、pipをインストールします:


python3 -m ensurepip 
      
        
      

次に、以下を使用してPythonライブラリをインストールします。


pip3 install requests beautifulsoup4 
      
        
      

Enterキーを押すと、ライブラリがインストールされていることを確認できます。

PythonでGitHubをスクレイピングするための一般的な手順

  1. 対象ページを選ぶ – 収集するGitHubページまたはリポジトリのデータを決めます(トレンドリポジトリ、ユーザープロフィールなど)。
  2. HTML構造を検査する – ページのHTMLを調べ、必要なデータを含む要素を特定します。
  3. HTTPリクエストを送信するRequestsなどのライブラリを使用して、ページのコンテンツを取得します。
  4. レスポンスを解析するBeautifulSoupを使ってHTMLを処理します。
  5. 必要なデータを抽出する – 必要な特定の情報を特定して抽出します。
  6. ページネーションを処理する – ページをループして、利用可能なすべてのエントリを抽出します。  
  7. 結果を保存する – 収集したデータを CSV、JSON、またはデータベース (オプション) に保存します。

実践例:  

今回のスクレイピングでは、次のトレンドリポジトリページを使用します。完全なコードを示す前に、主な構成要素を簡単に説明します。

  • プロキシ構成

プロキシ – DataImpulseダッシュボードのプロキシ認証情報 (ホスト、ポート、ユーザー名、パスワード)。これらの値を独自の資格情報に置き換えます。
タイムアウト: リクエストの最大待機時間 (20秒)。
VERIFY_SSL: HTTPS接続の証明書を検証します。
USER_AGENT: 実際のブラウザを装い、基本的なボットチェックに対応します。

  •  GitHubトレンドのフィルター

言語 – 対象のプログラミング言語( なし はすべての言語を対象にします)。
期間 – 対象期間: 日次、週次、月次。


TIMEOUT = 20               # seconds
VERIFY_SSL = True

USER_AGENT = (
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) "
    "AppleWebKit/537.36 (KHTML, like Gecko) "
    "Chrome/118.0.0.0 Safari/537.36"
      
        
   
   
   
   
   
   
      

まずは、次の簡単なコードを試してみましょう。  


import requests
from bs4 import BeautifulSoup

LANGUAGE = "python"      # Programming language. None can be used as "Any" parameter in GitHub Trending
SINCE = "daily"          # Date range: daily / weekly / monthly
PROXY = {
    "host": "DATAIMPULSE HOST",
    "port": "DATAIMPULSE PORT",
    "user": "DATAIMPULSE LOGIN",
    "pass": "DATAIMPULSE PASSWORD",
}

# Proxy configuration
proxy_url = f"http://{PROXY['user']}:{PROXY['pass']}@{PROXY['host']}:{PROXY['port']}"
proxies = {
    "http": proxy_url,
    "https": proxy_url,
}
# Checking proxies
ip = requests.get("https://api.ipify.org", proxies=proxies).text
print("Your IP:", ip)
# Scraping Github Trending section 
url = "https://github.com/trending"
# Adding parameters like Language and Date Range, and make HTTP request to GitHub
params = {"since": SINCE}
if LANGUAGE:
    params["language"] = LANGUAGE
headers = {
    "User-Agent": "Mozilla/5.0"
}

r = requests.get(
    url,
    headers=headers,
    params=params,
    proxies=proxies,
    timeout=20
)

# Scrape and output details
soup = BeautifulSoup(r.text, "html.parser")

print("\n🔥 GitHub Trending:\n")
for count, repo in enumerate(soup.select("article.Box-row"), start=1):
    name = repo.h2.text.strip().replace("\n", "").replace(" ", "")
    link = "https://github.com" + repo.h2.a["href"]
    desc = repo.p.text.strip() if repo.p else "No description"
    stars_today = repo.select_one("span.d-inline-block.float-sm-right").text.strip() if repo.select_one("span.d-inline-block.float-sm-right") else None
    print(f"{count}. {name}")
    print(f"Link: {link}")
    print(f"Stars Today: {stars_today}")
    print(f"Description: {desc}")
    print("-" * 40)
      
        
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
      

次のコードでは、関数を使用します。関数を使うと、コードが整理され、再利用、デバッグ、保守がしやすくなります。これは、GitHubのスクレイピングや複数のプロキシの処理などの複雑なタスクにとって特に重要です。

  • 関数  

log: コンソール出力を整形します。
build_proxies – プロキシ文字列を構築します (ユーザー名:パスワード@ホスト:ポート).
test_proxy – を通じてプロキシを確認します https://api.ipify.org?format=json
scrape_github_trending – BeautifulSoup4 を使用して HTML を解析します。
main – スクレイピング処理を開始します。

コードの完全版は次のとおりです。  


import sys
import requests
from bs4 import BeautifulSoup
from typing import List, Dict, Optional
# =========================================================
# CONFIG — CHANGE ONLY THIS SECTION
# =========================================================
GITHUB_TRENDING_URL = "https://github.com/trending"
# Proxy configuration (leave PROXY = None to disable proxy)
PROXY = {
    "host": "DATAIMPULSE HOST",
    "port": "DATAIMPULSE PORT",
    "username": "DATAIMPULSE LOGIN",
    "password": "DATAIMPULSE PASSWORD",
}
# PROXY = None  # uncomment to disable proxy completely

LANGUAGE = "python"        # e.g. "python", "javascript", or None
SINCE = "daily"            # "daily", "weekly", "monthly"
TIMEOUT = 20               # seconds
VERIFY_SSL = True

USER_AGENT = (
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) "
    "AppleWebKit/537.36 (KHTML, like Gecko) "
    "Chrome/118.0.0.0 Safari/537.36"
)

# =========================================================
# END CONFIG
# =========================================================
def log(msg: str) -> None:
    print(f"[INFO] {msg}")

def build_proxies(proxy_cfg: Optional[Dict]) -> Optional[Dict[str, str]]:
    if not proxy_cfg:
        return None

    proxy_url = (
        f"http://{proxy_cfg['username']}:{proxy_cfg['password']}"
        f"@{proxy_cfg['host']}:{proxy_cfg['port']}"
    )

    return {
        "http": proxy_url,
        "https": proxy_url,
    }

def test_proxy(proxies: Optional[Dict[str, str]]) -> None:
    log("Testing proxy...")
    r = requests.get(
        "https://api.ipify.org?format=json",
        proxies=proxies,
        timeout=10,
    )
    r.raise_for_status()
    log(f"Proxy OK. Outgoing IP: {r.json()['ip']}")

def scrape_github_trending(
    language: Optional[str],
    since: str,
    proxies: Optional[Dict[str, str]],
    timeout: int,
) -> List[Dict]:
    headers = {"User-Agent": USER_AGENT}

    params = {"since": since}
    if language:
        params["language"] = language

    log("Fetching GitHub Trending page...")
    response = requests.get(
        GITHUB_TRENDING_URL,
        headers=headers,
        params=params,
        proxies=proxies,
        timeout=timeout,
        verify=VERIFY_SSL,
    )
    response.raise_for_status()

    soup = BeautifulSoup(response.text, "lxml")
    repos = []

    for article in soup.select("article.Box-row"):
        name = (
            article.h2.text
            .replace("\n", "")
            .replace(" ", "")
            .strip()
        )
        url = "https://github.com" + article.h2.a["href"]

        description = article.p.text.strip() if article.p else None

        language_el = article.select_one(
            '[itemprop="programmingLanguage"]'
        )
        stars_today_el = article.select_one(
            "span.d-inline-block.float-sm-right"
        )

        repos.append({
            "name": name,
            "url": url,
            "description": description,
            "language": (
                language_el.text.strip()
                if language_el else None
            ),
            "stars_today": (
                stars_today_el.text.strip()
                if stars_today_el else None
            ),
        })

    return repos

def main() -> None:
    proxies = build_proxies(PROXY)

    # 1) Test proxy
    try:
        if proxies:
            test_proxy(proxies)
        else:
            log("Proxy disabled.")
    except Exception as e:
        sys.exit(f"[ERROR] Proxy test failed: {e}")

    # 2) Scrape GitHub Trending
    try:
        repos = scrape_github_trending(
            language=LANGUAGE,
            since=SINCE,
            proxies=proxies,
            timeout=TIMEOUT,
        )
    except Exception as e:
        sys.exit(f"[ERROR] Scraping failed: {e}")

    # 3) Output
    print("\n🔥 GitHub Trending Repositories\n")
    print(f"Language: {LANGUAGE or 'All'} | Since: {SINCE}\n")

    for i, repo in enumerate(repos, 1):
        print(f"{i}. {repo['name']}")
        print(f"   URL: {repo['url']}")
        print(f"   Language: {repo['language']}")
        print(f"   Stars today: {repo['stars_today']}")
        if repo["description"]:
            print(f"   Description: {repo['description']}")
        print()

    log(f"Done. Total repositories: {len(repos)}")

if __name__ == "__main__":
    main()
      
        
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
      

実行すると、ターミナルに14件のトレンドリポジトリが見やすい一覧で表示されます。

まとめと推奨事項

GitHubのスクレイピングは役立つスキルですが、倫理面と技術面の両方に配慮することが重要です。初心者は、コーディングなしで構造化データを抽出するGemini Botから始めることもできます。ボットを作成し、次のようにプロンプ​​トを記述するだけです。  

このGitHubリポジトリ ページを分析し、次の情報を抽出します。

– リポジトリ名

– スター数

– 主なプログラミング言語

– 最終コミット日

データをJSON形式で返します。

以上です。新しいアイデアを試し、ツールを組み合わせ、手法を自分のプロジェクトに合わせて調整してみてください。プロキシを利用する場合も常にGitHubの利用規約を守り、フィルターで対象の言語やトレンド期間を絞り込みましょう。リクエストをログに記録して監視し、まず少数のリポジトリで試してから段階的に規模を拡大することをおすすめします。

Share article: