{"id":17120154,"url":"https://github.com/matheusfacure/mf-spe","last_synced_at":"2025-07-14T00:38:18.372Z","repository":{"id":84062775,"uuid":"59491978","full_name":"matheusfacure/MF-SPE","owner":"matheusfacure","description":"Código em R usados na MF-SPE","archived":false,"fork":false,"pushed_at":"2016-07-22T15:15:48.000Z","size":51,"stargazers_count":3,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-01T20:33:07.550Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/matheusfacure.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-05-23T14:58:47.000Z","updated_at":"2021-10-11T00:59:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"cdf7d132-3dc7-4923-8853-526b0d308c53","html_url":"https://github.com/matheusfacure/MF-SPE","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/matheusfacure/MF-SPE","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheusfacure%2FMF-SPE","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheusfacure%2FMF-SPE/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheusfacure%2FMF-SPE/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheusfacure%2FMF-SPE/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matheusfacure","download_url":"https://codeload.github.com/matheusfacure/MF-SPE/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matheusfacure%2FMF-SPE/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265228189,"owners_count":23731067,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-14T17:59:00.559Z","updated_at":"2025-07-14T00:38:18.361Z","avatar_url":"https://github.com/matheusfacure.png","language":"R","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  Códigos de web scraping desenvolvidos durante o estágio no Ministério da Fazenda, Secretaria de Política Econômica.\n\u003c/p\u003e\n\u003cbr /\u003e\n\n## Conteúdo\n\n- [Coletando TAM](#coletando-tam)\n  - Funções\n  - Execução\n  - Instruções de uso\n- [Coletando GOL](#coletando-gol)\n  - Funções\n  - Execução\n  - Instruções de uso\n\n\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\n\n##Coletando TAM\n\nO código usado para coletar automaticamente preços de passagens na TAM (LATAM) depende fortemente do pacote RSelenium para automatização do Browser. Para entender como funciona o RSelenium, sugere-se a leitura deste tutorial: [How to drive a Web browser with R (and RSelenium)][1]. Outra boa fonte para aprender a usar o RSelenium são as *vignettes* disponíveis no CRAN do pacote: [RSelenium][2]. As funções que o RSelenium desempenha no programa são: 1) pegar o texto bruto das tabelas de viagens na TAM e 2) pegar a taxa de embarque das viagens.  \n  \nUma vez que tenhamos o texto bruto da tabela, o resto do programa trabalha para limpá-lo, extraindo apenas os preços dos voos diretos. Essa parte depende de manipulação de texto e da capacidade de identificar padrões no texto (como siglas aeroportuárias BSB, GRU, GIG). Para entender como isso é feito, é preciso ter uma noção básica nos metacaracteres do R. A 4º semana do MOOC em *Data Cleaning* da Johns Hopkins University, disponível no Coursera, fornece uma boa base em como lidar com textos no R. Em especial, recomenda-se as aulas [3][3] e [4][4] da semana.  \n  \nPor fim, caso você não tenha nenhum conhecimento em R, sugere-se ver os vídeos das duas primeiras semanas do curso [R-programming][5], da Johns Hopkins University, também disponível no Coursera.\n\n  \n\u003cbr /\u003e\n\n###Funções:  \n####1. `getDadosTAM(origem, dataIda, destino, dataVolta)`:  \nA função coleta os dados em formato bruto no site da TAM e devolve uma lista com dois elementos.\nO primeiro é o texto bruto da tabela das viagens. O segundo elemento é a taxa de embarque.  \nOBS: Infelizmente, a função só funciona se o browser ficar aberto na tela.  \n  \n**Argumentos:**  \n  * *origem*: a cidade de saída no site da TAM, dado pelo código do aeroporto (e.g BSB) ou pelo nome da cidade (e.g. Brasília).  \n  * *dataIda*: a data de ida da viagem, no formato \"dd/mm/aaaa\".  \n  * *destino*: a cidade de chegada no site da TAM, dado pelo código do aeroporto (e.g BSB) ou pelo nome da cidade (e.g. Brasília).  \n  * *dataVolta*: a data de volta da viagem, no formato \"dd/mm/aaaa\".  \n  \n####2.`getTamDirectPrice(textobruto)`:  \nA função pega o texto bruto da tabela de viagens, filtra apenas o voos diretos e limpa o texto para retornar apenas o valores dos preços.  \n  \n**Argumentos:**  \n  * *textobruto*: O texto bruto das tabelas de viagens. É o primeiro elemento retornado por `getDadosTAM()`.  \n  \n####3.`coletar(cidade, ida, volta, n = 60)`:   \nA função cria uma tabela de coleta de preços da cidade.  \n  \n**Argumentos:**  \n  * *cidade*: a cidade deve ser uma lista, em que o primeiro elemento é a cidade destino e o segundo, um vetor com as cidades de origem.  \n  * *ida*: a data de ida da viagem, no formato \"dd/mm/aaaa\".  \n  * *volta*: a data de volta da viagem, no formato \"dd/mm/aaaa\".  \n  * *n*: O número de linhas da tabela. Ele deve ser maior que o maior vetor de preços coletado, caso contrário, haverá um erro.   \n  \n####4.`coletarTudo(cidades, ida, volta, n = 60)`:   \nA função cria um documento Excel em que cada aba é a coleta de preços de passagens de uma cidade, efetuada por `coletar()`.  \n  \n**Argumentos:**  \n  * *cidades*: uma lista de cidades para realizar a coleta.  \n  * *ida*: a data de ida da viagem, no formato \"dd/mm/aaaa\".  \n  * *volta*: a data de volta da viagem, no formato \"dd/mm/aaaa\".  \n  * *n*: O número de linhas da tabela. Ele deve ser maior que o maior vetor de preços coletado, caso contrário, haverá um erro.  \n  \n###Execução:   \nPrimeiramente, criamos as cidades cujos preços das viagens devem ser coletados.\nDepois criamos as listas de cidade sob responsabilidade de cada pessoa. Em seguida, criamos as datas de ida e volta das viagens.\nPor fim, realizamos as coletas e salvamos os documentos Excel criados no *working directory* (wd) do R.  \n  \n###Instruções de Uso:\nEste tutorial pressupões que você tenha instalado no seu computador [(R)][7] (no mínimo versão 3.0.2), [RStudio][8], [Java][9] e [Firefox][11]. Além disso, pressupomos que você tenha o [Selenium Standalone Server][10] no seu *working directory*.\n\n1. Abra o RStudio e crie um novo sript de R (Ctrl + Shift + N). Copie o código do arquivo Coletando_TAM.R no script recém criado.\n2. Na linha 5, substitua o caminho pelo do seu *working directory*. Nas linhas 147 e i48, substitua as datas pelas datas de ida e volta pelas de seu interesse.\n3. Rode o programa da linha 1 à linha 152. Para isso, selecione essas linhas com o mouse e aperte Ctrl + Enter.\n4. As coletas de cada pessoa estão nas linhas 154 à 164. Recomenda-se fortemente rodar cada uma das coletas separadamente. Selecione as linhas da coleta e aperte Ctrl+Enter para rodar. Repita para as 4 coletas. Observação: é preciso que o computador fique aberto na página do Firefox em que a coleta esteja sendo feita, portanto o computador ficará indisponível enquanto a coleta estiver sendo feita. Caso a página seja minimizada ou fechada antes da coleta acabar, feche o RStudio e recomece do passo 1.\n5. (Opcional) Caso deseja saber o tempo que demorou a coleta, seleciona as linhas 166 à 168 é aperte Ctrl+Enter.\n6. Abra os documentos excel criados e converta os preços de texto para numérico. \n\n\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\n\n##Coletando GOL\n\nO código usado para coletar automaticamente preços de passagens na GOL depende fortemente do pacote RSelenium para automatização do Browser. Para entender como funciona o RSelenium, sugere-se a leitura deste tutorial: [How to drive a Web browser with R (and RSelenium)][1]. Outra boa fonte para aprender a usar o RSelenium são as *vignettes* disponíveis no CRAN do pacote: [RSelenium][2].  Os papeis do Rselenium no código é realizar a pesquisa das viagens na GOL e coletar o código fonte da página em HTML.  \n  \nUma vez que tenhamos o código fonte da página, o resto do programa trabalha para identificar o que no HTML são preços de voos diretos. É importante ressaltar que a coleta na GOL é feita com programação em uma linguagem de baixo nível, se comparada com a linguagem utilizada na coleta de preços na TAM. Por um lado, isso diminui a quantidade de abstração, tornando o código compreensível por qualquer um com nível básico em programação, por outro, torna o código mais extenso, com várias funções auxiliares e loops. Para entender melhor como funciona o programa, sugere-se a lição 1 do curso [CS101][6], da Udacity, na qual se ensina como achar links no código fonte de páginas (a lição é em Pyhton, mas pode ser facilmente traduzida para R).\n  \nPor fim, caso você não tenha nenhum conhecimento em R, sugere-se ver os vídeos das duas primeiras semanas do curso [R-programming][5], da Johns Hopkins University, também disponível no Coursera.  \n  \nOBS: Embora o código se fundamente na leitura de um texto em HTML, não é preciso ter conhecimento nessa linguagem para utilizá-lo ou entendê-lo\n\n\n\n\u003cbr /\u003e\n\n###Funções:  \n####1. `getPageGol(origem, dataIda, destino, dataVolta)`:  \nA função realiza a pesquisa da viagem e coleta o código fonte da página referente a essa viagem.  \n  \n**Argumentos:**  \n  * *origem*: a cidade de saída no site da GOL, dado pelo código do aeroporto (e.g BSB) ou pelo nome da cidade (e.g. Brasília).  \n  * *dataIda*: a data de ida da viagem, no formato \"dd/mm/aaaa\".  \n  * *destino*: a cidade de chegada no site da GOL, dado pelo código do aeroporto (e.g BSB) ou pelo nome da cidade (e.g. Brasília).  \n  * *dataVolta*: a data de volta da viagem, no formato \"dd/mm/aaaa\".  \n  \n\n####2.`getNextVDs`:  \nDado o código fonte da página, a função pega o próximo código que contenha o voo direto.  \n  \n**Argumentos:**  \n  * *page*: o código fonte da página da viagem na GOL em formato texto HTML.  \n  \n\n####3.`getAllVDs`:  \nA função é uma aplicação iterativa de `getNextVDs`, que vai escaneando a página em HTML e pegando todos os códigos que contenham voos diretos.  \n  \n**Argumentos:**  \n  * *page*: o código fonte da página da viagem na GOL em formato texto HTML.  \n  \n\n####4.`getNextPrice`:  \nDado o código fonte da página, a função pega o próximo código que contenha um preço de passagem.  \n  \n**Argumentos:**  \n  * *page*: o código fonte da página da viagem na GOL em formato texto HTML.  \n  \n\n####5.`getNextTax`:  \nDado o código fonte da página, a função pega o próximo código que contenha uma taxa de passagem.  \n  \n**Argumentos:**  \n  * *page*: o código fonte da página da viagem na GOL em formato texto HTML.  \n  \n\n####6.`getAllCosts`:  \nA função é uma aplicação iterativa de `getAllVDs`, `getNextPrice`, `getNextTax` que extrai do HTML da página apenas os voos diretos e em seguida, no código dos voos diretos, extrai os preços e as taxas das viagens.  \n  \n**Argumentos:**  \n  * *page*: o código fonte da página da viagem na GOL em formato texto HTML.  \n  \n\n####7.`coletar`:  \nA função é uma aplicação iterativa de `getAllCosts`. Para cada cidade origem de uma cidade destino passada, a função extrai os custos e a média das taxas de embarque e formata em uma tabela (**data frame**).  \n  \n**Argumentos:**  \n  * *cidade*: a cidade deve ser uma lista, em que o primeiro elemento é a cidade destino e o segundo, um vetor com as cidades de origem.  \n  * *ida*: a data de ida da viagem, no formato \"dd/mm/aaaa\".  \n  * *volta*: a data de volta da viagem, no formato \"dd/mm/aaaa\".  \n  * *n*: O número de linhas da tabela. Ele deve ser maior que o maior vetor de preços coletado, caso contrário, haverá um erro.  \n  \n\n####8.`coletarTudo(cidades, ida, volta, n = 60)`:   \nA função é uma aplicação iterativa de `coletar`. Cria um documento Excel em que cada aba é a coleta de preços de passagens de uma cidade, efetuada por `coletar()`.  \n  \n**Argumentos:**  \n  * *cidades*: uma lista de cidades para realizar a coleta.  \n  * *ida*: a data de ida da viagem, no formato \"dd/mm/aaaa\".  \n  * *volta*: a data de volta da viagem, no formato \"dd/mm/aaaa\".  \n  * *n*: O número de linhas da tabela. Ele deve ser maior que o maior vetor de preços coletado, caso contrário, haverá um erro.  \n  \n\n###Execução:   \nPrimeiramente, criamos as cidades cujos preços das viagens devem ser coletados.\nDepois criamos as listas de cidade sob responsabilidade de cada pessoa. Em seguida, criamos as datas de ida e volta das viagens.\nPor fim, realizamos as coletas e salvamos os documentos Excel criados no *working directory* (wd) do R.  \n  \n  \n###Instruções de Uso:\nEste tutorial pressupões que você tenha instalado no seu computador [(R)][7] (no mínimo versão 3.0.2), [RStudio][8], [Java][9] e [Firefox][11]. Além disso, pressupomos que você tenha o [Selenium Standalone Server][10] no seu *working directory*.\n\n1. Abra o RStudio e crie um novo sript de R (Ctrl + Shift + N). Copie o código do arquivo Coletando_GOL.R no script recém criado.\n2. Na linha 6, substitua o caminho pelo do seu *working directory*. Nas linhas 169 e 260, substitua as datas pelas datas de ida e volta pelas de seu interesse.\n3. Rode o programa da linha 1 à linha 265. Para isso, selecione essas linhas com o mouse e aperte Ctrl + Enter.\n4. As coletas de cada pessoa estão nas linhas 267 à 277. Recomenda-se fortemente rodar cada uma das coletas separadamente. Selecione as linhas da coleta e aperte Ctrl+Enter para rodar. Repita para as 4 coletas.\n5. (Opcional) Caso deseja saber o tempo que demorou a coleta, seleciona as linhas 279 à 281 é aperte Ctrl+Enter.\n6. Abra os documentos Excel criados e converta os preços de texto para numérico.\n7. (Eventual) Lidando com pop-ups. Muitos sites apresentam aleatoriamente avisos em pop-ups para seus usuários. Nos casos do site da GOL, já lidamos com esses pop-ups. Caso apareça um novo pop-up não previsto no programa isso irá impedi-lo de rodar normalmente e pode até resultar em um erro. Para lidar com o pop-up imprevisto, no Firefox, clique com o segundo botão do mouse no botão que fecha o pop-up e selecione \"Inspecionar Elemento\". O código fonte da página será mostrado, com uma linha destacada. Clique nessa linha com o segundo botão do mouse e selecione \"Copiar Seletor Único\". Na linha 26 do script do R, há uma parte que lida com pop-ups. Embaixo da linha 33, insira as seguintes 3 linhas com o seletor único recém copiado nos locais indicados (entre aspas).\n    `try(popup \u003c- mybrowser$findElement(using = 'css selector', \"Aqui o seletor único copiado\" ), silent = T)`  \n    `try(popup \u003c- mybrowser$findElement(using = 'css selector', \"Aqui o seletor único copiado\" ), silent = T)`\n    `try(popup$clickElement(), silent = T)`  \n  Repita os passos de 2 à 6.\n\n\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\n\n\n\n  \n\n[1]: http://www.computerworld.com/article/2971265/application-development/how-to-drive-a-web-browser-with-r-and-rselenium.html\n[2]: https://cran.rstudio.com/web/packages/RSelenium/\n[3]: https://d3c33hcgiwev3.cloudfront.net/_b3fbe6648dadbb7be034ad5fb60fe438_04_02_regularExpressions.pdf?Expires=1463788800\u0026Signature=OfL0JyB~mg6lY~wujE3ZCVGHZ2ubjLPFs8-aSSCgOy9M8~6I9LRVhvd-wUibfCJvJY-b6dJDOa5lGtJLCqMY62Z43dffRDv1vwTk-Xwc6XBr29Kc~tEhVECz7kfJPj5AUX6ByOW~Tm2JpSsRj~io~ohfp80EYt7cJKAhzpGAIaE_\u0026Key-Pair-Id=APKAJLTNE6QMUY6HBC5A\n[4]: https://d3c33hcgiwev3.cloudfront.net/_e8959793d0eb07f2390ff487700daf5f_04_03_regularExpressionsII.pdf?Expires=1463788800\u0026Signature=Cl-JQ3u-93Spipah1Spjvy1TuhXdw-OE9uTABIlYXOpJGsVNtlmK7RIae0xD2GpWTgrMB2qM64oHxfoDnTI0e73mKsyEeamd4yBxOH91~0445bZOqjhTNmrBiX~DmqQYyTMqJ0q1MNop0MjCrAz89M1jnMupHeX3JcWjcKL06x4_\u0026Key-Pair-Id=APKAJLTNE6QMUY6HBC5A\n[5]: https://www.coursera.org/learn/r-programming/home/welcome\n[6]: https://classroom.udacity.com/courses/cs101\n[7]: http://www.vps.fmvz.usp.br/CRAN/\n[8]: https://www.rstudio.com/products/RStudio/#Desktop\n[9]: https://www.java.com/pt_BR/download/\n[10]: http://www.seleniumhq.org/download/\n[11]: https://www.mozilla.org/pt-BR/firefox/new/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatheusfacure%2Fmf-spe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatheusfacure%2Fmf-spe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatheusfacure%2Fmf-spe/lists"}