Instantly share code, notes, and snippets.
Created
November 3, 2023 02:59
-
Star
(1)
1
You must be signed in to star a gist -
Fork
(0)
0
You must be signed in to fork a gist
-
Save Rehzende/660e6a4933d0a6e52f843a6f447553aa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "jJuVcEG5lgHS", | |
"outputId": "d68bf173-c2ac-42ae-d492-c2e8347d7d93" | |
}, | |
"outputs": [], | |
"source": [ | |
"%pip install beautifulsoup4" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "GhXgu-bmnRKi", | |
"outputId": "e050c15a-33a5-48ab-fb6c-4cdc746ac0d4" | |
}, | |
"outputs": [], | |
"source": [ | |
"from bs4 import BeautifulSoup\n", | |
"import requests, json\n", | |
"res = requests.get(\"<SHARED_LINK_GOPRO_PLUS\")\n", | |
"soup = BeautifulSoup(res.content, 'lxml')\n", | |
"scripts = soup.select('script')\n", | |
"scripts = [script for script in scripts]\n", | |
"for script in scripts:\n", | |
" if 'window.__reflectData' in script.text:\n", | |
" lista_de_objetos = json.loads(script.text[21:-1])\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "g0sYJRJPsU9V", | |
"outputId": "9b67c402-071a-49ff-eadb-cf1509e3a9f0" | |
}, | |
"outputs": [], | |
"source": [ | |
"print(f\"Quantidade de arquivos: {len(lista_de_objetos['collectionMedia'])} \\n\")\n", | |
"\n", | |
"\n", | |
"# for media in json_object['collectionMedia']:\n", | |
"# print(f\"FILENAME: {media['filename']}, TYPE {media['type']}\")\n", | |
"\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "7VdFIeBy2T-F", | |
"outputId": "13f7604f-ee30-45c6-85ed-8f6f45cef4df" | |
}, | |
"outputs": [], | |
"source": [ | |
"# Importar bibliotecas necessárias\n", | |
"import requests\n", | |
"import json\n", | |
"import os\n", | |
"\n", | |
"# Definir a lista de objetos com os dados dos vídeos/imagens\n", | |
"lista_de_objetos = lista_de_objetos['collectionMedia']\n", | |
"# Definir o nome da pasta onde os arquivos serão salvos\n", | |
"nome_da_pasta = 'downloads'\n", | |
"\n", | |
"# Criar a pasta se ela não existir\n", | |
"if not os.path.exists(nome_da_pasta):\n", | |
" os.mkdir(nome_da_pasta)\n", | |
"\n", | |
"# Definir o nome do arquivo JSON onde os resultados serão salvos\n", | |
"nome_do_json = 'resultados.json'\n", | |
"\n", | |
"# Criar uma lista vazia para armazenar os resultados\n", | |
"resultados = []\n", | |
"\n", | |
"# Percorrer a lista de objetos e fazer o download dos arquivos\n", | |
"for objeto in lista_de_objetos:\n", | |
" # Obter o id do objeto\n", | |
" id = objeto['id']\n", | |
"\n", | |
" # Verificar se o id já está nos resultados com status de sucesso\n", | |
" if any(resultado['id'] == id and resultado['status'] == 'sucesso' for resultado in resultados):\n", | |
" # Ignorar esse objeto e continuar para o próximo\n", | |
" continue\n", | |
"\n", | |
" # Montar a requisição para a API da GoPro usando o id\n", | |
" url = f'https://api.gopro.com/media/{id}/download'\n", | |
"\n", | |
" # Fazer a requisição e obter a resposta como um objeto JSON\n", | |
" resposta = requests.get(url).json()\n", | |
"\n", | |
" # Obter a url do arquivo a partir do caminho _embedded.files[0].url na resposta\n", | |
" url_do_arquivo = resposta['_embedded']['files'][0]['url']\n", | |
"\n", | |
" # Obter o nome do arquivo a partir da url\n", | |
" nome_do_arquivo = url_do_arquivo.split('/')[-1]\n", | |
" nome_do_arquivo = resposta['filename']\n", | |
"\n", | |
"\n", | |
"\n", | |
" # Definir o caminho completo onde o arquivo será salvo\n", | |
" caminho_do_arquivo = os.path.join(nome_da_pasta, nome_do_arquivo)\n", | |
"\n", | |
" # Tentar fazer o download do arquivo usando streaming\n", | |
" try:\n", | |
" # Criar um objeto de resposta com streaming ativado\n", | |
" r = requests.get(url_do_arquivo, stream=True)\n", | |
"\n", | |
" # Verificar se o código de status da resposta é 200 (OK)\n", | |
" if r.status_code == 200:\n", | |
" # Abrir o arquivo em modo de escrita binária\n", | |
" with open(caminho_do_arquivo, 'wb') as f:\n", | |
" # Definir o tamanho do pedaço (chunk) em bytes\n", | |
" tamanho_do_pedaco = 1024 * 1024\n", | |
"\n", | |
" # Obter o tamanho total do arquivo em bytes a partir do cabeçalho da resposta\n", | |
" tamanho_total = int(r.headers.get('content-length', 0))\n", | |
"\n", | |
" # Inicializar uma variável para armazenar o tamanho baixado em bytes\n", | |
" tamanho_baixado = 0\n", | |
"\n", | |
" # Percorrer os pedaços da resposta\n", | |
" for pedaco in r.iter_content(tamanho_do_pedaco):\n", | |
" # Escrever o pedaço no arquivo\n", | |
" f.write(pedaco)\n", | |
"\n", | |
" # Incrementar o tamanho baixado com o tamanho do pedaço\n", | |
" tamanho_baixado += len(pedaco)\n", | |
"\n", | |
" # Calcular a porcentagem de progresso\n", | |
" porcentagem = int(tamanho_baixado * 100 / tamanho_total)\n", | |
"\n", | |
" # Mostrar na tela o progresso do download\n", | |
" print(f'Baixando {nome_do_arquivo}: {porcentagem}%')\n", | |
"\n", | |
" # Fechar o objeto de resposta\n", | |
" r.close()\n", | |
"\n", | |
" # Mostrar na tela que o download foi concluído com sucesso\n", | |
" print(f'{nome_do_arquivo} baixado com sucesso!')\n", | |
"\n", | |
" # Adicionar um resultado com status de sucesso na lista de resultados\n", | |
" resultados.append({'id': id, 'status': 'sucesso', 'arquivo': caminho_do_arquivo})\n", | |
"\n", | |
" else:\n", | |
" # Mostrar na tela que o download falhou por causa do código de status\n", | |
" print(f'{nome_do_arquivo} não pôde ser baixado: código de status {r.status_code}')\n", | |
"\n", | |
" # Adicionar um resultado com status de erro na lista de resultados\n", | |
" resultados.append({'id': id, 'status': 'erro', 'motivo': f'código de status {r.status_code}'})\n", | |
"\n", | |
" except Exception as e:\n", | |
" # Mostrar na tela que o download falhou por causa de uma exceção\n", | |
" print(f'{nome_do_arquivo} não pôde ser baixado: {e}')\n", | |
"\n", | |
" # Adicionar um resultado com status de erro na lista de resultados\n", | |
" resultados.append({'id': id, 'status': 'erro', 'motivo': str(e)})\n", | |
"\n", | |
"# Abrir o arquivo JSON em modo de escrita\n", | |
"with open(nome_do_json, 'w') as f:\n", | |
" # Escrever a lista de resultados no arquivo JSON\n", | |
" json.dump(resultados, f, indent=4)\n", | |
"\n", | |
"# Mostrar na tela que todos os arquivos foram processados\n", | |
"print('Todos os arquivos foram processados!')\n" | |
] | |
} | |
], | |
"metadata": { | |
"colab": { | |
"provenance": [] | |
}, | |
"kernelspec": { | |
"display_name": "Python 3", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.10.11" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment