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)