Extraer todos los enlaces, comentarios y posts de meneame.net cuyo tiempo de edición ya haya pasado.
Con endpoint.py buscamos en el
código fuente de Menéame
las rutas que nos puedan servir de endpoint
para extraer datos.
En resultado se puede ver en endpoint.py - README.md.
Finalmente nos quedamos con:
- meneame.net/api/list.php?id= c para comentarios
- meneame.net/api/list.php?status=queued&row=1 c para obtener la última noticia
- meneame.net/backend/info.php c para obtener noticias y posts, y usuarios de comentarios
- meneame.net/backend/get_user_info.php c para obtener información de los usuarios
Primero obtenemos la fecha de corte
(antes de ella todos los contenidos están consolidados, después puede que sufran cambios)
consultando el campo sent_date
de la última noticia (vía meneame.net/api/list.php?status=queued&row=1),
restándose el mayor campo *time*
de la configuración de Menéame (cuando se escribe esto dicho valor es 10 días
), y restándose
otro día adicional por si acaso.
De ahora en adelante, todos los datos recuperados solo se guardaran en la base de datos si su fecha es inferior a la fecha de corte anteriormente definida.
Para obtener las noticias usaremos:
- meneame.net/backend/info.php?&what=link&id=1&fields=clicks,content,date,karma,negatives,sent_date,status,sub_name,tags,title
- meneame.net/backend/info.php?&what=link&id=1&fields=url,username,votes,comments,sub_status,sub_status_id,sub_status_origen,sub_karma,author
- meneame.net/backend/info.php?&what=link&id=1&fields=anonymous
Siendo 1
el id
de la noticia en cuestión. (Nota: hay que hacerlo en varias llamadas porque el endpoint
no acepta más de 10 valores en el parámetro fields
)
Haremos esto por cada id entre 1
y el de la última noticia.
Para los comentarios consultaremos meneame.net/api/list.php?id=1 siendo 1
el id
de la noticia para la cual
queremos recuperar los comentarios.
Para completar la información con el id
del usuario que hizo el comentario,
usaremos meneame.net/backend/info.php?&what=comment&id=1&fields=author donde 1
es el id del comentario.
Este paso nos lo podemos ahorrar si el nick devuelto en el primer endpoint
es del tipo --XXXXX--
donde XXXXX
es un número, porque en tal caso
se trata de un usuario eliminado y XXXXX
es el id
.
Para los posts tendremos que obtener el id
del último posts
directamente de la web, y luego
consultar desde 1
hasta ese último id
la información de cada
post con meneame.net/backend/info.php?&what=posts&id=1&fields=date,author,karma,votes
donde 1
es del id
de cada post.
De entre todos los datos anteriores buscamos el id
de usuario más alto y
recorremos desde 1
a ese id
consultando meneame.net/backend/get_user_info.php?id=1 donde 1
es el id
del usuario.
Todo esto se condensa en:
history.py
: recupera el histórico de noticiascomments.py
: obtiene los comentarios de las noticiasposts.py
: obtiene los postspython3 -m core.db users
: inserta y actualiza usuariospython3 -m core.db tags
: inserta y actualiza tagsgeneral.sql
: crea una tabla con la edición general de Meneameactividad.sql
: crea una tabla con la actividad de los usuarios
Aunque la api de Menéame ofrece mucha información, tiene limitaciones para
evitar el abuso
(o eso parece) que consiguen el efecto contrario, ya que provocan que para
poder obtener toda la información disponible necesites una cantidad brutal de
llamadas a la api.
A modo de ejemplo: si tenemos 3.000.000 de noticias, 30.000.000 comentarios, 600.000 usuarios y 2.000.000 posts (menos de lo que ya hay) tendremos que hacer entre 14.600.000 y 44.600.000 llamadas.
Ayudaría enormemente eliminar la restricción de 10 valores para el parámetro fields
en el endpoint
meneame.net/backend/info.php
. Esta limitación no tiene
sentido ya que no impide la consulta a la base de datos ni tampoco influye
en cuantos campos se recuperan en dicha consulta pues el campo fields
solo se
usa después para copiar a un json
solo los campos solicitados
o devolviendo un objeto vació si solicitaste más de 10
campos. En cualquier caso, para entonces el trabajo pesado ya se ha hecho.
Otra modificación que ahorraría muchas llamadas sería dar el user_id
en el endopoint
meneame.net/api/list.php
y no solo su nick
.
Estos dos cambios permitirían obtener los datos de nuestro ejemplo con 8.600.000 llamadas.
Por otro lado seria muy recomendable crear una sección descargas
y proporcionar periódicamente (quizá una vez al año) un volcado de la base de datos
(no entera, claro, si no solo la parte que ya se esta dando vía api)
de manera que solo haga falta usar la api para el último periodo no cubierto.
Esto reduciría enormemente la presión a la que deben verse sometidos los servidores
de Menéame cada vez que alguien quiere hacer algún estudio de sus datos.
Recordemos que hablamos de información que ya esta siendo ofrecida (vía api) y
por lo tanto no hay ninguna razón para dificultar su acceso, sobre todo cuando
esta dificultad no impide su obtención si no que simplemente provoca
freír Menéame a llamadas HTTP
.
En la v2 se describe
una aproximación que intenta hacer muchas menos llamadas a la api.
Puedes consultarla
en dicha versión
para sacar ideas,
yo la termine descartando porque al final siempre necesitaba algún
campo que solo se pueden obtener con meneame.net/backend/info.php
.