em Português, Python, startups

Data Scraping das lojas do Buscapé com Python e Beautiful Soup

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.

Essa é a carinha da página:
buscape-pesquisa-uma-loja

 

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.

buscape-rodape

E pra cada e-commerce que você clicar você vai ver várias informações sobre a empresa:

buscape-ricardo-eletro

 

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:

  1. Encontrar qual elemento da página de listagem contém o link para as lojas
  2. Varrer todas as páginas de listagem para pegar os links individuais de cada página de loja
  3. 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:

buscape-div-loja

 

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">
 &nbsp;
 </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:

  1. Vamos verificar como é o HTML + CSS de cada página de loja para saber como vamos fazer o scraping.
  2. Ler o arquivo excel gerado pelo primeiro script que contém o link de cada loja.
  3. Entrar em cada página e pegar os dados relevantes disponíveis
  4. 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


Also published on Medium.

Escreva um comentário

Comentário

25 Comentários

  1. 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

  2. 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.

  3. 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.

  4. 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

  5. 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>

      • 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.

  6. 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

  7. 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