In questo articolo analizzeremo come effettuare lo scraping dei repository GitHub utilizzando Python. Passeremo in rassegna librerie note come BeautifulSoup e Requests e forniremo una spiegazione dettagliata durante la creazione di uno script per lo scraping di GitHub, in modo che possiate seguirlo facilmente.
Cos'è lo scraping di Github e a cosa serve? Ci sono numerosi scopi per utilizzarlo, ma i più frequenti sono:
GitHub non solo offre hosting per i repository, ma ha una base di utenti enorme e una grande reputazione che lo rende un'opzione affidabile.
Le informazioni archiviate su GitHub sono utili per tracciare i modelli di progressione della tecnologia e per migliorare lo sviluppo del software. Queste informazioni sono fondamentali per tenere il passo con i concorrenti nel mondo dell'informatica.
Quando si tratta di fare lo scraping di una pagina web, il linguaggio più facile da usare è Python, poiché le sue librerie e i suoi moduli sono molto numerosi. Per effettuare lo scraping di Github in Python, è necessario aggiungere i seguenti moduli:
Questo può essere fatto facilmente con l'uso degli strumenti di scraping di Github. Tuttavia, spieghiamo meglio come fare.
Questa parte mostrerà come effettuare lo scrape dei repository Github. I passi importanti per realizzare lo scraper consistono in:
D'ora in poi, condivideremo i dettagli di tutti questi passaggi insieme a uno script Github di scraping completamente formato.
Assicuratevi di avere Python sul vostro computer. Quindi, creare un nuovo ambiente virtuale Python per iniziare il processo di scraping di Github.
python -m venv github_scraper
source github_scraper/bin/activate # Per MacOS e Linux
github_scraper\Scripts\activate # Per Windows
Come abbiamo detto prima, BeautifulSoup e Requests sono utili per lo scraping dei repository GitHub. Nell'ambiente virtuale attualmente attivato, eseguire questo comando per includerli nelle dipendenze del progetto:
pip install beautifulsoup4 requests
Selezionare un repository da cui si desidera eseguire lo scraping di Github. Per prima cosa, definire il link in una variabile, quindi effettuare una richiesta HTTP per ottenere il codice della pagina.
url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
Per analizzare l'HTML, lo si inserisce in BeautifulSoup.
soup = BeautifulSoup(page.text, 'html.parser')
Il costruttore BeautifulSoup() deve essere dotato di due elementi.
L'HTML verrà analizzato da BeautifulSoup e verrà generata una struttura ad albero. In particolare, la variabile soup contiene tutti i metodi necessari per selezionare gli elementi rilevanti dall'albero DOM, come ad esempio:
Ecco un altro passo importante: scegliere semplici elementi HTML e fare lo scraping dei dati Github da essi. Questo passo precede la scrittura dello script Python per i repository Github.
Prima di eseguire lo scraping di Github, è necessario familiarizzare con la pagina web stessa. Quindi, aprire gli strumenti per gli sviluppatori facendo clic su F12. Dopo aver aperto il codice, si noterà che molti elementi della pagina non hanno classi o attributi unici che facilitino la navigazione verso l'elemento appropriato. Esaminare la pagina e prepararsi a estrarre i dati.
Ora siamo pronti a creare uno script Python che ci aiuterà a fare lo scraping dei repository GitHub. Questo script può estrarre informazioni utili memorizzate in GitHub come stelle, descrizioni, ultimi commit, ecc. Per questo, dobbiamo specificare le caratteristiche richieste e recuperare i valori di testo corrispondenti.
repo_title = soup.select_one('[itemprop="name"]').text.strip()
L'attributo itemprop="name" ha un valore di attributo che ha un'identità unica, quindi lo recuperiamo. I campi di testo su GitHub hanno in genere spazi e caratteri newline e possono essere puliti usando strip().
git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
Fate attenzione al fatto che non esiste un metodo più semplice per selezionare il componente HTML che contiene il titolo del ramo principale. Cosa si può fare? Scegliere una classe unica e ottenere il testo.
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
Abbiamo notato che il tag relative-time, in cui era memorizzato l'ultimo commit dell'utente, era già selezionato e la data era selezionata tramite datetime.
Raccogliere le informazioni che si trovano sul lato sinistro: descrizione, stelle, panorami, bivi.
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(',', '')
Il file readme è molto importante. Fornisce descrizioni dei repository e istruzioni su come implementare il codice. Se si controlla il file readme.md, si può notare quale collegamento ha:
https://raw.githubusercontent.com///readme.md
Dal momento che abbiamo , possiamo creare programmaticamente l'URL usando una stringa f, usarla e fare una richiesta HTTP per ottenere il codice del 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
Ricordarsi di controllare l'errore 404 per evitare di salvare il contenuto della pagina web 404 di GitHub se il repository non ha un file readme.
Tutte le informazioni saranno memorizzate in un unico dizionario, in modo da poterle scrivere facilmente in un 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
Sfrutteremo la libreria integrata di Python per analizzare i dati e memorizzarli nel formato JSON, che è perfetto per le strutture annidate, come nel nostro caso, quando gli articoli hanno delle liste.
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()
# ramo
main_branch = soup.select_one(
'[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
# ultimo commit
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
# descrizione
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()
# stelle
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(',', '')
# osservatori
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(',', '')
# forchette
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)
Abbiamo esaminato il processo di costruzione di uno script di scraping di GitHub per i repository con l'aiuto di BeautifulSoup e Requests. Ora sapete come accedere alle pagine web, estrarre i dati rilevanti e codificarli in modo semplice. Queste competenze sono utili per analizzare progetti ben noti, tracciare le modifiche al codice o generare report.
Ciononostante, è bene prestare attenzione a un uso sensato. Nella maggior parte dei casi, è disponibile un'API da utilizzare su GitHub, che sarà più semplice e pratica da utilizzare. Se decidete di fare web scraping, assicuratevi di rispettare le linee guida del sito e di non bombardare i server con troppe richieste.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commenti: 0