quarta-feira, 14 de maio de 2014

Web Crawler em Python usando beautifulsoup4

Quem nunca precisou baixar uma serie de arquivos de um determinado site mas não teve paciência para ficar clickando em cada links de download? Recentemente tive que fazer isso e utilizei o urllib2 para executar minha requisições e o beautifulsoup4 para navegar no HTML. Vamos ver alguns exemplos básicos.

user_agent = "Mozilla/5.0 (X11; U; Linux x86_64; en-US) 
AppleWebKit/534.7 (KHTML, like Gecko) Chrome /7.0.517.41 
Safari/534.7"
opener = urllib2.build_opener() 
opener.addheaders = [('User-agent', user_agent)] 

html = opener.open("http://www.caelum.com.br").read()

Precisamos criar um objeto opener, este será responsável por executar nossas requisições através do método open, em seguida, chamamos o método read para ler a resposta da nossa requisição.

Também defini no cabeçalho da requisição (addHeaders) o attributo "User-agent".

Esse é o primeiro passo, obter o html, agora vem a mágica

soup = BeautifulSoup(html)

A classe BeautifulSoup é quem vai nos ajudar a navegar no html de maneira mais OO.
Digamos que precisamos encontrar todas as tags divs:

divs = soup.findAll('div')

Podemos inclusive definir algumas condições de pesquisa.
Vamos buscar todas as tags divs com o atributo class igual a "grupo"

divs = [div for link in soup.findAll('div')
    if div.get("class") == "grupo "]

Pronto, acabamos de definir um filtro de pesquisa.
E para fazermos o download de um determinado arquivo?

Digamos que a página em questão possui links das suas músicas preferidas, podemos criar um filtro que pesquise todos os link e em seguida execute cada um desses link para fazer o download do mp3.

link = [link for link in soup.findAll('a')
    if link.get("href").endswith(".mp3")]

Pronto, filtramos os links que terminam com a extensão mp3, agora vamos fazer o download desses arquivos:

for link in link:
    nome_arquivo = link[link.rfind("/"):]
    urllib.urlretrieve(nome_arquivo,"/tmp/"+nome_arquivo)

Com o método urlretrieve da biblioteca urlib baixamos e gravamos o arquivo, passando como primeiro parâmetro o nome do arquivo e o segundo onde ele será salvo.

Este foi um exemplo bem básico e trivial de como usar o BeautifulSoup, nos próximos post sobre o assunto, irei detalhar mais sobre algumas formas mais complexas de navegação, filtros e pesquisa.

O código completo do exemplo pode ser encontrado aqui.

Nenhum comentário:

Postar um comentário