Slide 1

Slide 1 text

Web Scraping com Python Ana Carolina Lopes de Souza

Slide 2

Slide 2 text

Ana Carolina Software Developer - Love Mondays Formada em Análise e Desenvolvimento de Sistemas anacls Contato: https://about.me/anacls

Slide 3

Slide 3 text

Data Scraping

Slide 4

Slide 4 text

▹ Raspagem de dados ▹ Técnica de extração ▹ Facilita a análise de dados Data Scraping

Slide 5

Slide 5 text

Web Scraping

Slide 6

Slide 6 text

▹ Técnica de raspagem para websites ▹ Permite alcançar informação mais limpa ▹ Percorrer páginas com mais rapidez Web Scraping

Slide 7

Slide 7 text

▹ Criar fontes de dados estruturadas ▹ Agiliza e facilita a manipulação e análise das informações ▹ Exemplo Love Mondays: ■ Raspa vagas de diversas fontes ■ Realiza tratamento dos dados ■ Disponibiliza todas as vagas num único site Para o que serve?

Slide 8

Slide 8 text

Como fazer?

Slide 9

Slide 9 text

▹ É possível fazer scraping usando várias linguagens ▹ Python é a linguagem mais utilizada para esse fim ▹ BeautifulSoup e Scrapy são as ferramentas mais conhecidas Como fazer?

Slide 10

Slide 10 text

Beautiful Soup? É de comer?

Slide 11

Slide 11 text

▹ Biblioteca Python (https://www.crummy.com/software/BeautifulSoup/bs4/doc/) ▹ Possui métodos que permitem fazer extração de forma simples ▹ Mais voltada para extração de conteúdos html e xml Beautiful Soup

Slide 12

Slide 12 text

Scrapy

Slide 13

Slide 13 text

▹ Framework Python (https://docs.scrapy.org/en/latest/) ▹ Voltado especificamente para scraping e crawling ▹ Possui funções mais complexas ▹ Preparado para resolver problemas maiores sem exigir muito esforço Scrapy

Slide 14

Slide 14 text

SHOW ME THE CODE!

Slide 15

Slide 15 text

Entendendo o HTML

Slide 16

Slide 16 text

Exemplo

“Se sentir medo, vai com medo mesmo”

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Raspagem de dados com BeautifulSoup Quantidade de mulheres parlamentares no mundo em 2017. Fonte: http://wdi.worldbank.org/table/WV.5 Código disponível no GitHub

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

import urllib from bs4 import BeautifulSoup url = "http://wdi.worldbank.org/table/WV.5" html = urllib.urlopen(url) soup = BeautifulSoup(html.read(), 'html.parser') tabela = soup.findAll('table', { 'class': 'indicators-table' })[1]

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

linhas = tabela.findAll('tr') for linha in linhas: pais = linha.find('td', { 'class': 'country' }).text

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

linhas = tabela.findAll('tr') for linha in linhas: pais = linha.find('td', { 'class': 'country' }).text quantidade = linha.findAll('td')[7].text print(pais + ' = ' + quantidade)

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

Raspagem de dados com Scrapy Previsão do Tempo Fonte: "https://www.climatempo.com.br/previsao-do-tempo/15-dia s/cidade/558/saopaulo-sp" Código scrapy disponível no GitHub

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

import scrapy class Previsao(scrapy.Spider): name = "previsao" start_urls = [ "https://www.climatempo.com.br/previsao-do-tempo/15-dias/cidade/5 58/saopaulo-sp" ]

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

def parse(self, response): dias = response.xpath('//div[contains(@id, "resumeDay")]')

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

def parse(self, response): dias = response.xpath('//div[contains(@id, "resumeDay")]') for dia in dias: dia_semana = dia.xpath('.//div[contains(@class, "title")]//p/text()[1]').extract_first().strip() data = dia.xpath('.//div[contains(@class, "title")]//p/text()[2]').extract_first().strip()

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

def parse(self, response): dias = response.xpath('//div[contains(@id, "resumeDay")]') for dia in dias: dia_semana = dia.xpath('.//div[contains(@class, "title")]//p/text()[1]').extract_first().strip() data = dia.xpath('.//div[contains(@class, "title")]//p/text()[2]').extract_first().strip() max_temp = dia.xpath('.//p[contains(@id, "tempMax")]/text()').extract_first() min_temp = dia.xpath('.//p[contains(@id, "tempMin")]/text()').extract_first()

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

def parse(self, response): dias = response.xpath('//div[contains(@id, "resumeDay")]') for dia in dias: dia_semana = dia.xpath('.//div[contains(@class, "title")]//p/text()[1]').extract_first().strip() data = dia.xpath('.//div[contains(@class, "title")]//p/text()[2]').extract_first().strip() max_temp = dia.xpath('.//p[contains(@id, "tempMax")]/text()').extract_first() min_temp = dia.xpath('.//p[contains(@id, "tempMin")]/text()').extract_first() desc = dia.xpath('.//div[contains(@class, "description-block")]//span/text()').extract_first()

Slide 45

Slide 45 text

print("Dia: " + dia_semana + data) print("Máxima: " + max_temp) print("Mínima: " + min_temp) print("Descrição: " + desc) yield{ 'dia_sem': dia_semana, 'data': data, 'max_temp': max_temp, 'min_temp': min_temp, 'desc': desc, }

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

▹ Love Mondays ▹ Operação Serenata de Amor ▹ Brasil IO Projetos que usam scraping

Slide 48

Slide 48 text

▹ Github do Marco Tulio Pires ▹ Repositório de treinamento do Masanori ▹ Livro Web Scraping com Python ▹ Site Oficial Scrapy ▹ Documentação Scrapy ▹ Learn Scrapy Referências de Estudo

Slide 49

Slide 49 text

Dúvidas?