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:
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
0 comentário