Nessa altura do campeonato todo mundo já sabe o que é Web Scraping, Scraping ou Data Scraping, mas vamos lá: É a varredura de um site ou de outro programa para extração de dados. Fiz isso a vida toda, aliás, meu primeiro estágio em 2002 envolvia muito disso, Eu pegava os dados de sites como Guia Mais, Listas OESP, etc, fazia o tratamento das informações e colocava em um mapa no qual os Gênios do Marketing utilizavam as informações pra fazer análises inteligentes de ações de marketing em áreas específicas. Eu achava o máximo!
Há a discussão se isso é legal ou não é legal, mas os dados estão abertos na internet e se não há nada especificado nos termos de uso do site então você pode sim fazer o data scraping. Inclusive o próprio Buscapé começou assim.
Um desses dias procurei na internet por alguma lista de e-commerces brasileiros e não achei nada, então pensei em ver se tinha alguma coisa no buscapé, já que ele agrega dezenas de e-commerces. Bom, achei essa página aqui que possui as informações das lojas cadastradas no buscapé: http://www.buscape.com.br/pesquise-uma-loja.html?pg=1. Esse pg na query string é o número da página que estamos, obviamente.
Você pode ver que essa página é uma lista paginada das lojas cadastradas no buscapé. E isso se segue até a página 21270 mostrando 12 empresas por página.
E pra cada e-commerce que você clicar você vai ver várias informações sobre a empresa:
Até aí, tudo fácil. Só achei a página com a lista de empresas, vi que ela tem uma paginação da página 1 até a página 21270, contém 12 lojas por página e que pra pegar as informações completas é necessário entrar no link de cada uma das lojas. Esse é o algoritmo, agora pra fazer isso acontecer tem que criar o script python.
Eu decidi criar 2 scripts, um para pegar o link de todas as lojas de cada uma das páginas da lista e o segundo para entrar em cada link de empresa e retirar essas informações colocando num Excel gigantesco.
Então, organizando, o primeiro script faz isso aqui:
- Encontrar qual elemento da página de listagem contém o link para as lojas
- Varrer todas as páginas de listagem para pegar os links individuais de cada página de loja
- Salvar esses links em um arquivo Excel (pode fazer de qquer outro jeito, eu quis assim)
Primeiro de tudo, você precisa encontrar na estrutura da página os elementos HTML e CSS que contêm os links que precismos retirar. Eu usei o Dev Tools do Chrome pra inspecionar o elemento e vi que todas as lojas estão em uma DIV que contém uma classe chamada size1of3 e é essa classe que vou utilizar para pegar todas as lojas. Dê uma olhada na figura:
O trecho HTML das divs é normalmente assim:
<div class="unit size1of3">
<div class="bp_shop_info line">
<div class="shop_info_inner">
<div class="main">
<div class="leftCol name">
<a data-preco="" title="Extra.com.br" href="http://www.buscape.com.br/empresa/avaliacao-sobre-extra-com-br--77.html">
<img alt="Extra.com.br" src="http://imagem.buscape.com.br/vitrine/logo77.gif">
</a>
</div>
<div class="features_wrapper main">
<div class="line">
<div class="speech_bubble_pointer">
</div>
<div class="inner">
<div class="features_list main rounded_corner radius10">
<ul class="features_inner">
<li class="info_ebit_rating line">
<a class="ico_ebit sprite_ico ebit_40 leftCol" title="Loja e-bit Excelente" target="_blank" href="http://www.ebit.com.br/lojas_virtuais/html/rateloja.asp?PnumNumEmpresa=2043">
Loja E-bit e-bit Excelente
</a>
<div class="main">
<a class="info_ebit ebit_ajuda" title="Loja e-bit Excelente" target="_blank" href="http://www.ebit.com.br/lojas_virtuais/html/rateloja.asp?PnumNumEmpresa=2043">
e-bit Excelente
</a>
<span class="ratings">
Avaliada por
<a href="http://www.buscape.com.br/empresa/avaliacao-sobre-extra-com-br--77.html">
237.812 pessoas
</a>
</span>
</div>
</li>
<li>
<a title="Clique para ver mais informações" target="_blank" href="http://www.buscape.com.br/empresa/avaliacao-sobre-extra-com-br--77.html" class="sprite_ico info_shop">
Mais detalhes da loja
</a>
</li>
<li class="sprite_ico operation_area">
Vende pela Internet
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
Dentro dessa div nós podemos pegar o primeiro link que aparece e extrair dele o title, que é o nome da loja e o href com o link para a página específica daquela loja. Eu escrevi isso em javascript mesmo, testei no Console e vi que funcionava
$('.size1of3').each(function() {var x = $(this).find('a:first');console.log(x.attr('title') + ' ' + x.attr('href'))});
Agora vamos escrever o script em Python!
#URL http://www.buscape.com.br/pesquise-uma-loja.html?pg=1
#from 1 to 21265
# $('.size1of3').each(function() {var x = $(this).find('a:first');console.log(x.attr('title') + ' ' + x.attr('href'))});
import requests
import bs4
import openpyxl
import logging
from openpyxl import Workbook
#iniciar o arquivo de log
logging.basicConfig(filename='arq_links.log',level=logging.WARNING)
#iniciar a planilha do excel otimizada para escrita
wb = Workbook(write_only = True)
ws = wb.create_sheet()
for i in range(1,21266):
try:
payload = {'pg':str(i)}
response = requests.get('http://www.buscape.com.br/pesquise-uma-loja.html', params = payload)
soup = bs4.BeautifulSoup(response.text)
for div in soup.find_all(class_='size1of3'):
ws.append([
div.find('a')['title'],
div.find('a')['href'],
'http://www.buscape.com.br/pesquise-uma-loja.html?pg=%s' % i,
i,
])
print "#%s" % i,
except Exception as err:
print "Erro na pagina %s" % i
logging.exception(u"Erro na pagina %s" % i)
wb.save('lojas.xlsx')
Estou usando o requests pra dar o GET na página e sempre passo como a query string (a variável payload) a página que quero dar GET.
payload = {'pg':str(i)}
response = requests.get('http://www.buscape.com.br/pesquise-uma-loja.html', params = payload)
Eu faço agora o parse desse resultado que vem no response.text usando o Beautiful Soup pra pegar apenas as informações que eu quero, no caso o nome da loja e o link para a página individual dela. Também resolvi salvar o link da página em que estou.
soup = bs4.BeautifulSoup(response.text)
for div in soup.find_all(class_='size1of3'):
ws.append([
div.find('a')['title'],
div.find('a')['href'],
'http://www.buscape.com.br/pesquise-uma-loja.html?pg=%s' % i,
i,
])
Estou usando o openpyxl que é excelente pra criar arquivos XLSX e também resolvi criar um log pra ver quais páginas podem ter dado errado por algum motivo. Assim é possível ver quais páginas ficaram de fora da sua lista e rodá-las novamente.
Enfim, rodando esse arquivo temos como saída um arquivo chamado lojas.xlsx com a lista de todas as lojas e com os links para a página individual delas. Então a parte um foi concluída, agora só falta entrar em cada uma dessas lojas e pegar os dados delas.
O segundo script deve fazer isso aqui:
- Vamos verificar como é o HTML + CSS de cada página de loja para saber como vamos fazer o scraping.
- Ler o arquivo excel gerado pelo primeiro script que contém o link de cada loja.
- Entrar em cada página e pegar os dados relevantes disponíveis
- Salvar tudo em um XLSX gigante
Pra verificar o formato HTML a gente pode inspecionar o elemento de novo dentro da página da loja. O que dá pra ver é que a div principal que contém os dados tem a classe company-header. Nessa div você pode pegar a classificação Ebit da loja, a descrição da loja e uma lista de informação de contatos que não é a mesma para todos os contatos, alguns tem informação como e-mail, telefone e outros não, então vamos ter que driblar (“Dibrar”) isso.
O bom é que todas essas informações de contato estão em uma lista e podemos pegar todos os elementos <li> desta lista e salvar em uma lista python. Depois podemos parsear essas informações e colocá-las em colunas certinhas num banco de dados, por enquanto só vou focar em pegar os dados.
O script fica assim:
import requests
import bs4
import openpyxl
import logging
from openpyxl import load_workbook
from openpyxl import Workbook
#iniciar o arquivo de log
logging.basicConfig(filename='arq_lojas.log',level=logging.WARNING)
#Abrindo o excel de leitura
wb = load_workbook(filename = 'lojas.xlsx', use_iterators = True)
ws = wb.get_sheet_by_name(name = 'Sheet1')
#iniciar a planilha do excel de excrita
wb_escrita = Workbook(write_only = True)
ws_escrita = wb_escrita.create_sheet()
for row in ws.iter_rows():
try:
nome = row[0].value
url = row[1].value
response = requests.get(url)
soup = bs4.BeautifulSoup(response.text)
div = soup.find(class_='company-header')
ebit = ''
if div.find('img'):
if div.find('img').has_attr('title'):
ebit = div.find('img')['title']
desc = div.find(class_='about').string
div = soup.find(class_='company-contacts')
lista = []
for li in div.find_all('li'):
lista.append (li.text)
ws_escrita.append(
[nome,
url,
ebit,
desc] + lista #Adicionando a lista de contatos daquela loja
)
except Exception as err:
print "Erro na pagina %s" % url
logging.exception(u"Erro na pagina %s" % url)
wb_escrita.save('lojas_final.xlsx')
Ficou bem parecido com o primeiro arquivo. Agora é só executar os scripts. Execute o primeiro, ele vai demorar algumas horas até terminar, depois execute o segundo script. Aqui demorou bastante, quase 20 horas pra executar tudo.
O resultado final com os arquivos de excel e o código fonte você pode ver aqui no meu github: https://github.com/ffreitasalves/buscape-scraper
Belo artigo Fernando. Parabéns. Python é amplamente utilizado para obter informações na internet, não é a toa que o Google foi criado através dela.
E esse exemplo mostrado é bem interessante porque mostra de forma prática como podemos utilizar essas técnicas.
Abraço
Tem alguma forma para otimizar, para não demorar muito tempo?
E já ouviu falar desse projeto?
https://github.com/jmcarp/robobrowser
Obrigado Eric. Não conheço esse projeto, vou dar uma olhada! Um abraço!
Excelente post, Fernando.
Há algum tempo fiz algo parecido, mas para extrair as marcas:
https://github.com/bielversallini/brands-suck
Mesmo tendo acesso a API do Buscapé precisei fazer isso, já que por algum motivo eles não liberam algumas coisas.
Um abraço,
Gabriel Versallini
Valeu Gabriel!
Pô seu código tá muito massa, bem limpinho!
Parabéns amigo, ficou muito bom !!!!
Eu, particularmente, agradeço este post 😉 Valeu Fernando!!!
Ótimo post. Obrigado por compartilhar o código. 🙂
Hack it, before fake until make it 😉
Muito bom seu post cara, aprendi um coisa nova e muito legal hehe.
Agora to com uma dúvida, to tentando extrair uns links de um código fonte que ta sem as tags iguais ao seu. Não sei se posso postar o fonte aqui.
Obrigado Volney. Cara é isso mesmo, pra cada caso você vai encarar tags, classes ou alguma estrutura diferente mesmo, é questão de analisar o html+css do site e se for o caso, tentar selecionar essas tags usando o javascript mesmo pra ver se estão certas.
Opa, valeu cara, abriu minha mente ^^
Parabéns pelo trabalho Fernando! Vou tirar umas horas do meu dia hoje pra dar uma lida mais a fundo nesse material.
Não entendo nada de programação, mas vi que o buscape tem um api (não sei o que é isso exatamente), pra pegar dados deles. Eu preciso cotar anualmente milhares de livros, saberia me indicar se é possível fazer isso sem saber programar? Eu já tenho em formato excel dados dos livros como por exemplo ISBN.
Bom dia Hugo, obrigado por essa informação. Eu entrei no site da API do buscapé (http://developer.buscape.com.br/portal/developer/) , me parece que é novo, não conhecia esse serviço. Bom, acho que você pode sim buscar livros usando a API deles, já que o buscapé oferece o serviço de busca por ISBN (http://www.buscape.com.br/meta_livros?isbn=1853260150#precos). Mas acho improvável que você consiga utilizar a API sem programar. Você pode estudar uma forma de utilizar essa API deles utilizando uma linguagem de programação como python, não será difícil e você vai aprender muito.
Olá Fernando, tudo bem?
Realmente muito bacana o post, eu baixei seu projeto para testá-lo e entender melhor, instalei todas as bibliotecas não nativas do projeto, porém, a biblioteca openpyxl deu um erro, apesar de ter instalado ela normalmente. Pesquisando, me parece que é uma biblioteca que funciona apenas para as versões do Excel 2007 a 2010 e eu uso o Excel 2013.
Você conhece alguma biblioteca ou solução para resolver esse problema?
Traceback (most recent call last):
File “E:\Dropbox\Python\buscape-scraper-master\screu.py”, line 12, in
from openpyxl import Workbook
ImportError: No module named ‘openpyxl’
Oi Josué, então, esse ImportError me parece que a openpyxl não está instalada direitinho, tenta instalar de novo. Eu não sabia que ele só funcionava com essas versões do office, acho que uma opção é salvar num arquivo CSV mesmo então, ou procurar alguma biblioteca compatível.
Qualquer coisa, manda mensagem aqui, um abraço
Olá Fernando, boa tarde!
Foi nesse link que eu vi algo sobre isso, será que interpretei errado? https://openpyxl.readthedocs.org/en/latest/
Eu realizei uma nova instalação do openpyxl como pediu, porém, e apesar da mensagem final informar que a biblioteca foi instalada corretamente, no processo de instalação teve vários momentos que ocorreu o error: ‘SyntaxError: invalid syntax’.
Agora eu não sei se é bug na instalação do openpyxl ou se tem a ver com a versão do python ou do SO que uso? Estou usando pyhton3.2 e Windows 7 (32bits). Dá uma olhada rápida abaixo pra vc ver o erro que ocorre em alguns momentos da instalação:
byte-compiling build\bdist.win32\egg\openpyxl\styles\tests\test_proxy.py to test
_proxy.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\styles\tests\test_style.py to test
_style.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\styles\tests\test_styleable.py to
test_styleable.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\styles\tests\__init__.py to __init
__.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\styles\__init__.py to __init__.cpy
thon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\conftest.py to conftest.cpyt
hon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\helper.py to helper.cpython-
32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\schema.py to schema.cpython-
32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\test_backend.py to test_back
end.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\test_iter.py to test_iter.cp
ython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\test_props.py to test_props.
cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\test_read.py to test_read.cp
ython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\test_vba.py to test_vba.cpyt
hon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\tests\__init__.py to __init__.cpyt
hon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\datetime.py to datetime.cpyt
hon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\exceptions.py to exceptions.
cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\indexed_list.py to indexed_l
ist.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\tests\test_datetime.py to te
st_datetime.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\tests\test_indexed_list.py t
o test_indexed_list.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\tests\test_units.py to test_
units.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\tests\test_utils.py to test_
utils.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\tests\__init__.py to __init_
_.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\units.py to units.cpython-32
.pyc
byte-compiling build\bdist.win32\egg\openpyxl\utils\__init__.py to __init__.cpyt
hon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\interface.py to interface
.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\names\external.py to exte
rnal.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\names\named_range.py to n
amed_range.cpython-32.pyc
File “build\bdist.win32\egg\openpyxl\workbook\names\named_range.py”, line 41
return u”.format(self.__class__.__name__, self.value)
^
SyntaxError: invalid syntax
byte-compiling build\bdist.win32\egg\openpyxl\workbook\names\tests\conftest.py t
o conftest.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\names\tests\test_external
.py to test_external.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\names\tests\test_named_ra
nge.py to test_named_range.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\names\tests\__init__.py t
o __init__.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\names\__init__.py to __in
it__.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\properties.py to properti
es.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\read_only.py to read_only
.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\tests\conftest.py to conf
test.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\tests\test_props.py to te
st_props.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\tests\test_workbook.py to
test_workbook.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\tests\__init__.py to __in
it__.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\workbook.py to workbook.c
python-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\write_only.py to write_on
ly.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\workbook\__init__.py to __init__.c
python-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\datavalidation.py to dat
avalidation.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\dimensions.py to dimensi
ons.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\filters.py to filters.cp
ython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\header_footer.py to head
er_footer.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\interface.py to interfac
e.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\iter_worksheet.py to ite
r_worksheet.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\page.py to page.cpython-
32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\pivot.py to pivot.cpytho
n-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\properties.py to propert
ies.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\protection.py to protect
ion.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\relationship.py to relat
ionship.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\conftest.py to con
ftest.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\test_datavalidatio
n.py to test_datavalidation.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\test_dimensions.py
to test_dimensions.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\test_header.py to
test_header.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\test_page.py to te
st_page.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\test_properties.py
to test_properties.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\test_protection.py
to test_protection.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\test_views.py to t
est_views.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\test_worksheet.py
to test_worksheet.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\tests\__init__.py to __i
nit__.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\views.py to views.cpytho
n-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\worksheet.py to workshee
t.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\worksheet\__init__.py to __init__.
cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\comments.py to comments.cpy
thon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\drawings.py to drawings.cpy
thon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\dump_worksheet.py to dump_w
orksheet.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\etree_worksheet.py to etree
_worksheet.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\excel.py to excel.cpython-3
2.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\lxml_worksheet.py to lxml_w
orksheet.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\relations.py to relations.c
python-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\strings.py to strings.cpyth
on-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\styles.py to styles.cpython
-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\conftest.py to confte
st.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_drawing.py to te
st_drawing.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_dump.py to test_
dump.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_lxml.py to test_
lxml.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_meta.py to test_
meta.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_relations.py to
test_relations.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_strings.py to te
st_strings.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_style.py to test
_style.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_template.py to t
est_template.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_theme.py to test
_theme.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_workbook.py to t
est_workbook.cpython-32.pyc
File “build\bdist.win32\egg\openpyxl\writer\tests\test_workbook.py”, line 125
(‘workbook.xml’, u’ThisWorkbook’),
^
SyntaxError: invalid syntax
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\test_worksheet.py to
test_worksheet.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\tests\__init__.py to __init
__.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\theme.py to theme.cpython-3
2.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\workbook.py to workbook.cpy
thon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\worksheet.py to worksheet.c
python-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\writer\__init__.py to __init__.cpy
thon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\constants.py to constants.cpyt
hon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\functions.py to functions.cpyt
hon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\namespace.py to namespace.cpyt
hon-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\tests\common_imports.py to com
mon_imports.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\tests\test_functions.py to tes
t_functions.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\tests\test_incremental_xmlfile
.py to test_incremental_xmlfile.cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\tests\__init__.py to __init__.
cpython-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\xmlfile.py to xmlfile.cpython-
32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\xml\__init__.py to __init__.cpytho
n-32.pyc
byte-compiling build\bdist.win32\egg\openpyxl\__init__.py to __init__.cpython-32
.pyc
creating build\bdist.win32\egg\EGG-INFO
copying openpyxl.egg-info\PKG-INFO -> build\bdist.win32\egg\EGG-INFO
copying openpyxl.egg-info\SOURCES.txt -> build\bdist.win32\egg\EGG-INFO
copying openpyxl.egg-info\dependency_links.txt -> build\bdist.win32\egg\EGG-INFO
copying openpyxl.egg-info\requires.txt -> build\bdist.win32\egg\EGG-INFO
copying openpyxl.egg-info\top_level.txt -> build\bdist.win32\egg\EGG-INFO
zip_safe flag not set; analyzing archive contents…
openpyxl.benchmarks.__pycache__.memory.cpython-32: module references __file__
openpyxl.benchmarks.__pycache__.profiling.cpython-32: module references __file__
openpyxl.benchmarks.__pycache__.reader.cpython-32: module references __file__
openpyxl.benchmarks.__pycache__.writer.cpython-32: module references __file__
openpyxl.charts.tests.__pycache__.conftest.cpython-32: module references __file_
_
openpyxl.comments.tests.__pycache__.conftest.cpython-32: module references __fil
e__
openpyxl.drawing.tests.__pycache__.conftest.cpython-32: module references __file
__
openpyxl.formatting.tests.__pycache__.conftest.cpython-32: module references __f
ile__
openpyxl.reader.tests.__pycache__.conftest.cpython-32: module references __file_
_
openpyxl.styles.tests.__pycache__.conftest.cpython-32: module references __file_
_
openpyxl.tests.__pycache__.conftest.cpython-32: module references __file__
openpyxl.tests.__pycache__.schema.cpython-32: module references __file__
openpyxl.workbook.names.tests.__pycache__.conftest.cpython-32: module references
__file__
openpyxl.workbook.tests.__pycache__.conftest.cpython-32: module references __fil
e__
openpyxl.worksheet.tests.__pycache__.conftest.cpython-32: module references __fi
le__
openpyxl.writer.tests.__pycache__.conftest.cpython-32: module references __file_
_
openpyxl.xml.tests.__pycache__.common_imports.cpython-32: module references __fi
le__
creating ‘dist\openpyxl-2.2.6-py3.2.egg’ and adding ‘build\bdist.win32\egg’ to i
t
removing ‘build\bdist.win32\egg’ (and everything under it)
Processing openpyxl-2.2.6-py3.2.egg
removing ‘c:\python32\lib\site-packages\openpyxl-2.2.6-py3.2.egg’ (and everythin
g under it)
creating c:\python32\lib\site-packages\openpyxl-2.2.6-py3.2.egg
Extracting openpyxl-2.2.6-py3.2.egg to c:\python32\lib\site-packages
File “c:\python32\lib\site-packages\openpyxl-2.2.6-py3.2.egg\openpyxl\benchmar
ks\bufzip.py”, line 175
w.write(u”Line1\n”)
^
SyntaxError: invalid syntax
File “c:\python32\lib\site-packages\openpyxl-2.2.6-py3.2.egg\openpyxl\benchmar
ks\styles.py”, line 64
print ‘%s: ‘ % func.__name__,
^
SyntaxError: invalid syntax
File “c:\python32\lib\site-packages\openpyxl-2.2.6-py3.2.egg\openpyxl\styles\t
ests\test_number_style.py”, line 34
(u’#,##0\\ [$\u20bd-46D]’, False)
^
SyntaxError: invalid syntax
File “c:\python32\lib\site-packages\openpyxl-2.2.6-py3.2.egg\openpyxl\workbook
\names\named_range.py”, line 41
return u”.format(self.__class__.__name__, self.value)
^
SyntaxError: invalid syntax
File “c:\python32\lib\site-packages\openpyxl-2.2.6-py3.2.egg\openpyxl\writer\t
ests\test_workbook.py”, line 125
(‘workbook.xml’, u’ThisWorkbook’),
^
SyntaxError: invalid syntax
openpyxl 2.2.6 is already the active version in easy-install.pth
Installed c:\python32\lib\site-packages\openpyxl-2.2.6-py3.2.egg
Processing dependencies for openpyxl==2.2.6
Searching for jdcal==1.0
Best match: jdcal 1.0
Processing jdcal-1.0-py3.2.egg
jdcal 1.0 is already the active version in easy-install.pth
Using c:\python32\lib\site-packages\jdcal-1.0-py3.2.egg
Finished processing dependencies for openpyxl==2.2.6
C:\Python32\Lib\openpyxl-openpyxl-f7d02b93ed86>
Josué, como você está tentando instalar? via pip? No windows as vezes não dá pra instalar por pacote, então é melhor tentar instalar usando um arquivo binário, dá uma olhada nesse site aqui: http://www.lfd.uci.edu/~gohlke/pythonlibs/ e tenta instalar a versão 2.2.5 do openpyxl que tem nele.
Vamos ver se dá certo
Eu tentei por cmd via setuptools. Então, eu acesso o diretório onde está o setup.py do openpyxl de instalação e executo: setup.py install
As outras bibliotecas eu consegui instalar dessa forma, agora openpyxl que está dando esse problema. Vou ver esse site que me passou e qualquer novidade post aqui como foi. Obrigado pelo help.
Fernando,
Eu instalei o pip para poder realizar a instalação e ao tenta instalar a versão 2.2.5 do openpyxl, ocorreu agora esse erro, o que pode ser?
C:\Python32\Lib\openpyxl-openpyxl-f7d02b93ed86>pip install openpyxl-2.2.5-py2.py
3-none-any
Collecting openpyxl-2.2.5-py2.py3-none-any
Could not find a version that satisfies the requirement openpyxl-2.2.5-py2.py3
-none-any (from versions: )
No matching distribution found for openpyxl-2.2.5-py2.py3-none-any
Fernando, pode desconsiderar essa última mensagem, desculpe, foi erro meu, estava tentando executar o comando em um diretório diferente do arquivo e também não havia considerado a extensão do mesmo. Então agora me parece que instalou corretamente.
Processing e:\dropbox\python\buscape-scraper-master\openpyxl-2.2.5-py2.py3-none-any.whl
Requirement already satisfied (use –upgrade to upgrade): jdcal in c:\python32\l
ib\site-packages\jdcal-1.0-py3.2.egg (from openpyxl==2.2.5)
Installing collected packages: openpyxl
Found existing installation: openpyxl 2.2.6
Uninstalling openpyxl-2.2.6:
Successfully uninstalled openpyxl-2.2.6
Successfully installed openpyxl-2.2.5
Agora ao executar o arquivo screu.py do seu projeto, ocorre um erro de syntax:
Traceback (most recent call last):
File “E:\Dropbox\Python\buscape-scraper-master\screu.py”, line 12, in
from openpyxl import Workbook
File “C:\Python32\lib\site-packages\openpyxl\__init__.py”, line 9, in
from openpyxl.workbook import Workbook
File “C:\Python32\lib\site-packages\openpyxl\workbook\__init__.py”, line 5, in
from .workbook import *
File “C:\Python32\lib\site-packages\openpyxl\workbook\workbook.py”, line 15, in
from openpyxl.worksheet import Worksheet
File “C:\Python32\lib\site-packages\openpyxl\worksheet\__init__.py”, line 4, in
from .worksheet import *
File “C:\Python32\lib\site-packages\openpyxl\worksheet\worksheet.py”, line 46, in
from openpyxl.workbook.names.named_range import NamedRange
File “C:\Python32\lib\site-packages\openpyxl\workbook\names\named_range.py”, line 41
return u”.format(self.__class__.__name__, self.value)
^
SyntaxError: invalid syntax
Hum, bem interessante.
tenho uma duvida.
Estou tentando rodar o primeiro script e ele da uma barra vermelha na frente desse código
except Exception as err:
seria o posicionamento dele? gostaria de entender.
obrigado