Back-End

6 nov, 2012

Raspando dados (Scrapping) de sites com Python, requests e lxml

Publicidade

Scrapping ou raspagem de sites é a técnica utilizada para obter informações de um determinado site de forma automatizada. Esse tipo de técnica pode ser utilizada para baixar imagens ou informações diversas que, se agrupadas corretamente, podem se tornar relevantes (como por exemplo scrapping em sites governamentais).

No meu caso, escrevi um pequeno programa para obter as imagens deste site. Utilizei a linguagem Python, pois para mim, ela é extremamente rápida para prototipar algo; utilizei também as bibliotecas requests e lxml (sendo que essas duas podem ser substituídas pelo urllib2 e BeautifulSoup).

Definições

  • Requests / urllib2: São bibliotecas utilizadas para efetuar o acesso a sites;
  • lxml / Beautifulsoup: São bibliotecas utilizadas para manipular HTML;
    Nota: lxml, porém, não tem a manipulação de HTML como sua função principal, mas sim a manipulação de arquivos XML.

Instalando o Requests e lxml

Para efetuar a instalação dessas bibliotecas, utilizaremos o pip:

pip install requests lxml

Caso essas bibliotecas já estejam instaladas, o pip informará; senão ele efetuará o download e instalação delas.

Código do Scrapper

import requests
from lxml.html import fromstring
import os

def connect(url):
    return requests.get(url)

def parser(page):
    els = fromstring(page.text).cssselect('a')
    total_els = len(els)
    for index, el in enumerate(els):
        if el.get('href').__contains__('?id'):
            page = fromstring(connect('http://www.coloring-book.info/coloring/%s' % el.get('href')).text)
            dir_image = page.cssselect('img.print')[0].get('src')

            directory = dir_image.split('/')[0]

            if not os.path.exists(directory):
                os.makedirs(directory)

            print "Saving %s / %s" % (index, total_els)
            open(dir_image, 'wb').write(connect('http://www.coloring-book.info/coloring/%s' % dir_image).content)

def run():
    url = 'http://www.coloring-book.info/coloring/'
    links = fromstring(connect(url).text).cssselect('center a')

    for link in links:
        if link.text_content() != '':
            print 'Scrapping: %s' % link.text_content()
            page = connect(url + link.get('href'))
            parser(page)

Utilizando o Scrapper

Eu não coloquei um método __main__, pois nesse caso eu prefiri chamar o script utilizando o modo interativo do Python (onde ele roda o arquivo e abre o prompt do REPL para que eu possa executar os comandos).

python -i scrapper.py 
>>>

Se tudo estiver correto, será exibido o prompt do Python aguardando um comando. Fiz um comando chamado run(), que busca todos links na página inicial e vai entrando em um por um, buscando as imagens e salvando no diretório correspondente.

Caso voce queira baixar somente alguns links específicos, uma opção é utilizar o scrapper da seguinte forma:

python -i scrapper.py
>>> parser(connect('http://www.coloring-book.info/coloring/coloring_page.php?id=176'))

Nesse caso, baixará somente as imagens que estiver no link referente ao id 176.

python -i scrapper.py
>>> ids = ['92', '15', '215']
>>> [parser(connect('http://www.coloring-book.info/coloring/coloring_page.php?id=%s' % id)) for id in ids]

Agora, a ideia foi baixar todas as imagens dos links que estiverem na lista ids.

Espero que seja útil e que esse script possa servir como base para outros scripts que vocês precisem escrever.