Python requests.get siempre obtienes 404

Me gustaría intentar enviar requests.get a este sitio web :

requests.get('https://rent.591.com.tw') 

y siempre consigo

  

Sabía que este es un problema común y lo intenté de manera diferente, pero aún así fracasé. Pero todos los otros sitios web están bien.

¿cualquier sugerencia?

Los servidores web son cajas negras. Se les permite devolver cualquier respuesta HTTP válida, en función de su solicitud, la hora del día, la fase de la luna o cualquier otro criterio que elijan. Si otro cliente HTTP obtiene una respuesta diferente, de manera consistente, intente averiguar cuáles son las diferencias en la solicitud que envía Python y la solicitud que envía el otro cliente.

Eso significa que necesitas:

  • Registrar todos los aspectos de la solicitud de trabajo.
  • Registrar todos los aspectos de la solicitud que falla
  • Pruebe qué cambios puede hacer para que la solicitud fallida se parezca más a la solicitud de trabajo y minimice esos cambios.

Por lo general, dirijo mis solicitudes a un punto final http://httpbin.org , hago que grabe la solicitud y luego la experimente.

Para las requests , hay varios encabezados que se configuran automáticamente, y muchos de estos que normalmente no esperaría tener que cambiar:

  • Host esto debe establecerse en el nombre de host con el que se está contactando, para que pueda alojar correctamente diferentes sitios. requests establece este.
  • Content-Length y Content-Type , para solicitudes POST, generalmente se establecen a partir de los argumentos que usted pasa a las requests . Si estos no coinciden, modifique los argumentos que pasa a las requests (pero tenga cuidado con las solicitudes de multipart/* , que usan un límite generado registrado en el encabezado Content-Type ; deje que las requests generen).
  • Connection : deje esto para que el cliente lo gestione.
  • Cookies : a menudo se configuran en una solicitud GET inicial o después de iniciar sesión por primera vez en el sitio. Asegúrese de capturar cookies con un objeto requests.Session() y de que haya iniciado sesión (las credenciales proporcionadas son las mismas que las del navegador).

Todo lo demás es un juego justo, pero si las requests han establecido un valor predeterminado, entonces la mayoría de las veces no son el problema. Dicho esto, generalmente comienzo con el encabezado User-Agent y subo desde allí.

En este caso, el sitio está filtrando en el agente de usuario, parece que están en la lista negra de Python , configurándolo en casi cualquier otro valor que ya funcione:

 >>> requests.get('https://rent.591.com.tw', headers={'User-Agent': 'Custom'})  

A continuación, debe tener en cuenta que las requests no son un navegador . requests son solo un cliente HTTP, un navegador hace mucho, mucho más. Un navegador analiza HTML en busca de recursos adicionales como imágenes, fonts, estilos y secuencias de comandos, carga esos recursos adicionales también y ejecuta secuencias de comandos. Los scripts pueden alterar lo que muestra el navegador y cargar recursos adicionales. Si los resultados de sus requests no coinciden con lo que ve en el navegador, pero la solicitud inicial que el navegador encuentra coincide , entonces deberá averiguar qué otros recursos ha cargado el navegador y realizar solicitudes adicionales con las requests que sean necesarias. Si todo lo demás falla, usa un proyecto como requests-html , que te permite ejecutar una URL a través de un navegador Chromium real y sin cabeza.

El sitio con el que está intentando ponerse en contacto realiza una solicitud AJAX adicional a https://rent.591.com.tw/home/search/rsList?is_new_list=1&type=1&kind=0&searchtype=1&region=1 , téngalo en cuenta si está tratando de raspar los datos de este sitio.

A continuación, los sitios bien construidos utilizarán las mejores prácticas de seguridad, como los tokens CSRF , que requieren que realice las solicitudes en el orden correcto (por ejemplo, una solicitud GET para recuperar un formulario antes de enviar un POST al manejador) y manejar las cookies o, de otro modo, extraerlas. información adicional que un servidor espera pasar de una solicitud a otra.

Por último, pero no menos importante, si un sitio está bloqueando los scripts para que no realicen solicitudes, es probable que intenten imponer los términos de servicio que prohíben el raspado, o porque tienen una API que prefieren usar. Compruebe cualquiera de los dos, y tenga en cuenta que podría ser bloqueado de manera más efectiva si continúa eliminando el sitio de todos modos.