Web Scraping com Python

Tempo de leitura: 3 minutos

Surge o desafio

Saiba como obter dados de websites sem api através de Python

Pouco tempo atrás foi apresentado ao nosso time de dev’s a seguinte proposta:

– Coletar informações de um website que não possuia API.

Como utilizamos em nossa stack Python, foi definido que dariamos preferência a alguma biblioteca(lib) desenvolvida em Python para construção da solução.

No decorrer do desenvolvimento, passamos por diversos obstáculos os quais motivaram o início desta série de artigos para nortear outros dev’s a chegarem também em uma solução para estas situações.

O início

Para iníciar precisaremos saber o que é Web Scraping, que basicamente é uma técnica usada para extrair conteúdos existentes em websites.

Para o desenvolvimento utilizaremos uma biblioteca escrita em Python chamada Scrapy, este framework facilita o nosso trabalho ele usa as outras bibliotecas do Python como requests e urllib, tornando assim, mais rápido e prático o nosso trabalho e posteriormente facilitando também o uso em conjunto de outras soluções como por exemplo o Selenium e conexão com banco de dados.

Hand on

Agora que sabemos quais tecnologias iremos utilizar, podemos dar andamento, vamos lá!

Primeiramento precisaremos instalar o Scrapy, para isso basta ir em seu terminal ou prompt e digitar o comando:

(aqui estou assumindo que você já possua conhecimentos sobre como inicar um novo virtualenv, com ele instalado, você terá acesso ao comando pip)

pip install scrapy

Pronto, o framework já está instalado agora basta definirmos o alvo para efetuar a raspagem.

Em nosso exemplo básico definiremos o Google como alvo, criaremos o arquivo google.py e o script ficará assim:

import scrapy

class GoogleSpider(scrapy.Spider):

name = "google"

allowed_domains = ["google.com"]

start_urls = ('//www.google.com/',)

def parse(self, response):

self.log('Hello World: {0}'.format(response.url))


Para excutar o script basta rodar o código:

scrapy runspider google.py

A saída desta execução deverá ser algo parecido com:

2018-01-14 23:17:03 [scrapy] DEBUG: Redirecting (301) to <GET //google.com/> from <GET //www.google.com/>

2018-01-14 23:17:03 [scrapy] DEBUG: Crawled (200) <GET http://google.com/> (referer: None)

2018-01-14 23:17:03 [google] DEBUG: Hello World: http://google.com/

2018-01-14 23:17:03 [scrapy] INFO: Closing spider (finished)

2018-01-14 23:17:03 [scrapy] INFO: Dumping Scrapy stats:

python

Bem simples não?

Vamos entender o que está acontecendo no código:

Basicamente nossa classe GoogleSpider possui uma herança de scrapy.Spider, temos o atributo start_urls que definem as urls alvos, poderiamos também utilizar método starts_requests que retorna uma lista de scrapy.Request.

O método scrapy.Request recebe dois parâmetros o primeiro é o atributo url( que terá o valor vindo de start_urls) e o segunto é um callback que terá método parse e sendo executado atráves de um yield.

Neste caso o script ficaria assim:

import scrapy

class GoogleSpider(scrapy.Spider):

name = "google"

allowed_domains = ["google.com"]

start_urls = ('//www.google.com/',)

def starts_requests(self):

yield scrapy.Request(url=self.start_urls , callback=self.parse)

def parse(self, response):

self.log('Hello World: {0}'.format(response.url))


Prontinho !

A saída deste código ao executa-lo deverá ser a mesma do código anterior, as diferenças foram que o código ficou mais legível e utilizamos um método starts_requests, que mais tarde utilizaremos ao nosso favor.

Por hoje é só, este foi um exemplo bem básico, apenas para introduzir a ideia, no próximo post avançaremos, até a próxima.

Esse texto foi escrito por Junior Cesar, desenvolvedor na Vulpi. Linkedin  Github

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *