7.1 06 - Scrapy - Projeto - Crawler - Telelista

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 38

Scrapy

Projeto Crawler Telelista

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Com tudo que aprendemos até agora temos


conhecimento para analisar um determinado
site e começar a retirar informações do
mesmo.
Neste projeto prático vamos pegar
informações do site da Telelista.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
O que vamos fazer não é ilegal pois estamos retirando
informações que estão disponíveis para qualquer um
na internet.
Como em qualquer mineração de dados na internet,
uma mudança no site fará com que nosso exemplo
pare de funcionar. Mas fica registrado o processo que
tive que seguir para conseguir retirar informações que
me interessavam. Tal processo pode lhe ajudar em
outros casos.
Python Web Scraping – Evaldo Wolkers
Scrapy
Projeto Crawler Telelista

Primeiro vamos criar nosso projeto.


Crie uma pasta no seu computador chamada
CrawlerTelelista e acesse a mesma via
prompt de comando/terminal para criarmos
o projeto.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Antes de começar a escrever o spider vamos


analisar o HTML do site e as requisições que
vamos executar.
O site é:
https:\\www.telelistas.net

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Pesquise a palavra-chave “farmacias”, UF igual a “ES”
e cidade igual a “Vitória”, por exemplo.
Será exibida uma
lista de produtos
relacionados à
farmácias. Clique
em farmácias e
Drogarias.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Será exibida uma


lista de farmácias
com endereço
e telefone.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Ao clicar com o botão direito e exibir o


código-fonte, podemos avaliar no HTML da
página se existe algum padrão para
apresentação dos dados.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Ao analisar o HTML observamos que existem


algumas tabelas com suas linhas e colunas
contendo as informações que precisamos.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Nome do estabelecimento:
O nome do estabelecimento está no texto de
uma tag “td” (coluna) cuja classe é
“nome_resultado_ag”.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Desta forma podemos pegar todos os nomes


apresentados na página e colocá-los em uma
lista. Faça o teste com o scrapy shell.
scrapy shell "https://www.telelistas.net/es/afonso+claudio/supermercados+e+hipermercados"

nomes = response.xpath('//td[@class="nome_resultado_ag"]//a/text()').extract()

