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:
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
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:
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ê!! ;)
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
http://alextrle.blogspot.com.br/2011/09/how-to-scrape-web-page-with-python.html
7 comentários:
Muito bom o seu blog, tem bastante conteúdo relevante.
Passando a te seguir no twitter para ficar por dentro dos novos post.
Obrigada Fernando!! É fato os webcrawlers são bem interessantes para serem estudados!! ;)
Boa tarde sera que teria como a gente conversa a respeito de como fazer um crawler?
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.
Ola Fabio, obrigada por avisar! Atualizei o Exemplo 03 com um script para buscar a previsão do tempo. :)
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?
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