1
resposta

Como ignorar um erro

Estou fazendo um projeto com web scraping, e as paginas não são regulares (tipo 1,2,3. ela são 1, 100, 122, etc) como eu faço pra ignorar esse erro e passar pra próxima url? ou algum outro jeito de capturar apenas essas paginas.

1 resposta

Fala Fernando! Tudo em ordem?

Sinto muito pela demora em dar um retorno.

De acordo com o que você disse, podemos pensar em duas possibilidades:

1 - Você quer fazer o scraping em um site no qual nem todos os números das páginas são apresentados, como no exemplo abaixo:

Imagem dos números de páginas de um site, no qual é possível observar do número 1 ao número 4 e o número 7292. Os números entre 4 e 7292 são representados por reticências

2 - Você quer fazer o scraping em páginas específicas de um site

Bora explorar esses dois casos?

1 - Scraping em um site no qual nem todos os números das páginas são apresentados

Nesse caso, o que você pode fazer é pegar o número total de páginas e, por meio de um laço, percorrer essas páginas e extrair a informação que você deseja.

Vamos fazer um breve exemplo para que você possa entender melhor. Para o exemplo, vou utilizar o site da Alura Motors.

Suponhamos que meu objetivo seja extrair todos os nomes dos carros existentes nas 25 páginas desse site. Para fazer isso, vou usar a abordagem que eu disse acima:

from urllib.request import urlopen
from bs4 import BeautifulSoup

nomes_carros = [] # lista para armazenar os nomes dos carros
numero_total_de_paginas = 25

for pagina in range(1, numero_total_de_paginas + 1):
    url = f'http://alura-site-scraping.herokuapp.com/index.php?page={pagina}'

    response = urlopen(url)
    html = response.read()
    soup = BeautifulSoup(html, 'html.parser')

    titulos = soup.find_all('p', {'class': 'txt-name inline'}) # localizando todos os nomes dos carros

    for titulo in titulos:
        nomes_carros += titulo # salvando os nomes na lista

print(nomes_carros)

No exemplo acima, estamos utilizando um laço for para variar a url do site e percorrer todas as páginas. A cada nova iteração do nosso laço, a variável url irá mudar e avançar para a próxima página. Por exemplo, quando pagina for 3, é como se a variável url ficasse da seguinte forma:

# variável em sua forma original
url = f'http://alura-site-scraping.herokuapp.com/index.php?page={pagina}'

# quando pagina = 3
url = http://alura-site-scraping.herokuapp.com/index.php?page=3

E esse link resultante, corresponde ao link da página 3 do site:

Imagem da url apresentada quando estamos na página 3 do site, que é igual a url apresentada no exemplo acima quando page = 3

Mas, atenção, para repetir esse processo, você deve analisar como está estruturado o link do seu site e como ele varia a medida que você muda de página.

2 - Scraping em páginas específicas de um site

Nesse caso, uma opção seria criar uma lista com os números específicos das páginas que você deseja e, por meio de um laço, percorrer apenas os elementos dessa lista.

Vamos fazer um exemplo utilizando o mesmo site do exemplo anterior.

Suponhamos agora que eu queira extrair os nomes dos carros apenas das páginas 4, 5 e 10. Para isso, eu vou criar uma lista chamada paginas_escolhidas e, por meio do laço for, vou percorrer essa lista:

from urllib.request import urlopen
from bs4 import BeautifulSoup

nomes_carros = [] # lista para armazenar os nomes dos carros
paginas_escolhidas = [4, 5, 10] # lista com as páginas escolhidas

for page in paginas_escolhidas:
    url = f'http://alura-site-scraping.herokuapp.com/index.php?page={page}'

    response = urlopen(url)
    html = response.read()
    soup = BeautifulSoup(html, 'html.parser')

    titulos = soup.find_all('p', {'class': 'txt-name inline'})

    for titulo in titulos:
        nomes_carros += titulo

print(nomes_carros)

O raciocínio nesse caso funciona da mesma forma do exemplo anterior. Ressalto novamente que é importante analisar como o link do seu site está estruturado para que você consiga fazer seu scraping certinho, tá bom?

Espero que isso te ajude! Se surgir alguma dúvida estaremos por aqui :)

Bons estudos!