#1003 pues nada, ya está terminando esto. Ahora pongo los resultados.
Ahora a decidir cuál empezar xD
#1022 Has tenido solamente en cuenta las estrellas por libro? O el numero de votos por los cuales se consiguen dicho numero de estrellas?
Porque no es lo mismo una puntuación de 4 estrellas conseguida entre 3450 votaciones, que una de 5 estrellas conseguida por 3 votaciones.
Y si rizamos el rizo, esté le hecho de el porcentaje de estrellas por votación, que aún siendo un 4 estrellas, si predominan las de 3-3.5 no es lo mismo (que haga media por pocas de 5)... xD
Pensaba: "hostias, ¿y si me logueo en el Sabadell y me saco pagina por pagina todas las líneas de movimientos de mi cuenta?". Porque sí. Sin más.
Entonces me he puesto con Requests, y mal...
Por 2 motivos:
1) El login del Sabadell es JODIDAMENTE dificil. Viene cargado de 1001 elementos para el payload y para los headers. Y cargar primero la web de presentación de form y parsearla con un BS4 para coger todo lo necesario para el POST... una fumada.
Lo jodido es que lo tenia y entonces...
2) Parte de los campos requeridos no pueden parsearse en el response body, dado que se generan dinamicamente via JS en tiempo de carga. Supongo lo han hecho adrede para evitar scrapping...
Entonces, buscando, doy con un requests con esteroides: https://requests.readthedocs.io/projects/requests-html/en/latest/
Este peque, es capaz de hacer lo mismo, pero permite asincronía y por lo tanto, se supone que precarga o gestiona por debajo todas las llamadas AJAX o scripts que se ejecuten sin problema...
Lo raro, es que a mi no me ha funcionado. Hay muchos <inputs> que se generan por JS directamentre, y el valor de dichos inputs encima, es una llamada a una función... Pues bien, el modulo tira, pero sigo sin tener el HTML en el DOM.
Así que finalmente viene el puto tanque (con la consiguiente perdida de rendimiento masivo): Selenium. xD
Y esto señores, es pura dinamita...
Me ha costado lo suyo configurarlo BIEN! Pero ahora ya está. Ya logueo. Ahora tocara jugar con lo de dentro. Es increible como con 4 linias chorras, consigues lo que consigues...
#1027 Igual digo una absurdez... pero ¿por qué necesitas hacer todo eso? Al final imagino que el login del sabadell será una petición POST a un servicio y a partir de ahí ya estás dentro... porque no miras en la consola de devops del navegador justo cuando das a login la llamada que es y miras lo que mandas y lo reproduces luego en Python y listo...
No sé igual es una absurdez pero vaya que ahora las webs se montan así hay servicios y estáticos... si te quedas solo con los servicios haces todo...
#1029 hostia tú te juro que las imagenes y lo del final no me cargó en su momento y leí hasta lo ya loguo y pensé joder que lío se ha hecho...
#1030 Es que me has dejado con el culo tuerto... Pensaba: o no me ha leído, o no tiene ni puta idea... O me he explicado fatal! xD
El caso es que el POST del formulario de login del Sabadell, es la hostia de completo. Y la mayoria de campos son dinámicos, con lo que no puedes hardcodearlos, así que te toca cargar primero la web de entrada, parsearla, coger campos y valores y luego, hacer el POST al servicio de login con los payloads y headers pertinentes. Hasta aquí nada raro y todo OK.
El problema, es que los cabrones, han generado html <inputs> en tiempo de carga con JS. Y encima, lo hacen en plan:
Lo cual es la hostia... Ya sabes: ver codigo fuente y no hay nada. Inspeccionar con F12, y lo ves. Un clasico. Y en este caso, una cerdada en Do Mayor Séptima...
Pues Requests, recoge el código de "ver codigo fuente de la pagina", por lo que no tiene nada generado en tiempo de carga via script. Y entonces, nos quedamos sin POST a la clásica...
De ahí la fumada del Selenium.
#1027 no sabes la de tiempo que estuve para logearme en una web hace un par de años y al final no lo conseguí. Gracias por compartir estas cosas, algunos aprendemos.
#1034 ahora tengo ganas de hacer este tipo de cosas y en cambio me espera un día de apagafuegos en el curro...
Una dudilla:
Tengo una relación de herencia y en un método de la clase padre llamo a un método que está definido en las clases hija. El programa funciona bien pero el vscode se queja y lo marca como un error diciendo que no sabe qué método es ese y que la clase padre no tiene acceso.
Está literalmente copiado de un ejemplo de un libro así que no sé si es un bug del vscode o qué tengo que hacer para que no lo marque como error.
#1036 ¿qué linter tienes seleccionado? eso me pasaba con pylint y ahora uso pylama, mucho mejor en mi opinión y ya no me marca esas chorradas
#1037 Buena pregunta, voy a ver jajaja
Edit: Efectivamente era pylint aunque me da error al instalar pylama y aunque desactive el linting sigue marcando eso como error. Voy a ver...
Edit2: Con pylama me sigue marcando ese error también
#1037 #1038 Yo uso pycharm, a años luz en inspección de código xD
Probad con esto https://devblogs.microsoft.com/python/announcing-pylance-fast-feature-rich-language-support-for-python-in-visual-studio-code/
#1039 totalmente de acuerdo con lo de pycharm, pero en el curro estoy todo el día con el vs code y ya lo tengo tuneado, además aprendí a usar wsl con el vs code y me manejo bien, vamos que es más por pereza de cambiar de entorno que por otra cosa, y ojo, que el vs code no va mal, tengo dos aplicaciones en django desarrolladas íntegramente con vs code y bastante bien
Ná pues me lo sigue marcando igual, incluso desactivando el linter.
No tendré que declararlo como abstracto o algo así?
#1041 No te ralles, es cosa del linter, si te funciona está bien. Prueba Pycharm, en serio, estas cosas no te pasan XD
Cambiando de tema, tengo 7k $ de crédito en AWS que me caducan en junio de 2021 ¿se os ocurre algo guapo?
#1045 por qué va a ser fallo suyo si funciona y python no se queja? Será por cosas que no detecta el linter xD
El de pycharm directamente es magia negra, funciona espectacular
#1048 estamos hablando de herencia y de que se usa, y que el linter no es capaz de encontrar la referencia a esa clase, no de que sea un error sintáctico que se detecte en tiempo de ejecución xD