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