13 de nov de 2012

Criando um Webcrawler em Python

     Os webcrawlers são processos automatizados para busca ou manutenção de sites (checar links e validação do código). Através dos crawlers temos os mecanismos de buscas do Google e Altavista!! Eles interagem com o ambiente através do uso de protocolos HTTP, SMTP, RSS, etc. O Googlebot usa o algoritmo do PageRank para classificar a ordem de importância dos sites. 
    Exitem questões legais para o uso de crawlers, por isso respeite as regras do robots.txt e suas políticas de cortesia.
     Os webcrawlers se identificam no servidor pelo User-Agent http header. Podemos ver esses dados usando o urllib2:

import urllib2
url = raw_input('url: ')
if 'http' not in url:
 url = 'http://'+url
resposta = urllib2.urlopen(url)
html = resposta.read()
print html.split('\n')[0]
print resposta.info()

    Agora vamos aos exemplos!! Para testar os códigos abaixo, é preciso instalar a biblioteca BeautifulSoup e o Requests: 
$ apt-get install python-bs4
$ easy_install beautifulsoup4
ou
$ pip install beautifulsoup4

$ pip install requests
ou
$ easy_install requests 

Exemplo 01:

from bs4 import BeautifulSoup
import requests
url = 'http://www.youtube.com/results?search_query=%(q)s'
busca = {
    'q': raw_input('>> Buscar: '),
}
r = requests.get(url % busca)
soup = BeautifulSoup(r.text)
titulo = [title.text for title in soup.findAll('h3')]
i = 0
for t in titulo:
 i+=1
 print str(i)+')',t

    Nesse exemplo foi utilizado a biblioteca beautiful soup, para processar o html e extrair os dados das páginas web de maneira simplificada e a biblioteca requests, que fornece a integração com os serviços web (usa o urllib3). Praticamente, o primeiro exemplo vai buscar pelos títulos com a tag h3 do url (no caso o site do youtube) pela função soup.findAll('h3')].

     Podemos também fazer uma busca por links:

Exemplo 02:

from bs4 import BeautifulSoup
import requests
import sys

def buscar_links(url):
    if 'http' not in url:
        url = 'http://'+url
    lista = []
    i = 0
    r = requests.get(url)
    soup = BeautifulSoup(r.text)
    for a in soup.findAll('a',href=True):
        link = a['href']
        i += 1
        lista.append(link)
        links = str(link).strip('[]').replace("u", "").replace("'", "")
        print str(i) + ") " + str(links)
    print "\n>> Total = %d \n" % i
    sys.exit()

for arg in sys.argv:
    if arg == "-l":
       url = raw_input('url: ')
       buscar_links(url)

     O segundo exemplo vai se conectar ao url pelo request.get(url), buscar pelas tags a href com a função soup.findAll('a', href=True), e adicionar cada url encontrada na lista através do lista.append(link). O str(links) vai converter os urls encontrados em string, retirando os caracteres de lista (colchetes) e das strings unicodes (u'). O sys.argv vai ler os argumentos da linha de comando, no exemplo foi utilizado o arg = "-l", então execute o script usando esse argumento: exemplo02.py -l (e depois digite o url para buscar os links).
     Você pode usar a sua criatividade para buscar o conteúdo de seu interesse (respeitando sempre o robots.txt), usando expressões regulares como filtro!! Como exemplo, criei um web scraper (busca conteúdos específicos) para ver a previsão do tempo pelo terminal:

Exemplo 03:

from bs4 import BeautifulSoup
import requests

estado=raw_input('Estado: ').lower()
cidade=raw_input('Cidade: ')
cidade=cidade[0].upper()+cidade[1::].lower()

site = 'http://www.tempoagora.com.br/previsao-do-tempo/'+estado+'/'+cidade
print '>> Site:',site,'\n'
r = requests.get(site)
soup = BeautifulSoup(r.text, "html5lib")

print '\n======[ Previsao do Tempo: ]======'
for ul in soup.find_all('ul', {'class': 'dsp-table day-info'}):
    for li in ul.find_all('li'):
        print li.text.replace("\t", " ").replace("\r", "").replace("\n", "")

print '\n======[ Proximas horas: ]======'
for ul in soup.find_all('ul', {'class': 'dsp-table next-hours-list'}):
    for li in ul.find_all('li'):
        print li.text.replace("\t", " ").replace("\r", "").replace("\n", "")      

       O terceiro exemplo vai abrir a página do Tempo Agora pelo requests.get(site), buscar pela tag ul com a classe "dsp-table day-info" em seguida ler todas as tags li e mostrar a previsao do tempo, o mesmo processo acontece com a busca das proximas horas. Assim não precisamos esperar carregar a página, procurar os links para ver o conteúdo, basta criar um script que ele faz tudo para você!! ;)

* Fontes:
http://herberthamaral.com/2010/02/criando-web-crawlers-em-python-parte-i/
http://www.ibm.com/developerworks/br/library/l-spider/
http://www.oxigenweb.com.br/artigos/pagerank-e-googlebot-como-funciona/
http://www.erickfernandes.com/post/2012/04/06/Web-Crawler-em-Python.aspx 
Building a webcrawler in python - Frank M., Harding University
http://alextrle.blogspot.com.br/2011/09/how-to-scrape-web-page-with-python.html


7 comentários:

Fernando Oliveira disse...

Muito bom o seu blog, tem bastante conteúdo relevante.
Passando a te seguir no twitter para ficar por dentro dos novos post.

Zeldani: disse...

Obrigada Fernando!! É fato os webcrawlers são bem interessantes para serem estudados!! ;)

Magno Dantas disse...

Boa tarde sera que teria como a gente conversa a respeito de como fazer um crawler?

Fabio Niglio disse...

Boa tarde, no ultimo exemplo não consegui fazer a execução do programa.
Digitava meu signo com a primeira letra maiúscula e não retornava nada.

zeldani disse...

Ola Fabio, obrigada por avisar! Atualizei o Exemplo 03 com um script para buscar a previsão do tempo. :)

otaku disse...

Ola, Gostei bastante do conteudo do seu blog e gostaria de saber o por que vc esta tao inativo... Por acaso vc tem algum meio de contato, como facebook, wapp, skype ou algo do tipo?

Bruno Lima disse...

Boa tarde! Parabéns pelo post!
Uma pergunta...
Como eu faço para integrar um cralwer simples exemplo, site de noticias, dentro do meu site utilizando django?
Obrigado!

Postar um comentário