In [2]: nomes
Out[2]:
['\nComercial Guifer', '\nSupermercados Mirante', '\nSupermercado Giestas', '\nBar e
Mercearia Meira', '\nSupermercado Schwambach E Tesch', '\nLevi Tesch']

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Telefone:
O telefone do estabelecimento está no texto
de uma tag “td” cuja classe é
“text_resultado_ib”.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Particularidades do telefone:
Existem tags “td” cuja classe é
“text_resultado_ib” e não são tags
relacionadas ao telefone.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Particularidades do telefone:
É um padrão em todos os registros de telefone aparecer o texto “Tel:” ou “PABX:”,
já na tag abaixo não existe esta informação no texto da tag “td”. Sendo assim,
podemos verificar se no text da tag existe uma dessas palavras, por exemplo.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Particularidades do telefone:
Os dois últimos números do telefone não são
exibidos, sendo substituídos por uma imagem
gerada pelo sistema. Esta é uma particularidade
importante. Foi feito desta forma exatamente
para evitar o uso de robôs.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Particularidades do telefone:
Após gerarmos uma lista de nomes, vamos gerar uma lista de
telefones da seguinte maneira:
telefones = response.xpath('//td[@class="text_resultado_ib" and contains(text(),"Tel")]/text()').extract()

In [4]: telefones
Out[4]:
Este será o resultado: ['\nTel: (27) 3735-25',
'\n',
'\nTel: (27) 3735-20',
'\n',
'\nTel: (27) 3735-21',
'\n',
Teremos que “limpar” este resultado. '\nTel: (27) 3735-16',
'\n',
'\nTel: (27) 3735-12',
'\n',
'\nTel: (27) 3735-13',
'\n']

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Navegação para próxima página:
Observe no final da página que existe o link “próxima”
para navegar para a próxima página (caso o resultado
retorne mais de uma página). Esse botão está na tag
link com a propriedade “rel” igual a “next”.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Navegação para próxima página:
Teste com:
scrapy shell "https://www.telelistas.net/es/vitoria/supermercados+e+hipermercados"

In [1]: proxima_pagina = response.xpath('//link[contains(@rel, "next")]/@href').extract_first()

In [2]: proxima_pagina
Out[2]: 'https://www.telelistas.net/es/vitoria/supermercados+e+hipermercados?pagina=2'

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Endereço:
O endereço do estabelecimento está na
propriedade text de uma tag “td” com a classe
igual a “text_endereco_ib”.

Podemos pegar uma lista de endereços com:


enderecos = response.xpath('//td[@class="text_endereco_ib"]/text()').extract()

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
“Mais telefones” ou “Ver telefone”:
Para estabelecimentos que possuem mais de um
telefone o site não mostra o número na primeira
página, ou mostra apenas um número exibindo
um link para ver os outros números.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
“Mais telefones” ou “Ver telefone”:
Ao procurarmos no “ES” pela cidade “Vila Velha”
teremos um exemplo de “Mais telefones”.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
“Mais telefones” ou “Ver telefone”:
Ao procurarmos em “SP” pela cidade “São Paulo”
teremos um exemplo de “Ver telefone”.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
“Mais telefones” ou “Ver telefone”:
Nos dois casos temos uma tag “a” dentro da tag
“td”, o que vai servir como referência para
ignorarmos o telefone da primeira página e entrar
no link exibido para pegarmos todos os telefones.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Página individual:
À partir deste ponto teremos uma página
específica diferente da página geral.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
<h1 class="nome_anun item">Epa Boa Praça Supermercados</h1>

<div id="telInfo" class="infoplus_text2 telInfo">


<div style="float: left;">
<img style="margin: 5px 10px 5px 0" border="0" width="20px" height="20px" src="https://img.telelistas.net/img/fone_icon.png"
alt="Telefones" title="telefone" />
</div>
<div style="float: left;">
<span>Tel: (27) 3332-47
<img src='https://www.telelistas.net/ImgFactory.ashx?t=6E79&s=4' style='vertical-align: bottom; margin-bottom: 1px;' alt='...’
/></span><br>
<span>Tel: (27) 3223-14
<img src='https://www.telelistas.net/ImgFactory.ashx?t=6E7D&s=4' style='vertical-align: bottom; margin-bottom: 1px;' alt='...’ />
</span><br>
<span>Tel: (27) 3322-47
<img src='https://www.telelistas.net/ImgFactory.ashx?t=6E78&s=4' style='vertical-align: bottom; margin-bottom: 1px;' alt='...'
/></span></div></div>
<input type="hidden" id="enderecoreg" value="Avenida Alberto Torres" />

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Página individual:
Com o código abaixo teremos quatro listas, sendo uma com o nome,
outra com os telefones, outra com os links das imagens que
complementam os telefones e outra com o endereço.

nome = response.xpath('//h1[contains(@class,"nome_anun")]/text()').extract()

telefones = response.xpath('//div[@id="telInfo"]//span/text()').extract()

imagens = response.xpath('//div[@id="telInfo"]//span//img/@src').extract()

endereco = response.xpath('//input[contains(@id,"enderecoreg")]/@value').extract()

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Tratando o endereço:
endereco = response.xpath('//input[contains(@id,"enderecoreg")]/@value').extract()

A tag usada retorna somente o nome da rua. Não temos


uma tag com o endereço completo identificada. A tag div
contendo o endereço completo é assim:
<div>Avenida Alberto Torres, 423<br>Jucutuquara - Vitória - ES</div>

Vou usar o endereço localizado com xpath para retornar o


texto de uma div que contenha o texto do endereço
encontrado. Ou seja, vou pegar o texto da div que contenha
“Avenida Alberto Torres”, baseado neste exemplo.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Abra o projeto no PyCharm e vamos começar


a escrever o spider.

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Para simplificar o exemplo, vamos gravar os dados em um
arquivo de texto e vamos fazer download da imagem que
representa os dois últimos números do telefone.
O exemplo pode ser evoluído para gravar os dados e a
imagem em um banco de dados.
Vou disponibilizar junto à aula os fontes utilizando banco
de dados Microsoft SQL Server. A biblioteca utilizada para
conexão com o banco de dados é a pyodbc. Neste
programa os dados capturados são gravados no banco de
dados e é gravado o endereço da imagem com os dois
números do telefone salva em disco.
Python Web Scraping – Evaldo Wolkers
Scrapy
Projeto Crawler Telelista
Vou citar algumas partes do programa que merecem atenção. Eu vou
passar a URL por parâmetro na chamada da função, vou salvar em uma
variável e depois passar para a requisição. Vou salvar também o tipo de
estabelecimento na variável self.ramo_atividade.

scrapy crawl telelista -a url="https://www.telelistas.net/es/afonso+claudio/supermercados+e+hipermercados"

def __init__(self, url=''):


super(SpiderTelelista, self).__init__()

url_desmontada = url.split("/")
self.ramo_atividade = url_desmontada[5]
self.url = url
def start_requests(self):
yield scrapy.Request(url=self.url, callback=self.parse)
Python Web Scraping – Evaldo Wolkers
Scrapy
Projeto Crawler Telelista
Temos dois estilos de URL que serão acessadas pelo
sistema. Um que busca por estado, cidade e tipo:
https://www.telelistas.net/es/afonso+claudio/supermercados+e+hiper
mercados

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
E outro que busca dados de um estabelecimento
específico:
https://www.telelistas.net/locais/es/vitoria/supermercados+e+hiperm
ercados/335521454/epa+boa+praca+supermercados

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista
Em cada caso o HTML gerado é diferente.
Sendo assim fiz uma validação para avaliar qual URL
está sendo processada.
A validação foi simples, contando o número de “/” na
URL, caso tenha 5 barras
(https://www.telelistas.net/es/afonso+claudio/supermercados+e+hipermercados)

é uma URL geral, caso tenha um número diferente é


uma URL de um estabelecimento específico
(https://www.telelistas.net/locais/es/vitoria/supermercados+e+hipermercados/335521454/epa+boa+praca+supermercados).

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Como o estado, a cidade e o tipo de


estabelecimento estão na URL, vou
desmontar a URL para pegar estas
informações e vou trocar o “+” da cidade por
um espaço.
link_desmontado = response.url.split("/")
uf_busca = link_desmontado[3]
cidade_busca = link_desmontado[4]
cidade_busca = cidade_busca.replace("+", " ")

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Executando o sistema:
$ crawl telelista –a url=“URL”

Python Web Scraping – Evaldo Wolkers


Scrapy
Projeto Crawler Telelista

Resultado:

Python Web Scraping – Evaldo Wolkers


FIM

Python Web Scraping – Evaldo Wolkers

Você também pode gostar