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.
O que é o Github scraping e para que serve? Existem inúmeros objectivos para a sua utilização, mas os mais frequentes incluem:
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.
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:
Isso pode ser feito facilmente com o uso de ferramentas de raspagem do Github. No entanto, vamos elaborar sobre como fazer isso.
Esta parte mostrará como raspar os repositórios do Github. Os passos importantes para criar o raspador consistem em:
A partir de agora, partilharemos os detalhes de todos estes passos, juntamente com um script de Github de raspagem totalmente formado.
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
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
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)
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.
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:
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.
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.
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().
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.
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.
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(',', '')
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.
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
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)
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)
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentários: 0