Como fazer scraping de repositórios públicos do GitHub usando Python?

Comentários: 0

Neste artigo, analisaremos como raspar os repositórios do GitHub usando Python. Analisaremos bibliotecas bem conhecidas como BeautifulSoup e Requests e daremos uma explicação detalhada durante a construção do script de raspagem do GitHub para que você possa acompanhar facilmente.

Porquê fazer scraping dos repositórios do GitHub?

O que é o Github scraping e para que serve? Existem inúmeros objectivos para a sua utilização, mas os mais frequentes incluem:

  • Para monitorizar os avanços tecnológicos. A monitorização de estrelas e repositórios é uma excelente forma de acompanhar as tendências das linguagens de programação, estruturas e bibliotecas. Esta informação pode ser muito importante quando se trata de tomar decisões relacionadas com a implementação de tecnologias, desenvolvimento de competências ou afetação de recursos.
  • Utilizar um repositório de programação. No GitHub pode ser encontrada uma infinidade de projectos, exemplos e soluções de código aberto. Por conseguinte, uma enorme quantidade de conhecimentos e técnicas de programação úteis para fins educativos, para melhorar as competências de programação e para a compreensão da implementação da tecnologia estão prontamente disponíveis na plataforma.

O GitHub não só oferece alojamento para repositórios, como também tem uma enorme base de utilizadores e uma grande reputação que o torna uma opção fiável.

A informação armazenada no GitHub é útil para seguir os padrões de progressão tecnológica, bem como para melhorar o desenvolvimento de software. Esta informação é fundamental para acompanhar os concorrentes no mundo da tecnologia da informação.

Bibliotecas e ferramentas essenciais para a recolha de dados do GitHub

Quando se trata de fazer scraping de uma página web, a linguagem mais fácil de trabalhar é Python, uma vez que as suas bibliotecas e módulos são muitos. Para fazer scraping Python no Github, é necessário adicionar os seguintes módulos:

  • requests: biblioteca cliente que contém os pedidos e as respostas HTTP e é a mais utilizada.
  • BeautifulSoup: sofisticado quando se trata de extrair detalhes de HTML, uma vez que inclui funcionalidades avançadas quando se trata de navegar e recuperar dados.
  • Selenium: lança um browser real e permite clicar e escrever nos elementos da página.

Isso pode ser feito facilmente com o uso de ferramentas de raspagem do Github. No entanto, vamos elaborar sobre como fazer isso.

Criar um script de raspagem do repositório GitHub com Beautiful Soup

Esta parte mostrará como raspar os repositórios do Github. Os passos importantes para criar o raspador consistem em:

  1. Criar o conjunto de base - o que implica o descarregamento do Python e das bibliotecas relevantes.
  2. A gravação do código HTML da página do GitHub.
  3. Examinar a apresentação da página para identificar os elementos necessários.
  4. Recolha de informações, o que implica obter os nomes das contas, as descrições e a quantidade de estrelas obtidas, entre outras coisas.
  5. Armazenamento de dados em tipos de sistemas de ficheiros.

A partir de agora, partilharemos os detalhes de todos estes passos, juntamente com um script de Github de raspagem totalmente formado.

Passo 1: Configurar o ambiente do seu projeto Python

Certifique-se de que tem Python na sua máquina. Em seguida, crie um novo ambiente virtual Python para iniciar o processo de raspagem do Github.


python -m venv github_scraper
source github_scraper/bin/activate  # Para MacOS e Linux
github_scraper\Scripts\activate     # Para Windows

Passo 2: Instalar as bibliotecas Python necessárias

Como dissemos antes, o BeautifulSoup e o Requests ajudarão a raspar os repositórios do GitHub. No ambiente virtual atualmente ativado, execute este comando para incluí-los nas dependências do seu projeto:


pip install beautifulsoup4 requests

Passo 3: Acessando e baixando a página de destino do GitHub

Selecione qualquer repositório a partir do qual gostaria de efetuar a recolha de dados do Github. Primeiro, defina a ligação numa variável e, em seguida, faça um pedido HTTP para obter o código da página.


url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)

Passo 4: Compreender e analisar a estrutura HTML

Para analisar o seu HTML, introduza-o no BeautifulSoup.


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

O construtor BeautifulSoup() precisa de ser fornecido com duas coisas.

  1. Uma cadeia de caracteres que contém o conteúdo HTML, armazenado na variável page.text.
  2. O analisador que a Beautiful Soup irá utilizar: "html.parser" é o nome do analisador HTML integrado no Python.

