آموزش مفصل: خزیدن پوشههای مخزن 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. راه اندازی و نصب
قبل از شروع، مطمئن شوید که:
- پایتون: نسخه 3.7 یا بالاتر نصب شده است.
-
کتابخانه ها: نصب کنید
requests
وBeautifulSoup
.
pip install requests beautifulsoup4
- ویرایشگر: هر IDE پشتیبانی شده از پایتون، مانند VS Code یا PyCharm.
2. تجزیه و تحلیل ساختار HTML GitHub
برای خراش دادن پوشه های GitHub، باید ساختار HTML یک صفحه مخزن را بدانید. در یک صفحه مخزن GitHub:
-
پوشه ها با مسیرهایی مانند
/tree/
./ -
فایل ها با مسیرهایی مانند
/blob/
./
هر آیتم (پوشه یا فایل) داخل a قرار دارد
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 قوی بسازید. این ابزار را می توان برای نیازهای مختلف و در عین حال تضمین انطباق اخلاقی تطبیق داد.
سوالات خود را در بخش نظرات مطرح کنید! همچنین فراموش نکنید که با من در ارتباط باشید: