Explore como funciona a World Wide Web, suas tecnologias centrais (URLs, HTTP, HTML) e como usar Python para acessar, baixar e processar conteúdo da Web, incluindo um crawler simples como estudo de caso.
Este material aborda os fundamentos da Web, APIs da biblioteca padrão do Python para Web e o uso de parsers HTML para extrair dados.
Variações de título (SEO) utilizadas para indicar ferramentas de otimização de indexação. Abaixo, as 3 variações e a escolha final:
<title>Web Semântica com Python: HTTP, HTML e Crawlers</title> <meta name="description" content="Explora a Web, HTTP, HTML e como Python usa urllib.request e HTMLParser para acessar, baixar e processar páginas, com estudo de caso de crawler."> <meta name="keywords" content="Web, HTTP, HTML, Python, urllib.request, HTMLParser, web crawler"> <meta property="og:title" content="Web Semântica com Python: HTTP, HTML e Crawlers"> <meta property="og:description" content="Explora a Web, HTTP, HTML e como Python usa urllib.request e HTMLParser para acessar, baixar e processar páginas, com estudo de caso de crawler.">
A World Wide Web é um sistema distribuído de documentos ligados por hyperlinks, hospedados em servidores Web. Ela funciona com a interação entre clientes (navegadores) e servidores Web, usando URLs para identificar recursos, HTTP como protocolo de comunicação e HTML como linguagem de publicação para páginas.
Exemplo rápido: um navegador (cliente) solicita uma página com HTTP; o servidor responde com o código 200 e o conteúdo HTML.
O módulo urllib.request fornece ferramentas para solicitar e baixar recursos da Web. A função urlopen(url) aceita um URL, retorna uma resposta HTTP completa (HTTPResponse) e permite ler o conteúdo com read().
Exemplo básico: from urllib.request import urlopen response = urlopen('http://www.w3.org/Consortium/facts.html') print(type(response)) # <class 'http.client.HTTPResponse'>
Para obter o conteúdo textual, leia os bytes com read() e decodifique para Unicode:
html = response.read() text = html.decode()
Observação: alguns recursos podem ser binários (vídeos, áudios), por isso read() retorna bytes; para HTML, decodificar para string facilita o processamento com operações de string.
O HTML é composto por elementos (tags). O módulo html.parser oferece HTMLParser, uma classe que pode ser estendida para processar tokens de HTML. O método feed(content) alimenta o HTMLParser com o conteúdo da página; os manipuladores (handle_starttag, handle_endtag, handle_data) são chamados conforme aparecem tokens.
Exemplos úteis:
Exemplo de Collector estende HTMLParser para coletar apenas URLs absolutas que utilizam HTTP. Usa urljoin(base_url, href) para transformar href relativo em absoluto e verifica se o esquema é http. Desenvolver uma classe MyHTMLParser que imprime a hierarquia de abertura/fechamento de tags, com recuo correspondente à profundidade na árvore do documento. Ignore tags que não exigem fechamento (como p e br). Observação: o exercício pede imprimir a estrutura com recuo, simulando a árvore DOM de um documento HTML.from html.parser import HTMLParser
class LinkParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == 'a':
for attr in attrs:
if attr[0] == 'href':
print(attr[1])
2.4 Collector: colete hyperlinks HTTP absolutos
from urllib.parse import urljoin
from html.parser import HTMLParser
class Collector(HTMLParser):
def __init__(self, url):
HTMLParser.__init__(self)
self.url = url
self.links = []
def handle_starttag(self, tag, attrs):
if tag == 'a':
for attr in attrs:
if attr[0] == 'href':
absolute = urljoin(self.url, attr[1])
if absolute[:4] == 'http':
self.links.append(absolute)
def getLinks(self):
return self.links
2.5 Exercício prático
class MyHTMLParser(HTMLParser):
# implementação esperada: imprimir "tag start" / "tag end" com indentação apropriada
pass
Resposta correta: C) Retorna um objeto HTTPResponse representando a resposta HTTP
O método urlopen() retorna um HTTPResponse, que encapsula a resposta do servidor e permite ler o conteúdo com read().
Resposta correta: B) handle_starttag é o manipulador usado para extrair atributos como href
Para obter o href, o código redefine handle_starttag e procura o atributo href entre attrs.
Resposta correta: C) urljoin(base, relative) transforma relativo em absoluto
Exemplo: urljoin('http://exemplo.org/pagina.html', '/contato') resulta em http://exemplo.org/contato.
Resposta correta: B) Coleta apenas URLs HTTP absolutas, transformando hrefs relativos via urljoin
Collector utiliza urljoin para tornar hrefs relativos em absolutos e filtra por http.