1
resposta

Erro 403 Forbidden - Site Imovelweb

Olá, estou tentando extrair os dados do site Imovelweb porém estão me retornando o erro 403 mesmo após usar o 'user-agent', estou usando o seguinte código

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

url = 'https://www.imovelweb.com.br/propriedades/sobrado-em-condominio-localizado-1-uma-quadra-da-2956570473.html'
headers = {'User-Agent': 'Mozilla/5.0'}
try:
    req = Request(url, headers = headers)
    response = urlopen(req)
    print(response.read())

except HTTPError as e:
    print(e.status, e.reason)

except URLError as e:
    print(e.reason)

Alguém sabe oq poderia ser? Obrigado!

1 resposta

Oii Gabriel, como você está?

Peço desculpas pela demora em obter um retorno.

Isso está acontecendo porque o site está bloqueando a solicitação. Por algum método interno ele consegue identificar que estamos fazendo um scraping, logo, retorna 403 e redireciona para uma página de verificação de robô. O erro 403 se refere a acesso não autorizado do conteúdo.

Uma maneira de conseguir obter os dados, é utilizar a biblioteca Selenium que possui uma robustez maior para lidar com web scraping, sendo capaz de abrir automaticamente a página e simular as mãos humanas, efetuando cliques, preenchendo campos, etc. Para o exemplo de código abaixo precisaremos instalar um webdriver responsável por simular essa interação com o navegador. No meu caso, estou utilizando o Firefox, e você pode baixar o webdriver dele neste link. Caso utilize o Chrome, o endereço para download do webdriver é este. Sempre verifique a versão atual do seu navegador e a do webdriver, as duas têm que ser compatíveis (as mesmas).

Agora, indo para a parte prática teremos a instalação das bibliotecas necessárias:

pip install selenium
pip install beautifulsoup4

Já o código ficará da seguinte maneira:

from selenium.webdriver import Firefox

url = ('https://www.imovelweb.com.br/propriedades/sobrado-em-condominio-localizado-1-uma-quadra-da-2956570473.html')

driver = Firefox()
driver.get(url)

print(driver.page_source)

driver.close()

No código acima, o que estamos fazendo é abrindo o navegador na URL objetivo e extraindo o código fonte da página através do comando page_source.

Bônus: Partindo do código fonte, você pode ou utilizar a biblioteca BeautifulSoup para analisar ou fazer a análise com o próprio selenium, no exemplo abaixo utilizei a BeautifulSoup. Então, para pegar o título, valor e descrição o seguinte código poderá ser utilizado:

from selenium.webdriver import Firefox
from bs4 import BeautifulSoup

url = ('https://www.imovelweb.com.br/propriedades/sobrado-em-condominio-localizado-1-uma-quadra-da-2956570473.html')

driver = Firefox()
driver.get(url)

soup = BeautifulSoup(driver.page_source, 'html.parser')


print(f"Título: {soup.find('h2', class_='title-type-sup').text.strip()}")
print(f"Valor do imóvel: {soup.find('div', class_='price-items').text.strip()}")
print(f"Descrição: {soup.find('div', id='longDescription').text.strip()}")


driver.close()

Abaixo, uma demonstração via gif do funcionamento:

Gif que mostra a execução do código descrito acima, onde uma nova aba do navegador Firefox é aberta por alguns segundos e depois de obter o código fonte a mesma é fechada

Qualquer dúvida fico à disposição.

Abraços e bons estudos!