برنامه نویسی

آموزش مفصل: خزیدن پوشه‌های مخزن GitHub بدون API

Summarize this content to 400 words in Persian Lang

آموزش فوق العاده دقیق: خزیدن پوشه های مخزن GitHub بدون API

این آموزش فوق العاده دقیق که توسط Shpetim Haxhiu نوشته شده است، شما را در خزیدن پوشه های مخزن GitHub به صورت برنامه نویسی و بدون تکیه بر GitHub API راهنمایی می کند. این شامل همه چیز از درک ساختار گرفته تا ارائه یک پیاده سازی قوی و بازگشتی با پیشرفت ها است.

1. راه اندازی و نصب

قبل از شروع، مطمئن شوید که:

پایتون: نسخه 3.7 یا بالاتر نصب شده است.

کتابخانه ها: نصب کنید requests و BeautifulSoup.

pip install requests beautifulsoup4

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ویرایشگر: هر IDE پشتیبانی شده از پایتون، مانند VS Code یا PyCharm.

2. تجزیه و تحلیل ساختار HTML GitHub

برای خراش دادن پوشه های GitHub، باید ساختار HTML یک صفحه مخزن را بدانید. در یک صفحه مخزن GitHub:

پوشه ها با مسیرهایی مانند /tree//.

فایل ها با مسیرهایی مانند /blob//.

هر آیتم (پوشه یا فایل) داخل a قرار دارد with the attribute role=”rowheader” و حاوی یک برچسب زدن به عنوان مثال:

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. پیاده سازی Scraper

3.1. تابع خزیدن بازگشتی

اسکریپت به صورت بازگشتی پوشه ها را خراش می دهد و ساختار آنها را چاپ می کند. برای محدود کردن عمق بازگشت و جلوگیری از بار غیر ضروری، از a استفاده می کنیم depth پارامتر

import requests
from bs4 import BeautifulSoup
import time

def crawl_github_folder(url, depth=0, max_depth=3):
“””
Recursively crawls a GitHub repository folder structure.

Parameters:
– url (str): URL of the GitHub folder to scrape.
– depth (int): Current recursion depth.
– max_depth (int): Maximum depth to recurse.
“””
if depth > max_depth:
return

headers = {“User-Agent”: “Mozilla/5.0″}
response = requests.get(url, headers=headers)

if response.status_code != 200:
print(f”Failed to access {url} (Status code: {response.status_code})”)
return

soup = BeautifulSoup(response.text, ‘html.parser’)

# Extract folder and file links
items = soup.select(‘div[role=”rowheader”] a’)

for item in items:
item_name = item.text.strip()
item_url = f”https://github.com{item[‘href’]}”

if ‘/tree/’ in item_url:
print(f”{‘ ‘ * depth}Folder: {item_name}”)
crawl_github_folder(item_url, depth + 1, max_depth)
elif ‘/blob/’ in item_url:
print(f”{‘ ‘ * depth}File: {item_name}”)

# Example usage
if __name__ == “__main__”:
repo_url = “https://github.com///tree//”
crawl_github_folder(repo_url)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. ویژگی ها توضیح داده شده است

هدر برای درخواست: با استفاده از a User-Agent رشته ای برای تقلید از یک مرورگر و جلوگیری از مسدود کردن.

خزیدن بازگشتی:

پوشه ها را تشخیص می دهد (/tree/) و به صورت بازگشتی وارد آنها می شود.
لیست فایل ها (/blob/) بدون ورود بیشتر.

تورفتگی: سلسله مراتب پوشه را در خروجی منعکس می کند.

محدودیت عمق: با تنظیم حداکثر عمق از بازگشت بیش از حد جلوگیری می کند (max_depth).

5. بهبود

این پیشرفت‌ها برای بهبود عملکرد و قابلیت اطمینان خزنده طراحی شده‌اند. آنها چالش‌های رایجی مانند صادرات نتایج، رسیدگی به خطاها و اجتناب از محدودیت‌های نرخ را برطرف می‌کنند و از کارآمد و کاربرپسند بودن ابزار اطمینان می‌دهند.

