Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Webscraping com card duplicado

Na aula 7 do curso de Scraping com Python o meu código final está rodando e me retornando as 247 imagens como esperado. Porém o DataFrame está com o primeiro card duplicado, de modo que o dataset está com 257 linhas, em vez de 247. O do professor está como deveria, com apenas 247 linhas, mas não consegui identificar a diferença

from bs4 import BeautifulSoup
import pandas as pd

# Declarando variável cards
card = []


### Obtendo o HTML e o total de páginas
response = urlopen('https://alura-site-scraping.herokuapp.com/index.php')
html = response.read().decode('utf-8') #usar a função trata_html() apenas se ocorrer algum erro
soup = BeautifulSoup(html, 'html.parser')

pages = int(soup.find('span',class_='info-pages').getText().split()[-1])

### Iterando por todas as páginas do site
for i in range(pages):
    ### Obtendo o HTML
    response = urlopen('https://alura-site-scraping.herokuapp.com/index.php?page=' + str(i + 1)) #range(25) iria de 0 a 24 (indice python)
    html = response.read().decode('utf-8') 
    soup = BeautifulSoup(html, 'html.parser')



    # Obtendo as TAGs de interesse
    anuncios = soup.find('div',{'id': 'container-cards'}).findAll('div', class_='card')

    # Coletando as informações dos cards
    for anuncio in anuncios:
        card = {}

            # Valor
        card['value'] = anuncio.find('p', {'class': 'txt-value'}).getText()

        # Informações
        infos = anuncio.find('div', {'class': 'body-card'}).findAll('p')
        for info in infos:
            card[info.get('class')[0].split('-')[-1]] = info.get_text()

        # Acessórios
        items = anuncio.find('div', {'class': 'body-card'}).ul.findAll('li')
        items.pop()
        acessorios = []
        for item in items:
            acessorios.append(item.get_text().replace('► ', ''))
        card['items'] = acessorios

        # Adicionando resultado à lista cards
        cards.append(card)

        # Imagens
        image = anuncio.find('div', {'class': 'image-card'}).img
        urlretrieve(image.get('src'), './output/img/' + image.get('src').split('/')[-1])   

# Criando um DataFrame com os resultados
dataset = pd.DataFrame(cards)
dataset.to_csv('./output/data/dataset.csv', sep=';', index = False, encoding = 'utf-8-sig')
dataset.head(30)
2 respostas
solução!

Olá Thiago, tudo bem? Espero que sim!

Por volta da linha 4, você define a lista card sem a letra S, dessa forma ao realizar o append das informações dentro do for, o código estará adicionando em uma outra lista cards que poderia já ter informações anteriormente.

Modifique a variável na linha 4 com o S para funcionar corretamente.

Bons estudos!

Era isso mesmo João, funcionando agora. Muito obrigado