1
resposta

Erro ao mudar e página scraping python

O script abaixo funciona perfeitamente para uma página, no entanto quando eu colocar o loop para ir a próxima página ele não funciona

from bs4 import BeautifulSoup
from requests import get
import pandas as pd
import re
from urllib.request import urlopen, urlretrieve
import time
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError


#Biblioteca selenium
from selenium import webdriver
#Parâmetro para mudar de página
ff = webdriver.Firefox(executable_path="D:/Programas/gecko/geckodriver.exe")
ff.get('https://www.wine.com.br/browse.ep?cID=100851&exibirEsgotados=false&') #muda de página
html = ff.page_source
soup = BeautifulSoup(html,'html.parser')
#script busca todos os itens da página

#Declarando as variáveis
cards = []
card = {}

#obtendo tags de interesse
anuncios = soup.find('div', {'class':'ProductList-content'}).find_all('article', {'class':'ProductDisplay ProductDisplay--horizontal'})
anuncio = soup.find('article', {'class':'ProductDisplay ProductDisplay--horizontal'})
#anuncios = soup.find('div', {'class': 'ProductList ProductList'}).find_all('div',{'class':'ProductList-content'})
#anuncio = soup.find('div',{'class':'ProductList-content'})

#startTime = time.time()
#pages = int(soup.find('div', {'class':'Pagination'}).get_text().split()[6])

for i in range(3):
    #Obtendo o html
    ff = webdriver.Firefox(executable_path="D:/Programas/gecko/geckodriver.exe")
    ff.get('https://www.wine.com.br/browse.ep?cID=100851&pn='+str(i+1)+'&listagem=horizontal&sorter=featuredProducts-desc&filters=')
    #ff.get('https://www.wine.com.br/browse.ep?cID=100851&exibirEsgotados=false&pn='+str(i+1)+'&listagem=horizontal&sorter=featuredProducts-desc&filters=')
    html = ff.page_source
    soup = BeautifulSoup(html,'html.parser')

    for anuncio in anuncios:
        card = {}

        #Nomes dos vinhos
        nomes = anuncio.find('div', {'class': 'ProductDisplay-name'}).find_all('h2')
        vinhos = []
        for nome in nomes:
            vinhos.append(nome.get_text())
            card['vinhos'] = vinhos

        #Criando lista de cards
        cards.append(card)


#Criando o dataframe    
wine = pd.DataFrame(cards)
wine
1 resposta

Oi Eden, como vai? Espero que esteja bem ^-^

Poderia especificar melhor quando você diz que não funciona? Ocorre algum erro?

Quanto ao resultado, cada página possui 9 tipos de vinho e no resultado final obtemos 27 resultados, porém o código repete os dados da primeira página, seria esse o problema a qual você se refere?

image

Caso seja, para corrigir isso, apenas uma mudança se faz necessária: precisamos colocar a variável anuncios dentro do laço de repetição, para que a cada nova página ele faça a leitura correta do html em questão. No código abaixo eu retirei alguns imports e códigos que não estavam sendo utilizados e utilizei o Chrome, mas a mudança significativa foi colocar a variável anuncios dentro do laço:

from bs4 import BeautifulSoup
import pandas as pd
from selenium import webdriver


#Declarando as variáveis
cards = []
card = {}


for i in range(3):

    #Obtendo o html
    ff = webdriver.Chrome()
    ff.get('https://www.wine.com.br/browse.ep?cID=100851&pn='+str(i+1)+'&listagem=horizontal&sorter=featuredProducts-desc&filters=')
    html = ff.page_source
    soup = BeautifulSoup(html,'html.parser')

    # Obtendo as tags de interesse
    anuncios = soup.find('div', {'class': 'ProductList-content'}).find_all('article', {
        'class': 'ProductDisplay ProductDisplay--horizontal'})

    for anuncio in anuncios:
        card = {}

        #Nomes dos vinhos
        nomes = anuncio.find('div', {'class': 'ProductDisplay-name'}).find_all('h2')
        vinhos = []
        for nome in nomes:
            vinhos.append(nome.get_text())
            card['vinhos'] = vinhos

        #Criando lista de cards
        cards.append(card)

#Criando o dataframe
wine = pd.DataFrame(cards)
print(wine)

Resultado:

image

Qualquer dúvida é só dizer, estou por aqui.

Abraços e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software