5.1. صادرات نتایج

خروجی را در یک فایل JSON ساختاریافته برای استفاده راحت تر ذخیره کنید.

import json

def crawl_to_json(url, depth=0, max_depth=3):
“””Crawls and saves results as JSON.”””
result = {}

if depth > max_depth:
return result

headers = {“User-Agent”: “Mozilla/5.0″}
response = requests.get(url, headers=headers)

if response.status_code != 200:
print(f”Failed to access {url}”)
return result

soup = BeautifulSoup(response.text, ‘html.parser’)
items = soup.select(‘div[role=”rowheader”] a’)

for item in items:
item_name = item.text.strip()
item_url = f”https://github.com{item[‘href’]}”

if ‘/tree/’ in item_url:
result[item_name] = crawl_to_json(item_url, depth + 1, max_depth)
elif ‘/blob/’ in item_url:
result[item_name] = “file”

return result

if __name__ == “__main__”:
repo_url = “https://github.com///tree//”
structure = crawl_to_json(repo_url)

with open(“output.json”, “w”) as file:
json.dump(structure, file, indent=2)

print(“Repository structure saved to output.json”)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5.2. رسیدگی به خطا

مدیریت خطاهای قوی را برای خطاهای شبکه و تغییرات غیرمنتظره HTML اضافه کنید:

try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f”Error fetching {url}: {e}”)
return

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5.3. محدود کردن نرخ

برای جلوگیری از محدود شدن نرخ توسط GitHub، تاخیرها را معرفی کنید:

import time

def crawl_with_delay(url, depth=0):
time.sleep(2) # Delay between requests
# Crawling logic here

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

6. ملاحظات اخلاقی

این بخش که توسط Shpetim Haxhiu، متخصص اتوماسیون نرم افزار و برنامه نویسی اخلاقی نوشته شده است، پایبندی به بهترین شیوه ها را هنگام استفاده از خزنده GitHub تضمین می کند.

انطباق: به شرایط خدمات GitHub پایبند باشید.

به حداقل رساندن بار: با محدود کردن درخواست ها و اضافه کردن تاخیر به سرورهای GitHub احترام بگذارید.

اجازه: برای خزیدن گسترده مخازن خصوصی مجوز دریافت کنید.

7. کد کامل

در اینجا اسکریپت تلفیقی با تمام ویژگی‌های گنجانده شده است:

import requests
from bs4 import BeautifulSoup
import json
import time

def crawl_github_folder(url, depth=0, max_depth=3):
result = {}

if depth > max_depth:
return result

headers = {“User-Agent”: “Mozilla/5.0″}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f”Error fetching {url}: {e}”)
return result

soup = BeautifulSoup(response.text, ‘html.parser’)
items = soup.select(‘div[role=”rowheader”] a’)

for item in items:
item_name = item.text.strip()
item_url = f”https://github.com{item[‘href’]}”

if ‘/tree/’ in item_url:
print(f”{‘ ‘ * depth}Folder: {item_name}”)
result[item_name] = crawl_github_folder(item_url, depth + 1, max_depth)
elif ‘/blob/’ in item_url:
print(f”{‘ ‘ * depth}File: {item_name}”)
result[item_name] = “file”

time.sleep(2) # Avoid rate-limiting
return result

if __name__ == “__main__”:
repo_url = “https://github.com///tree//”
structure = crawl_github_folder(repo_url)

with open(“output.json”, “w”) as file:
json.dump(structure, file, indent=2)

print(“Repository structure saved to output.json”)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با دنبال کردن این راهنمای دقیق، می توانید یک خزنده پوشه GitHub قوی بسازید. این ابزار را می توان برای نیازهای مختلف و در عین حال تضمین انطباق اخلاقی تطبیق داد.

سوالات خود را در بخش نظرات مطرح کنید! همچنین فراموش نکنید که با من در ارتباط باشید:

