Escolar Documentos
Profissional Documentos
Cultura Documentos
DA INTERNET
Rio de Janeiro
Julho de 2021
Declaração de Autoria e de Direitos
iii
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
Escola Politécnica - Departamento de Eletrônica e de Computação
Centro de Tecnologia, bloco H, sala H-217, Cidade Universitária
Rio de Janeiro - RJ CEP 21949-900
iv
DEDICATÓRIA
Dedico este trabalho à minha mãe, que sempre me deu suporte em todos os
momentos da minha vida.
v
AGRADECIMENTO
vi
RESUMO
vii
ABSTRACT
With the constant expansion of global digitization , the use of the Internet becomes
more and more essential to all systems. Therefore, the extraction and consumption
of data coming from the world wide web is a common and necessary task for the
development of new applications and systems. For that reason, this project aims
to facilitate and speed up the consumption of data from the Web by proposing to
create an interface between the final application and the Internet pages that have
the data of interest. This is achieved by creating a generic API for Web Scrapping
that receives configurable requests regarding the site and the data that must be
extracted from the network, eliminating the need to program such a process when
developing a new system. The developed API works asynchronously, allows the
execution of multiple scrapping routines in different portals with one single request
and allows the extraction of data from web pages with dynamic content.
viii
SIGLAS
IO - Input/Output
ix
Sumário
1 Introdução 1
1.1 Tema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Delimitação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.4 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Fundamentação Teórica 4
2.1 Coleta Automatizada de Dados na Internet . . . . . . . . . . . . . . . 4
2.2 Páginas Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Páginas Web Dinâmicas . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 Web Scrapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.6 Execução Assı́ncrona . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.7 Soluções Existentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Proposta de Solução 12
3.1 Descrição do Problema . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Arquitetura da solução . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.1 Arquitetura do Web Scrapping . . . . . . . . . . . . . . . . . 16
3.2.2 Arquitetura da API . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3 Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.1 Classes de Entrada e Saı́da . . . . . . . . . . . . . . . . . . . . 18
3.3.2 Implementação dos endpoints . . . . . . . . . . . . . . . . . . 20
3.4 Instalação do Utilitário . . . . . . . . . . . . . . . . . . . . . . . . . . 23
x
3.5 Testes Realizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.5.1 Sites com HTML estático . . . . . . . . . . . . . . . . . . . . 27
3.5.2 Sites com HTML dinâmico . . . . . . . . . . . . . . . . . . . . 29
3.5.3 Testes Adicionais . . . . . . . . . . . . . . . . . . . . . . . . . 30
4 Conclusão 32
4.1 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2 Pontos passı́veis de melhoria . . . . . . . . . . . . . . . . . . . . . . . 33
Bibliografia 34
B Informações Complementares 39
B.1 Principais Seletores CSS . . . . . . . . . . . . . . . . . . . . . . . . . 39
xi
Lista de Figuras
xii
3.16 Definindo texto dos elementos de interesse no corpo do request POST para
o endpoint ”/auto” . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.17 Exemplo de retorno do endpoint ”/auto” quando atributo ”list url” é de-
finido. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.18 Exemplo de uso dos seletores CSS no endpoint ”/site”. . . . . . . . . . . 27
3.19 Exemplo de descoberta automática dos seletores CSS através do texto do
elemento no endpoint ”/auto”. . . . . . . . . . . . . . . . . . . . . . . 27
3.20 Exemplo de erro no endpoint ”/auto”, elemento possui classe mobile:mb-2
que não pode ser usada como seletor CSS. . . . . . . . . . . . . . . . . 28
3.21 Site do ’Ministério da Fazenda’ - texto de uma célula da tabela está divido
entre três elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.22 Exemplo de extração de dados de página com conteúdo dinâmico . . . . . 30
xiii
Lista de Tabelas
xiv
Capı́tulo 1
Introdução
1.1 Tema
Este trabalho tem como tema a coleta de dados de páginas da Internet, permitindo
um fácil acompanhamento de alterações em tais dados. Desta forma, o problema a
ser resolvido é simplificar a obtenção desses dados através da criação de uma API
para Web Scrapping.
1.2 Delimitação
Tem-se como delimitação do trabalho a criação de uma interface para extração
de dados da Internet, para que possam ser utilizados e processados por outros pro-
gramas. Deste modo, a aplicação desenvolvida limita-se a ser um serviço para for-
necimento de dados presentes em páginas da web.
1.3 Justificativa
Com a expansão constante da digitalização dos sistemas e, consequentemente, do
uso da Internet, o volume de dados disponı́veis na rede torna-se cada vez maior
[4, 5]. À vista disso, a necessidade do consumo de dados da web por aplicativos
e programas, seja para análise ou exibição, é recorrente. Ademais, esses dados
apresentam-se de forma não estruturada pelas páginas da rede e os sites que os
contêm raramente fornecem uma API gratuita para sua obtenção, sendo necessário
1
recorrer a soluções comerciais tendo em vista que as soluções de código aberto são
escassas e voltadas para usos especı́ficos.
Logo, o uso de Web Scrapping por aplicações para atingir seus objetivos finais é
corriqueiro, desviando o foco principal e gastando muito tempo desnecessariamente
no desenvolvimento de programas. As soluções existentes para este problema são,
em sua grande maioria, de cunho comercial ou muito especializadas - funcionando
apenas para coleta de dados de fontes especı́ficas.
1.4 Objetivos
O objetivo deste trabalho é, então, criar uma interface genérica para Web Scrap-
ping, possibilitando a coleta de dados independente da fonte e fornecendo-os para
consumo por outras aplicações. Por conseguinte, tem-se como objetivos especı́ficos:
1.5 Metodologia
O trabalho consiste na criação de uma API em python, usando como principais
bibliotecas: requests-html, usada como base para parte de Web Scrapping, e fastapi,
usada como base para criação da API.
A API recebe configurações referentes a quais sites e que dados desses sites de-
vem ser coletados através de um JSON enviado pelo método http POST. Após o
recebimento desse request pela API, ela baixa o HTML do site ( renderizando-o
2
previamente caso seja um site criado dinamicamente por Javascript ) e então faz a
busca dos dados requisitados, retornando-os para o usuário no formato JSON.
Para se definir quais dados devem ser coletados de uma página tem-se 2 opções:
passar os seletores HTML/CSS do elemento que se deseja extrair o texto na página,
ou passar o texto que se deseja de uma página base. Neste segundo caso a API
tentará definir qual é o seletor HTML/CSS que contém o texto desejado, e o usará
para fazer a busca nas outras páginas passadas na configuração.
https://github.com/anorneto/tcc_anor
3
Capı́tulo 2
Fundamentação Teórica
Entretanto, são poucos os sites que disponibilizam APIs para consumo de seus
dados, e, geralmente, quando os fazem impõem limites de volume ou frequência na
requisição de tais dados ou os disponibilizam com estruturas próprias. Mesmo com
a tentativa de criação de padrões para publicação e uso de dados na Internet, eles
mostram-se majoritariamente desestruturados e representados de formas distintas
ao longo da rede.
4
Segundo a W3C (World Wide Web Consortium) [8], ”[...] A abertura e flexibi-
lidade da Web criam novos desafios para editores e consumidores de dados, como
representar, descrever e disponibilizar os dados de uma maneira que seja fácil de en-
contrar e entender. Em contraste com bancos de dados convencionais, por exemplo,
onde existe um único modelo de dados para representar os dados e um sistema de ge-
renciamento (SGBD) para controlar o acesso aos dados, os dados na Web permitem
a existência de várias maneiras de representar e acessar os dados.”
O CSS (Cascading Style Sheets) é uma linguagem de estilo usada para descrever
a apresentação de documentos escritos em linguagens de marcação [12], no caso de
páginas da Web o CSS é usado para definir o estilo dos elementos do documento
HTML. Essa estilização dos elementos da página pode ser feita direto no documento
HTML ao se setar a propriedade style do elemento, ou através de seletores definidos
nos elementos da página e definindo-se a aparência desses seletores em um arquivo
separado (.css). No CSS, os seletores podem ser do tipo id (identificador único para
cada elemento do documento ) ou class(identificador que pode estilizar múltiplos
elementos em um documento ).
5
Figura 2.1: Exemplo de Documento HTML. Código do documento a esquerda e rende-
rização pelo navegador a direita.
6
A manipulação do HTML para gerar páginas dinâmicas pode ser feita de 2 formas :
client-side rendering e server-side rendering[14]. No client-side rendering o próprio
navegador do usuário é responsável por modificar o HTML da página que está
sendo exibida através da execução do script em Javascript presente na página. Já
no server-side rendering o HTML dinâmico é gerado no servidor de acordo com
interações do usuário vindas do navegador, onde modifica-se o conteúdo do HTML
somente na navegação entre páginas.
Para lidar com páginas dinâmica nesse projeto faz-se o uso da biblioteca pyppeteer
[15], que é a adaptação em Python de uma famosa biblioteca feita em Javascript
chamada puppeteer. A biblioteca pyppeteer [15] faz o uso de um navegador sem
interface gráfica para renderizar o conteúdo das páginas geradas dinamicamente por
Javascript, retornando o HTML já processado pelo navegador.
2.4 API
API é a sigla para Application Programming Interface (em portugês, Interface de
Programação de Aplicações), e é um serviço para ser utilizado por outras aplicações,
fornecendo dados tratados e funções de forma transparente e abstraindo os detalhes
relacionados a implementação [16]. Uma API é responsável por receber requisições
de outras aplicações e retornar os resultados destes requerimentos.
Quando usada no contexto Web, uma API define especificações de como receber
requisições através do protocolo HTTP e da estrutura de suas respostas, geralmente
7
nos formatos JSON ou XML. A API disponibiliza suas funções para execução por
uma aplicação cliente através de endpoints, que são URLs definidas pela API onde
o serviços disponibilizados podem ser acesados[16]. A comunicação entre a API e
a aplicação cliente da-se através de requisições da aplicação cliente nos endpoints
da API utilizando o protocolo HTTP. Os principais métodos do protocolo HTTP
utilizados na comunicação com uma API Web são o HTTP GET e o HTTP POST;
ambos retornam resultados para aplicação requerente porém apenas o método HTTP
POST envia informações para a API.
8
De posse dos dados coletados da página, o programa de Scrapping os fornece
reorganizados de forma estruturada, de modo que possam ser utilizados por outros
programas.
9
Figura 2.3: Ilustração dos tipos de execução. Tarefas são representadas por cores dife-
rentes e os eixos indicam o tempo corrido.
10
mensal que geralmente tem valor de entrada entre U$30 e U$50, podendo chegar até
planos de U$ 900 no caso da octoparse [27] , e oferecem diversas funções, como: ren-
derização de páginas dinâmicas, rotação de IP através do uso de proxy, exportação
automática de dados, entre outros. Algumas dessas soluções oferecem planos gra-
tuitos, que apesar de limitados em relação a funcionalidades e a quantidade de
requisições diárias, servem para testar a qualidade dos serviços oferecidos; sendo
alguma delas: octoparse [27], parsehub [28], scrappingbot [29]. A solução comercial
que mais se assemelha com a proposta desse trabalho é a webscrapper [30], visto que
oferece uma API para configuração dos scrappers e obtenção dos dados.
11
Capı́tulo 3
Proposta de Solução
12
Figura 3.1: Exemplo de seletor CSS [2]
13
principal e atrasa o desenvolvimento da aplicação final. Outrossim, tem-se também
como objetivo automatizar o máximo possı́vel do processo de Web Scrapping, reti-
rando a necessidade da definição manual dos seletores CSS que contém os dados de
interesse, ao fazer-se o processo inverso do usual, onde o usuário define o texto de
interesse e a aplicação descobre o seletor CSS de interesse a ser usado em páginas
similares.
O serviço proposto tem a função de ser uma interface para extração de dados
de páginas da Internet, fornecendo os dados extraı́dos de forma estruturada para
serem consumidos por outras aplicações. Além disso, o programa deve ser de fácil
utilização e instalação, e deve permitir o recebimento de configurações para que
funcione independente da fonte (site) de onde os dados estão sendo extraı́dos.
Isto posto, desenvolveu-se uma API para extração de dados da Web em Python,
que é uma linguagem de programação de alto nı́vel, interpretada e orientada ao
objeto. Ela foi escolhida por ser disponibilizada com uma licença open-source, ter
executáveis para os principais sistemas operacionais de computadores (Windows,
Linux e Mac OS) e por ser muito utilizada por desenvolvedores, tendo uma grande
comunidade e diversas bibliotecas disponı́veis.
14
executadas de forma assı́ncrona pelo programa, permitindo que não fique travado
em apenas uma tarefa e possa continuar recebendo requisições em seus endpoints.
As respostas da API são também no formato JSON, trazendo estrutura e pratici-
dade para os dados extraı́dos da Internet e facilitando seu consumo pelas aplicações
finais.
Figura 3.3: Arquitetura da solução - na parte superior temos as classes de Web Scrapping
com o sufixo Scrapper, e na parte inferior os endpoints da API.
15
de páginas dinâmicas da Internet e extração do seu HTML). Na parte referente à
API usa-se as bibliotecas FastApi [31] (para estruturação da API e definição de
endpoints assı́ncronos) e Asyncio [25] (para execução assı́ncrona de tarefas).
Para realização do Web Scrapping tem-se três Classes (ver Figura 3.4) definidas
no arquivo Crawlers.py, sendo a classe IBaseScrapper a classe pai, e AsyncScrap-
per e AutoScrapper as classes filhas. A classe pai IBaseScrapper define variáveis
necessárias para as configurações de scrapping, os métodos para inı́cio e término
das sessões de scrapping e um métodos abstrato chamado scrap, implementado pe-
las classes filhas (AsyncScrapper e AutoScrapper), que definem como a extração de
dados nos sites serão realizadas e a sua resposta.
16
3.2.2 Arquitetura da API
A API é estruturada em três endpoints ( Figura 3.5 ) que recebem requests HTTP
to tipo POST com as configurações de scrapping no corpo do request no formato
JSON. Tais endpoints executam o método de scrap da classe de scrapping pertinente
de forma assı́ncrona, com as configurações recebidas pelo request POST, e retornam
seu resultado. A API contêm dois endpoints que recebem seletores CSS ( campo
”selectors”), um para realizar scrapping em um único site ( endpoint ”/site”) e um
para vários sites ( endpoint ”/multisite”), que recebe uma lista de configurações no
formato ScrapConfig e internamente chama o método de scrapping de site único
para os n sites.
17
3.3 Implementação
Como dito anteriormente na Seção 3.2, o projeto foi desenvolvido na linguagem
de programação Python devido a quantidade de bibliotecas disponı́veis e a portabi-
lidade do programa quanto a ser executado em diferentes sistemas operacionais. Os
endpoints da API parametrizam como os métodos de Web Scrapping são configura-
dos e executados, e retornam para a aplicação cliente as respostas de tais métodos
com os dados extraı́dos de forma estruturada. Todas os endpoints e funções de
scrapping da API funcionam de forma assı́ncrona para que ela possa realizar todas
as ações requisitadas pelas aplicações clientes de forma concorrente. As respostas
dos endpoints da API são sempre retornadas no formato JSON para que fiquem
estruturadas e possam ser utilizadas facilmente por outras aplicações.
A API define qual o formato da configuração que deve ser recebida em cada
um dos endpoints através das classes ScrapConfig e AutoScrapConfig (Figura
3.6). Tais classes são criadas pelos endpoints a partir do JSON recebido no corpo
do request HTTP POST, e seus atributos são passados como parâmetros para as
funções de scrapping pertinentes a cada endpoint. Tem-se em comum entre as classes
de configuração os campos:
response as list - define se a resposta deve ser dada no formato de lista, onde
separa-se na resposta o nome dos campos selecionados para extração em uma
lista e os valores extraı́dos em outra. Utilizado principalmente para melhor
estruturação de dados extraı́dos de tabelas.
render page - define se o HTML da página deve ser renderizado pela bibli-
oteca pyppeter [15] em segundo plano em um navegador sem interface gráfica
(Chromium Headless) antes da extração dos dados. Utilizado para extração
de dados de páginas criadas dinamicamente com javascript.
18
Os campos response as list e render page possuem valor padrão definido como
falso, pois são campos opcionais dado que servem para tratar os problemas es-
pecı́ficos descritos. Para a classe ScrapConfig, os seletores CSS são definidos por
um dicionário onde a chave é o nome do campo que conterá o dado extraı́do e o valor
é o seletor CSS de onde deve-se extrair o dado requerido. Na classe AutoScrap-
Config define-se os textos dos elementos de interesse através do campo ”strings”,
que é um dicionário no modelo ”nomeCampoResposta”:”textoDoElemento”.
19
1 class ScrapResponse ( BaseModel ) :
2 config_name : str
3 url : str
4 render_page : bool = False
5 headers : List [ str ] = None
6 items : Union [ Dict [ str , List [ str ]] , List [ List [ str ]]]
7
20
texto presente nos seletores CSS especificados, e retorna a resposta de tal método
para a aplicação cliente. Para uma melhor taxa de sucesso na extração dos dados dos
documentos HTML remove-se elementos raiz desnecessários como as tags <script >
e <head >, procurando-se os dados de interesse apenas nas tags pertencentes a tag
raiz body, que representa o corpo da página.
21
Figura 3.9: Código do endpoint “/multisite”, uso da função gather() para execução de
tarefas em concorrência.
body até o elemento final com suas classes) e ”last”( elemento final com suas clas-
ses), ver Figura 3.10 . Neste caso, a resposta deste endpoint é definido pela classe
AutoScrapResponse.
Caso seja passado uma lista de URLs para o campo ”list url”, usa-se os seletores
CSS encontrados para realização do scrapping em tais sites chamando-se interna-
mente o endpoint ”/multisite” - de forma concorrente ao fazer-se uso da função
gather(). Isto é útil quando quer-se coletar dados de forma automatizada de várias
páginas no mesmo domı́nio que possuem a mesma estruturação dos elementos, tal
como em sites de notı́cias, supermercado, fóruns.
Quando o dado requerido encontra-se em uma tabela faz-se uma tratativa diferente
para se definir o elemento que contém o dado. Tendo em vista que colunas diferentes
da tabela podem possuir as mesmas classes, para que o seletor CSS do elemento de
interesse seja definido corretamente é determinado o ı́ndice da coluna correspondente
22
ao elemento, que é adicionado ao final dos seletores CSS encontrados através do
seletor de posição ”:nth-of-type”.
23
Para instalar a aplicação no sistema deve-se abrir o terminal na pasta do traba-
lho e rodar o comando ”pip install .”, que instalará as bibliotecas necessárias para
execução do projeto automaticamente. Desse modo, a aplicação poderá ser inicia-
lizada de qualquer pasta pelo terminal executando o comando ”tcc-anor”( Figura
3.13 ).
https://github.com/anorneto/tcc_anor
24
coleção de requests de nome ”Colecao Testes Insomnia.json” disponı́vel na pasta
”Testes” do projeto ( ver Figura 3.14 ).
Figura 3.15: Definindo seletores CSS no corpo do request POST para o endpoint ”/auto”
25
Para a descoberta do seletor CSS de um elemento através do uso do endpoint
”/auto”, deve-se enviar no JSON de configuração os textos dos elementos de interesse
no atributo ”strings”, no formato ”nomeCampo:” ”textoDoElemento” ( ver Figura
3.16). Caso seja passada uma lista de sites através do campo ”list url”, será realizada
a extração de dados dos sites dessa lista usando-se os seletores CSS descobertos no
site base - definido no atributo ”base url” ( Figura 3.17 ).
Figura 3.16: Definindo texto dos elementos de interesse no corpo do request POST para
o endpoint ”/auto”
Figura 3.17: Exemplo de retorno do endpoint ”/auto” quando atributo ”list url” é defi-
nido.
26
3.5.1 Sites com HTML estático
Figura 3.19: Exemplo de descoberta automática dos seletores CSS através do texto do
elemento no endpoint ”/auto”.
27
também fica impossibilitada quando a célula da tabela é composta por diversos ele-
mentos, como no caso do site do ’Ministério da Fazenda’ onde o texto de uma célula
está dividido entre três elementos ”div” ( Figura 3.21).
Figura 3.20: Exemplo de erro no endpoint ”/auto”, elemento possui classe mobile:mb-2
que não pode ser usada como seletor CSS.
Figura 3.21: Site do ’Ministério da Fazenda’ - texto de uma célula da tabela está divido
entre três elementos .
28
CSS. Observou-se aumentos de até 14 vezes no tempo de execução dos scrappers
entre o endpoint ”/site” e ”auto” , como pode ser visto na Tabela 3.2. Dependo do
uso desta função pela aplicação cliente, o aumento de tempo observado pode não
ser um problema caso a aplicação não dependa de troca de dados em tempo real.
Nos demais sites testados com conteúdo dinâmico foi possı́vel extrair os dados de
interesse normalmente ( Figura 3.22 ), tendo como único ponto negativo a demora
para realização do processo. O tempo médio para realização de scrapping em páginas
com conteúdo dinâmico foi cerca de 10 segundos, chegando a pouco mais de 13
segundos em alguns casos, como no portal do ’Diário Oficial da União’.
29
Figura 3.22: Exemplo de extração de dados de página com conteúdo dinâmico
30
Site de Teste Tempo médio API - endpoint ”/site” Tempo médio Octoparse
Globo 532 ms 1.1 s
StackOverflow 758 ms 1.8 s
Anvisa 9.8 s 1.42 m
Dados Governo 2.11 s 27 s
31
Capı́tulo 4
Conclusão
4.1 Conclusão
Conforme apresentado no Capı́tulo 1.4, o objetivo deste trabalho foi criar uma in-
terface genérica para Web Scrapping que consiga extrair dados de diferentes fontes,
independente de codificações no programa especı́ficas para cada site. Foram apre-
sentadas alternativas comerciais que solucionam o problema da coleta automatizada
de dados da Internet (Capı́tulo 2.1 ), e algumas open-source que se assemelham a
este trabalho. Entretanto, dentre as soluções de código aberto não se tem nenhum
projeto que ofereça uma API para Web Scrapping nem que permita a realização do
Web Scrapping de forma dinâmica e programática.
Ao criar uma API que recebe requisições configuráveis de forma assı́ncrona para
realização de extração de dados da Internet e retorna respostas simples no formato
JSON, este trabalho atendeu todos os objetivos propostos. A criação de um endpoint
para scrapping automático facilita a descoberta dos seletores CSS corretos para os
dados de interesse e, junto da possibilidade da API receber vários links em uma
única requisição, agiliza o processo de extração de dados. O uso de polimorfismo e
herança na criação dos Scrappers agilizou o processo de desenvolvimento e manu-
tenção do projeto, e possibilita e inclusão de novos Scrappers e funcionalidades de
forma simples.
32
navegador em segundo plano - introduzindo grandes acrescimentos de tempo no
processo de coleta dos dados. Apesar de funcional em casos simples, a renderização
em segundo plano de sites dinâmicos mostrou-se inconsistente visto que não é total-
mente funcional, principalmente nos casos em que a página é totalmente construı́da
no navegador no momento do acesso por frameworks Javascripts.
33
Referências Bibliográficas
[5] CHANG, C.-H., KAYED, M., GIRGIS, M. R., et al., “A Survey of Web In-
formation Extraction Systems”, IEEE TRANSACTIONS ON KNOWLEDGE
AND DATA ENGINEERING, v. 18, pp. 1411 – 1428, 2006.
34
[10] FAYZRAKHMANOV, R. R., SALLINGER, E., SPENCER, B., et al., “Brow-
serless Web Data Extraction: Challenges and Opportunities”, WWW ’18: Pro-
ceedings of the 2018 World Wide Web Conference, pp. 1095 – 1104, 20018.
[16] MASSE, M., REST API Design Rulebook: Designing Consistent RESTful Web
Service Interfaces. O’Reilly Media, 2011.
[17] SCHRENK, M., Webbots, Spiders, and Screen Scrapers: A Guide to Developing
Internet Agents with PHP/CURL. No Starch Press, 2007.
[18] VARGIU, E., URRU, M., “Exploiting web scraping in a collaborative filtering-
based approach to web advertising”, Artificial Intelligence Research, v. 2, 2013.
[19] T, K., SEKARAN, K., D., R., et al., “Personalized Content Extraction and
Text Classification Using Effective Web Scraping Techniques”, International
Journal of Web Portals, v. 11, 2019.
35
[22] “Requests-HTML”, https://requests.readthedocs.io/projects/requests-
html/en/latest/, (Acesso em 10 Fevereiro 2021).
[23] PALACH, J., Parallel Programming with Python: Develop Efficient Parallel
Systems Using the Robust Python. Packt Publishing, 2014.
36
Apêndice A
Primeiramente, deve-se clicar com o botão direito nos dados de interesse da página
e selecione ”Inspecionar”( Figura A.1 ). Tal comando abrirá a janela de desenvolvi-
mento do navegador na aba ”Elementos”, exibindo o código fonte da página com o
elemento requerido selecionado.
37
Figura A.1: Descobrindo elemento HTML de interesse [3]
38
Apêndice B
Informações Complementares
39