Estoy tratando de recopilar todos los nombres de archivos de imágenes de este sitio web: https://www.shipspotting.com/
Ya he recopilado un dict cat_dict de Python de todos los nombres de categoría y sus números de identificación. Entonces, mi estrategia es iterar a través de cada página de categoría, llamar a la API de carga de datos y guardar su respuesta para cada página.
He identificado https://www.shipspotting.com/ssapi/gallery-search como la URL de solicitud que carga la siguiente página de contenido. Sin embargo, cuando solicito esta URL con la biblioteca de solicitudes, obtengo un 404. ¿Qué debo hacer para obtener la respuesta correcta al cargar la siguiente página de contenido?
import requests from bs4 import BeautifulSoup cat_page = 'https://www.shipspotting.com/photos/gallery?category=' for cat in cat_dict: cat_link = cat_page + str(cat_dict[cat]) headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:96.0) Gecko/20100101 Firefox/96.0", "Referer": cat_link } response = requests.get('https://www.shipspotting.com/ssapi/gallery-search', headers=headers) soup = BeautifulSoup(response.text, 'html.parser') https://www.shipspotting.com/photos/gallery?category=169 es una página de ejemplo ( cat_link )
Su url identificada contiene datos a través de la API como método de publicación y el desplazamiento infinito hace que las siguientes páginas signifiquen la paginación de los datos de carga útil de la API.
Código de trabajo junto con el estado 200
import requests api_url= 'https://www.shipspotting.com/ssapi/gallery-search' headers={'content-type': 'application/json'} payload= {"category":"","perPage":12,"page":1} for payload['page'] in range(1,7): res=requests.post(api_url,headers=headers,json=payload) for item in res.json()['items']: title=item['title'] print(title)Cada vez que se desplaza hacia abajo en la página, se realiza una nueva solicitud al servidor (una POST, con cierta carga útil). Puede verificar esto en Herramientas de desarrollo, pestaña Red.
Los siguientes trabajos:
solicitudes de importación
de bs4 importar BeautifulSoup
### coloque el siguiente código en un bucle for basado en un número de páginas
### [número total de fotos del barco]/[12], o asíncrono... tú eliges
datos = {"categoría":"","por página":12,"página":2}
r = solicitudes.post('https://www.shipspotting.com/ssapi/gallery-search', datos = datos)
imprimir (r. json ())
Esto devuelve una respuesta json:
{'página': 1, 'elementos': [{'lid': 3444123, 'cid': 172, 'título': 'ELLBING II', 'imo_no': '0000000',....}