Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Requisições HTTP com urlopen

Olá.

Eu estou tentando fazer utilizar uma API com a biblioteca urllib do do Python. E eu estou obtendo alguns erros e tendo alguma dificuldade de encontrar a solução pra eles. A API está descrita aqui: https://metmuseum.github.io/.

O que eu estou tentando fazer é uma requisição para a URL a seguir e armazenar o resultado num dicionário, usando a biblioteca Json.

"https://collectionapi.metmuseum.org/public/collection/v1/search?hasImages=true"

from urllib.request import urlopen
import json

r = urlopen("https://collectionapi.metmuseum.org/public/collection/v1/search?hasImages=true")
resposta = json.loads(r.read())

O problema é que essa requisição retorna alguns erros. Como esse aqui:

"http.client.RemoteDisconnected: Remote end closed connection without response"

Li a respeito que umas das possíveis causas pra esse erro é que alguns sites bloqueam requisições que não são feitas por browsers e que pra contornar isso seria necessário acrescentar um cabeçalho a requisição, contendo um parâmetro 'User-agent', pra identificar a fonte da requisição. Daí, eu defini o cabeçalho:


headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}

data = bytes(json.dumps(headers), encoding='utf8')

r = urlopen("https://collectionapi.metmuseum.org/public/collection/v1/search?hasImages=true", data=data)

Ainda assim nada. Quando eu fiz a requisição passando o parâmetro data, eu obtive um outro erro que acusava que o método HTTP não era permitido. Por algum motivo, o método tava sendo alterado para 'POST' por debaixo dos panos, mas eu consegui alterar o método, construindo um objeto da requisição com urllib.request.Request(), e alterando o atributo method para 'GET'. Daí tentei de novo, e continuou dando o erro "http.client.RemoteDisconnected: Remote end closed connection without response".

Alguém tem alguma luz?

2 respostas

Entendi. Realmente, fica difícil acessar uma url que não existe. Eu interpretei errado as informações no site da API. Obrigado pela resposta!