آموزش فوق العاده دقیق: خزیدن پوشه های مخزن GitHub بدون API

این آموزش فوق العاده دقیق که توسط Shpetim Haxhiu نوشته شده است، شما را در خزیدن پوشه های مخزن GitHub به صورت برنامه نویسی و بدون تکیه بر GitHub API راهنمایی می کند. این شامل همه چیز از درک ساختار گرفته تا ارائه یک پیاده سازی قوی و بازگشتی با پیشرفت ها است.


1. راه اندازی و نصب

قبل از شروع، مطمئن شوید که:

  1. پایتون: نسخه 3.7 یا بالاتر نصب شده است.
  2. کتابخانه ها: نصب کنید requests و BeautifulSoup.
   pip install requests beautifulsoup4
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. ویرایشگر: هر IDE پشتیبانی شده از پایتون، مانند VS Code یا PyCharm.

2. تجزیه و تحلیل ساختار HTML GitHub

برای خراش دادن پوشه های GitHub، باید ساختار HTML یک صفحه مخزن را بدانید. در یک صفحه مخزن GitHub:

  • پوشه ها با مسیرهایی مانند /tree//.
  • فایل ها با مسیرهایی مانند /blob//.

هر آیتم (پوشه یا فایل) داخل a قرار دارد

with the attribute role="rowheader" و حاوی یک برچسب زدن به عنوان مثال:


وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


3. پیاده سازی Scraper

3.1. تابع خزیدن بازگشتی

اسکریپت به صورت بازگشتی پوشه ها را خراش می دهد و ساختار آنها را چاپ می کند. برای محدود کردن عمق بازگشت و جلوگیری از بار غیر ضروری، از a استفاده می کنیم depth پارامتر

import requests
from bs4 import BeautifulSoup
import time

def crawl_github_folder(url, depth=0, max_depth=3):
    """
    Recursively crawls a GitHub repository folder structure.

    Parameters:
    - url (str): URL of the GitHub folder to scrape.
    - depth (int): Current recursion depth.
    - max_depth (int): Maximum depth to recurse.
    """
    if depth > max_depth:
        return

    headers = {"User-Agent": "Mozilla/5.0"}
    response = requests.get(url, headers=headers)

    if response.status_code != 200:
        print(f"Failed to access {url} (Status code: {response.status_code})")
        return

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

    # Extract folder and file links
    items = soup.select('div[role="rowheader"] a')

    for item in items:
        item_name = item.text.strip()
        item_url = f"https://github.com{item['href']}"

        if '/tree/' in item_url:
            print(f"{'  ' * depth}Folder: {item_name}")
            crawl_github_folder(item_url, depth + 1, max_depth)
        elif '/blob/' in item_url:
            print(f"{'  ' * depth}File: {item_name}")

# Example usage
if __name__ == "__main__":
    repo_url = "https://github.com///tree//"
    crawl_github_folder(repo_url)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


4. ویژگی ها توضیح داده شده است

  1. هدر برای درخواست: با استفاده از a User-Agent رشته ای برای تقلید از یک مرورگر و جلوگیری از مسدود کردن.
  2. خزیدن بازگشتی:

    • پوشه ها را تشخیص می دهد (/tree/) و به صورت بازگشتی وارد آنها می شود.
    • لیست فایل ها (/blob/) بدون ورود بیشتر.
  3. تورفتگی: سلسله مراتب پوشه را در خروجی منعکس می کند.
  4. محدودیت عمق: با تنظیم حداکثر عمق از بازگشت بیش از حد جلوگیری می کند (max_depth).

5. بهبود

این پیشرفت‌ها برای بهبود عملکرد و قابلیت اطمینان خزنده طراحی شده‌اند. آنها چالش‌های رایجی مانند صادرات نتایج، رسیدگی به خطاها و اجتناب از محدودیت‌های نرخ را برطرف می‌کنند و از کارآمد و کاربرپسند بودن ابزار اطمینان می‌دهند.