O HTML será analisado pelo BeautifulSoup e será gerada uma estrutura em árvore. Mais especificamente, a variável soup contém todos os métodos necessários para selecionar elementos relevantes da árvore DOM, tais como:

  • find(): devolve o primeiro elemento HTML que corresponde à estratégia de seleção fornecida.
  • find_all(): devolve uma lista de elementos HTML que correspondem à estratégia do seletor de entrada.
  • select_one(): devolve o primeiro elemento HTML que corresponde ao seletor CSS de entrada.
  • select(): devolve uma lista de elementos HTML correspondentes ao seletor CSS fornecido.

Passo 5: Analisar a página de destino para obter dados relevantes

Aqui está outro passo importante: escolher elementos HTML simples e extrair dados do Github a partir deles. Este passo precede a escrita do script Python para os repositórios do Github.

Antes de fazer scraping do Github, familiarize-se com a própria página web. Depois disso, abra as ferramentas de desenvolvimento clicando em F12. Agora que abriu o código, vai reparar que muitos elementos da página não têm classes ou atributos únicos que facilitem a navegação para o elemento adequado. Percorra a página e prepare-se para extrair dados.

Passo 6: Extrair detalhes do repositório

Agora estamos prontos para criar um script Python que nos ajudará a raspar os repositórios do GitHub. Este script pode extrair informações úteis armazenadas no GitHub, como estrelas, descrições, últimos commits, etc. Para isso, precisamos de especificar as caraterísticas necessárias e obter os valores de texto correspondentes.

  • Nome do repositório:
    
    repo_title = soup.select_one('[itemprop="name"]').text.strip()
    

    O atributo itemprop="name" tem um valor de atributo que tem uma identidade única, pelo que o recuperamos. Os campos de texto no GitHub têm geralmente espaços e caracteres de nova linha e podem ser limpos utilizando strip().

  • Ramo atual:
    
    git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
    

    Preste atenção ao facto de não existir um método mais simples de selecionar o componente HTML que contém o título do ramo principal. O que é que pode fazer? Escolher uma classe que seja única e obter o texto.

  • Último compromisso:
    
    relative_time_html_element = soup.select_one('relative-time')
    latest_commit = relative_time_html_element['datetime']
    

    Observámos que a etiqueta relative-time, onde foi armazenado o último commit do utilizador, já estava selecionada e a data foi selecionada através de datetime.

Recolher as informações que se encontram do lado esquerdo: descrição, estrelas, vistas, bifurcações.

  • Descrição:
    
    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()
    
  • Estrelas:
    
    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(',', '')
    
  • Vistas:
    
    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(',', '')
    
  • Garfos:
    
    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(',', '')
    

Passo 7: Recolha e análise de ficheiros Leiame

O ficheiro readme é muito importante. Ele fornece descrições dos repositórios e instruções sobre como implementar o código. No caso de verificar o ficheiro readme.md, pode ver que ligação tem:


https://raw.githubusercontent.com///readme.md

Uma vez que temos , podemos criar programaticamente o URL utilizando uma cadeia de caracteres f, utilizá-lo e fazer um pedido HTTP para obter o código do ficheiro.


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

Lembre-se de verificar o erro 404 para evitar guardar o conteúdo da página web 404 do GitHub se o repositório não tiver um ficheiro readme.

Passo 8: Organizar e armazenar os dados extraídos de forma eficiente

Todas as informações serão armazenadas num único dicionário para que possamos escrevê-las facilmente num ficheiro 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

Passo 9: Exportar dados extraídos no formato JSON

Vamos aproveitar a biblioteca Python incorporada para analisar os dados e armazená-los no formato JSON, uma vez que é perfeito para estruturas aninhadas, como no nosso caso, quando os artigos têm listas.


with open('github_data.json', 'w', encoding='utf-8') as json_file:
  json.dump(repo, json_file, ensure_ascii=False, indent=4)

Passo 10: Integrar todos os passos num guião completo


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()

# última confirmação
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']

# descrição
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()

# estrelas
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(',', '')

# observadores
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(',', '')

# garfos
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)

Raspagem do Github: Conclusão

Examinamos o processo de criação de um script de raspagem do GitHub para repositórios com a ajuda de BeautifulSoup e Requests. Agora você sabe como acessar páginas da Web, extrair dados relevantes e codificá-los de uma maneira fácil de usar. Essas habilidades seriam úteis para analisar projetos bem conhecidos, rastrear alterações no código ou gerar relatórios.

No entanto, tenha o cuidado de fazer uma utilização sensata. Na maior parte das vezes, está disponível uma API para utilização no GitHub, que será mais simples e prática de trabalhar. Se decidir fazer web scraping, certifique-se de que cumpre as diretrizes do sítio e não bombardeia os servidores com demasiados pedidos.

Comentários:

0 Comentários