Web crawlers com Pyquery
Web Crawlers
Também conhecidos como web spiders, são robôs (agentes) que navegam pela internet lendo, copiando conteúdo das páginas para indexação do dado coletado.
Tão comuns no nosso dia-a-dia, as ferramentas de busca (Google, Yahoo, Bing, etc) usam os web crawlers para geração dos resultados de pesquisas.
Na indexação entra em cena o web scraping, muitas vezes confundido com o web crawler, mas que na realidade são complementares entre si.
Um web crawler em python
As atividades de um web crawler são:
- Crie uma lista de URLs (seeds) que deseja visitar.
- Pegue os links da página, chamados de crawl frontier.
- Sobre o crawl frontier, aplique o passo 1 e 2 para cada link encontrado.
Dos sites visitados são extraídas as informações pertinentes ao domínio do problema em questão. Por exemplo, no caso do Googlebot, o crawler do Google, o conteúdo de cada site é baixado para a indexação com o Google Index otimizando o tempo de resposta das buscas.
Para Python existem algumas bibliotecas que servem para crawling e uma delas é a Pyquery.
Pyquery vem com uma proposta de proporcionar na linguagem Python a mesma usabilidade do JQuery em Javascript.
Python 3.5
O método read_links (linha 24) recebe uma url (seed) passada para uma instancia de Pyquery (linha 25). Com esta instancia temos acesso a toda árvore de elementos da página no formato de um documento xml.
Na linha 30 percorro todas as tags <a> usando o método filter para verificar se a url atende uma certa regra, se não, o elemento é ignorado da lista. Depois para cada elemento eleito obtenho o link do atributo href (linha 31) através do método attr.
Pyquery permite o acesso às tags de uma página HTML usando a notação de CSS. Se quisesse ter todos os componentes da classe articles, simplesmente poderia usar:
crawler('.articles')
O objetivo do meu código é visitar três sites (seeds, linha 3) e pegar somente os links dos artigos técnicos de cada um (linha 18 a 20).
O restante do código cobre a lógica para filtrar somente os links relacionados a artigos.
Uma coisa que poderia fazer com esse código, para ficar mais próximo de um crawler real, é visitar os links de cada site e copiar o seu conteúdo e repetir o processo: listar, visitar, copiar recursivamente com todo novo link encontrado.
Explore outros métodos do Pyquery para enriquecer sua solução. Alguns métodos interessantes:
- text
- each
- find
- filter
- eq
- map
Aqui você encontra mais informações da API.