5.1. صادرات نتایج

خروجی را در یک فایل JSON ساختاریافته برای استفاده راحت تر ذخیره کنید.

import json

def crawl_to_json(url, depth=0, max_depth=3):
    """Crawls and saves results as JSON."""
    result = {}

    if depth > max_depth:
        return result

    headers = {"User-Agent": "Mozilla/5.0"}
    response = requests.get(url, headers=headers)

    if response.status_code != 200:
        print(f"Failed to access {url}")
        return result

    soup = BeautifulSoup(response.text, 'html.parser')
    items = soup.select('div[role="rowheader"] a')

    for item in items:
        item_name = item.text.strip()
        item_url = f"https://github.com{item['href']}"

        if '/tree/' in item_url:
            result[item_name] = crawl_to_json(item_url, depth + 1, max_depth)
        elif '/blob/' in item_url:
            result[item_name] = "file"

    return result

if __name__ == "__main__":
    repo_url = "https://github.com///tree//"
    structure = crawl_to_json(repo_url)

    with open("output.json", "w") as file:
        json.dump(structure, file, indent=2)

    print("Repository structure saved to output.json")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5.2. رسیدگی به خطا

مدیریت خطاهای قوی را برای خطاهای شبکه و تغییرات غیرمنتظره HTML اضافه کنید:

try:
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"Error fetching {url}: {e}")
    return
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5.3. محدود کردن نرخ

برای جلوگیری از محدود شدن نرخ توسط GitHub، تاخیرها را معرفی کنید:

import time

def crawl_with_delay(url, depth=0):
    time.sleep(2)  # Delay between requests
    # Crawling logic here
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


6. ملاحظات اخلاقی

این بخش که توسط Shpetim Haxhiu، متخصص اتوماسیون نرم افزار و برنامه نویسی اخلاقی نوشته شده است، پایبندی به بهترین شیوه ها را هنگام استفاده از خزنده GitHub تضمین می کند.

  • انطباق: به شرایط خدمات GitHub پایبند باشید.
  • به حداقل رساندن بار: با محدود کردن درخواست ها و اضافه کردن تاخیر به سرورهای GitHub احترام بگذارید.
  • اجازه: برای خزیدن گسترده مخازن خصوصی مجوز دریافت کنید.

7. کد کامل

در اینجا اسکریپت تلفیقی با تمام ویژگی‌های گنجانده شده است:

import requests
from bs4 import BeautifulSoup
import json
import time

def crawl_github_folder(url, depth=0, max_depth=3):
    result = {}

    if depth > max_depth:
        return result

    headers = {"User-Agent": "Mozilla/5.0"}
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"Error fetching {url}: {e}")
        return result

    soup = BeautifulSoup(response.text, 'html.parser')
    items = soup.select('div[role="rowheader"] a')

    for item in items:
        item_name = item.text.strip()
        item_url = f"https://github.com{item['href']}"

        if '/tree/' in item_url:
            print(f"{'  ' * depth}Folder: {item_name}")
            result[item_name] = crawl_github_folder(item_url, depth + 1, max_depth)
        elif '/blob/' in item_url:
            print(f"{'  ' * depth}File: {item_name}")
            result[item_name] = "file"

    time.sleep(2)  # Avoid rate-limiting
    return result

if __name__ == "__main__":
    repo_url = "https://github.com///tree//"
    structure = crawl_github_folder(repo_url)

    with open("output.json", "w") as file:
        json.dump(structure, file, indent=2)

    print("Repository structure saved to output.json")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


با دنبال کردن این راهنمای دقیق، می توانید یک خزنده پوشه GitHub قوی بسازید. این ابزار را می توان برای نیازهای مختلف و در عین حال تضمین انطباق اخلاقی تطبیق داد.


سوالات خود را در بخش نظرات مطرح کنید! همچنین فراموش نکنید که با من در ارتباط باشید:

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا