Journal Liste des articles gratuits des Editions Diamond

35
8
jan.
2023

Sommaire

Plop

J'ai vu le journal du camarade vmagnin< indiquant sa difficulté à trouver les articles sous licences libres sur le site des Éditions Diamond et sa solution pour contourner le problème.

Comme je m'ennuyai en ce dimanche nuageux, j'ai commis un script pour récupérer la liste de tous les articles et l'exporter en CSV (best database eva…).

Le script est tout con, il se contente de parser le site pour récupérer les infos.

Au total, j'ai pu trouver 6192 articles dans 527 magazines, dont 825 en accès libres (~13%) que vous pourrez trouver ci-après (sauf si les modes estiment que c'est un peu abusé ').

Pour le code, c'est du python, et il n'y a que 2 dépendences : requests et (beautifulsoup)[https://pypi.org/project/beautifulsoup4/]

#!/usr/bin/env python
import csv
import hashlib
import json
import os
from typing import Iterable

from bs4 import BeautifulSoup
from requests import Session

BASE_URL = "https://connect.ed-diamond.com"

URL_MAPPING = {
    "glmf": "gnu-linux-magazine",
    "misc": "misc",
    "hackable": "hackable",
    "lp": "linux-pratique",
}

USE_CACHE = True
CACHE_DIR = "cache"


def get_soup(url: str, session: Session) -> BeautifulSoup:
    print(url)
    """Get a soup from an URL"""
    html = None
    if USE_CACHE:
        # Get the file from the cache
        # SHA1 is good enough for us
        url_hash = hashlib.sha1(url.encode()).hexdigest()
        cache_entry = CACHE_DIR + "/" + url_hash + ".html"
        try:
            with open(cache_entry) as f:
                html = f.read()
        except FileNotFoundError:
            pass

    # Cache miss, download the file
    if html is None:
        html = session.get(url).text

    if USE_CACHE:
        # Register the file in the cache
        os.makedirs(CACHE_DIR, exist_ok=True)
        with open(cache_entry, "w") as f:
            f.write(html)

    return BeautifulSoup(html, features="html.parser")


def get_issues(magazine: str, session: Session) -> Iterable:
    # Get the soup of the magazine page
    magazine_soup = get_soup(BASE_URL + "/" + URL_MAPPING[magazine], session)

    # Get the links the the issues
    for node in magazine_soup.select(
        ".region-sidebar-second .context-depending-bgcolor-link a"
        # ".view-display-id-block_3 > div:nth-child(1) > div a"
    ):
        yield node.attrs["href"]


def get_articles(issue_url: str, session: Session) -> Iterable:
    issue_soup = get_soup(BASE_URL + issue_url, session)

    # Some issues have the articles in the HTML and
    # others in JS. Maybe an anti-crawler protection?
    # Parse the HTML embedded in the JS if we found any
    #
    # Search for the issue content in the script tags
    for node in issue_soup.select(
        'script[type="application/vnd.drupal-ajax"]'
    ):
        if "views_block__view_articles_list_block_7" in node.attrs.get(
            "data-big-pipe-replacement-for-placeholder-with-id", ""
        ):
            # Tag found, get a soup from the embedded content
            issue_soup = BeautifulSoup(
                json.loads(node.text)[0]["data"], features="html.parser"
            )
            break

    # Search the articles
    for node in issue_soup.select(".view-display-id-block_7 .view_inner"):
        # Extract infos from articles
        url_node = node.select(".views-field-title a")[0]
        url = url_node.attrs["href"]
        title_node = url_node.select(".views-field-title a span")[0]
        title = title_node.text
        paywall = "is_locked_icon" in title_node.attrs["class"]
        author = node.select(".views-field-field-ct-article-authors a")[0].text

        yield title, author, paywall, url


def main() -> None:
    # Create an HTTP sessions
    # Make things fasta!
    session = Session()

    # Open the output CSV file
    with open("eddiamond.csv", "w") as f:
        # Create the csv writer
        csv_writer = csv.DictWriter(
            f,
            (
                "magazine",
                "issue",
                "issue_url",
                "title",
                "author",
                "paywall",
                "url",
            ),
        )
        csv_writer.writeheader()

        # Get all articles of each issues of each magazines
        for magazine in URL_MAPPING:
            print(magazine)

            for issue_url in get_issues(magazine, session):
                for (
                    article_title,
                    article_author,
                    article_paywall,
                    article_url,
                ) in get_articles(issue_url, session):
                    issue_name = issue_url.rsplit("/", 1)[-1]
                    csv_writer.writerow(
                        {
                            "magazine": magazine,
                            "issue": issue_name,
                            "issue_url": BASE_URL + issue_url,
                            "title": article_title,
                            "author": article_author,
                            "paywall": article_paywall,
                            "url": BASE_URL + article_url,
                        }
                    )


if __name__ == "__main__":
    main()

GNU/Linux Magazine France

MISC

Hackable

Linux Pratique

  • # me suis trompé de bouton >_<

    Posté par  (site web personnel) . Évalué à 2.

    un modo peut corriger l'intégration du code ? merci :)

    • [^] # Re: me suis trompé de bouton >_<

      Posté par  (site web personnel) . Évalué à 2.

      en fait, j'ai aussi foiré les liens… est-ce que vous pouvez simplement supprimer le journal ? j'en posterai une version correcte plus tard.

      • [^] # Re: me suis trompé de bouton >_<

        Posté par  (site web personnel) . Évalué à 3.

        Effectivement les liens n’amènent pas sur l'article lui-même mais sur le sommaire du n°. Mais c'est déjà pas mal !

        • [^] # Re: me suis trompé de bouton >_<

          Posté par  (site web personnel) . Évalué à 3.

          Et voila, corrigé !

          • [^] # Re: me suis trompé de bouton >_<

            Posté par  . Évalué à 3.

            Il reste le lien vers beautifulsoup, les crochets et parenthèses ont été permutés.
            Et tant qu'à être maniaque, la parenthèse fermante au paragraphe précédent s'est retrouvée en exposant.
            Et autant faire le grammar nazi, il manque un 's' à « ennuyais » :

            Comme je m'ennuyais en ce dimanche nuageux

            Les vrais naviguent en -42

            • [^] # Re: me suis trompé de bouton >_<

              Posté par  (site web personnel) . Évalué à 1. Dernière modification le 13 février 2023 à 19:28.

              Oui, et un signe inférieur en trop après "vmagnin", et une faute à dépendance

              Je ne comprends pas(en même temps, mon expérience en Python est proche de zéro) à quel moment le script détecte si l'article est en accès gratuit ou pas

              • [^] # Re: me suis trompé de bouton >_<

                Posté par  (site web personnel, Mastodon) . Évalué à 2.

                La ligne paywall = "is_locked_icon" in title_node.attrs["class"] dans ce bloc

                    # Search the articles
                    for node in issue_soup.select(".view-display-id-block_7 .view_inner"):
                        # Extract infos from articles
                        url_node = node.select(".views-field-title a")[0]
                        url = url_node.attrs["href"]
                        title_node = url_node.select(".views-field-title a span")[0]
                        title = title_node.text
                        paywall = "is_locked_icon" in title_node.attrs["class"]
                        author = node.select(".views-field-field-ct-article-authors a")[0].text
                
                        yield title, author, paywall, url

                Il faut se référer à l'analyse des pages faite dans l'autre journal.

                “It is seldom that liberty of any kind is lost all at once.” ― David Hume

                • [^] # Re: me suis trompé de bouton >_<

                  Posté par  (site web personnel) . Évalué à 1.

                  Merci, je ne comprends donc rien au code car pour moi ce bloc était exécuté pour récupérer le contenu d'un article qu'on conserve… je ne comprends pas comment cette ligne peut être interprétée comme une condition…

                  • [^] # Re: me suis trompé de bouton >_<

                    Posté par  (site web personnel, Mastodon) . Évalué à 3.

                    Arf, ma réponse était trop courte du coup.
                    Alors, on ne récupère pas les articles mais la liste des pages ; liste qui a ensuite été publiée dans le journal.

                    La ligne en question fonctionne comme celle de la boucle

                        for node in issue_soup.select(".view-display-id-block_7 .view_inner"):

                    Dans la page tu as une série de bloc de type (je simplifie)

                    <div class="view-display-id-block_7 etc">
                      <div class="view_inner">
                        <!-- issue_soup -->
                      </div><div class="views-field-field-ct-article-authors">
                        <a href="FUBAR"><!-- author --></a>
                      </div>
                    </div>

                    que tu récupères. Et dedans des liens dont on chope le premier

                        <!-- issue_soup -->
                        <span class="views-field-title">
                          <!-- url_node -->
                          <a href="FOO">
                            <!-- title_node -->
                            <span class="BAR BAZ">
                              <!-- title -->
                            </span></a>
                        </span>

                    Sur ce premier, toujours en simplifiant/caricaturant (ce n'est pas le source des pages mais ça donne l'idée), tu prends l'adresse (url vaudra FOO) et le premier span (dont le contenu sera assigné à title) et le contenu de l'attribut class sous forme de liste…
                    Et là, le test consiste à voir si on a "is_locked_icon" dans cette liste… Tu peux consulter https://www.geeksforgeeks.org/check-if-element-exists-in-list-in-python/ ou https://www.w3schools.com/python/gloss_python_check_if_list_item_exists.asp par exemple. Le résultat de ce test est stocké dans la variable paywall

                    “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Commentaire supprimé

        Posté par  (site web personnel) . Évalué à 6. Dernière modification le 09 janvier 2023 à 09:34.

        Ce commentaire a été supprimé par l’équipe de modération.

  • # Merci

    Posté par  (site web personnel) . Évalué à 7.

    Super boulot !

    L'idée venait de me traverser l'esprit qu'on pourrait créer ensemble une telle liste, mais l'idée d'un script n'avait pas encore atteint le néocortex…

    • [^] # Re: Merci

      Posté par  (site web personnel) . Évalué à 6.

      de rien :)

      • [^] # Re: Merci

        Posté par  (Mastodon) . Évalué à 5. Dernière modification le 09 janvier 2023 à 08:03.

        Modération : au final, on fait quoi de ce journal ? Tu veux que je remplace tous les liens par la liste que tu as posté un peu plus loin en commentaires ?

        Ou tu veux faire un nouveau journal ?

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # licence libre != accès libre

    Posté par  . Évalué à 6.

    Je vais chipoter un peu mais comme tous les articles listés sont publiés sous licence CC by-nc-nd, ils sont en accès libre mais ils ne sont aucune des « articles sous licence libre ».

    • [^] # Re: licence libre != accès libre

      Posté par  (site web personnel) . Évalué à 5.

      C'est juste, le ND est contraire à la définition des licences libres :

      NoDerivatives — If you remix, transform, or build upon the material, you may not distribute the modified material.

      On notera qu'on reste quand même libre de modifier l’œuvre, mais pas de la diffuser. Bon évidemment, ça n'a pas beaucoup d'intérêt dans le cas d'un article…

      • [^] # Re: licence libre != accès libre

        Posté par  (site web personnel) . Évalué à 6.

        Sauf s'il s'agit d'annoter ?

        Adhérer à l'April, ça vous tente ?

      • [^] # Re: licence libre != accès libre

        Posté par  (Mastodon) . Évalué à 7.

        On notera qu'on reste quand même libre de modifier l’œuvre, mais pas de la diffuser. Bon évidemment, ça n'a pas beaucoup d'intérêt dans le cas d'un article…

        T'as toujours le droit de faire ça quand c'est pour ton usage personnel. Rien ne t'interdis de remixer une chanson de The Doors avec des vocaux de Aya Nakamura récitant la CLUF de Microsoft Windows et d'intégrer ça dans une vidéoclip mélangeant Fernandel et Kung Fu Panda tant que ça reste chez toi.

        • [^] # Re: licence libre != accès libre

          Posté par  (site web personnel) . Évalué à 4.

          T'as toujours le droit de faire ça quand c'est pour ton usage personnel.

          Est-ce que c'est vrai dans le cas d'un programme propriétaire ? Par exemple, est-ce que la licence de Windows autoriserait que l'on modifie le code pour un usage personnel ? Je ne suis pas sûr, mais il faudrait vérifier.

    • [^] # Re: licence libre != accès libre

      Posté par  (site web personnel) . Évalué à 5.

      Et tu as bien raison de chipoter. Mais je ne touche plus à ce journal, il est maudit.

    • [^] # Re: licence libre != accès libre

      Posté par  (site web personnel) . Évalué à 3. Dernière modification le 09 janvier 2023 à 16:59.

      ils sont en accès libre mais ils ne sont aucune des « articles sous licence libre ».

      J'avais voulu avant toi faire le râleur de service (mon petit plaisir sur ceux qui pensent que ND ou NC a quelque chose à voir avec le libre), mais j'avais que vu le titre qui faisait clairement la différence, le salaud il m'a trompé en faisant un titre correct mais un petit texte dans le contenu!
      Je me vengerai.

      Je chipoterai sur un autre commentaire ensuite :

      C'est juste, le ND est contraire à la définition des licences libres :

      Bizarre d'avoir noté sur ND mais pas sur NC, tout autant contraire à la définition de libre (et plus souvent "accepté" voir militant par certains comme libre).

      • [^] # Re: licence libre != accès libre

        Posté par  (site web personnel) . Évalué à 3.

        Bizarre d'avoir noté sur ND mais pas sur NC, tout autant contraire à la définition de libre (et plus souvent "accepté" voir militant par certains comme libre).

        Un logiciel libre ne pourrait pas être commercialisé ?

        Je lis dans Wikipedia sur la GNU GPL :

        Les termes de la GPL autorisent toute personne à recevoir une copie d'un travail sous GPL. Chaque personne qui adhère aux termes et aux conditions de la GPL a la permission de modifier le travail, de l'étudier et de redistribuer le travail ou un travail dérivé. Cette personne peut toucher de l'argent pour ce service ou bien ne rien toucher. Ce dernier point distingue la GPL des autres licences de logiciels qui interdisent la redistribution dans un but commercial. Stallman pense que le logiciel libre ne devrait pas placer de restriction sur l'utilisation commerciale, et la GPL indique explicitement qu'un travail sous GPL peut être (re)vendu. En cas de modification, le résultat doit être placé sous la même licence.

        • [^] # Re: licence libre != accès libre

          Posté par  (site web personnel) . Évalué à 7. Dernière modification le 09 janvier 2023 à 17:28.

          Un logiciel libre ne pourrait pas être commercialisé ?

          Pas compris.
          Ce que je dis est justement l'inverse : contrairement à ce que pas mal de gens se revendiquant libriste aimeraient avoir dans le libre, le NC est incompatible avec le libre, au même niveau que ND (=0% libre pour chacun des 2), justement.

          L'auteur du commentaire que j'ai cité a noté que la licence CC-NC-ND n'est pas libre parce que il y a ND, mais en fait en enlèverai ND que ça ne serait toujours pas libre, car la CC-NC n'étant pas libre non plus.

          Je relève juste qu'1 seul des 2 éléments bloquants a été relevé, et l'autre zappé, alors qu'ils sont à égalité (ils empêchent tous les 2 de dire que la licence est libre).

          • [^] # Re: licence libre != accès libre

            Posté par  (site web personnel) . Évalué à 6.

            Je relève juste qu'1 seul des 2 éléments bloquants a été relevé, et l'autre zappé, alors qu'ils sont à égalité (ils empêchent tous les 2 de dire que la licence est libre).

            autant pour moi, oui c'est vrai.

            C'est vrai que j'accorde plus d'importance au fait de pouvoir modifier et redistribuer qu'au fait de pouvoir commercialiser. Mais c'est personnel.

            • [^] # Re: licence libre != accès libre

              Posté par  (site web personnel) . Évalué à -10. Dernière modification le 09 janvier 2023 à 17:55.

              C'est vrai que j'accorde plus d'importance au fait de pouvoir modifier et redistribuer qu'au fait de pouvoir commercialiser.

              Pour titiller : on est donc bien d'accord que tu accordes plus d'importance à du non libre que du libre, dit autrement le fait que ce soit libre t'importe que peu, dit autrement le libre n'a pour toi pas beaucoup d'importance à tes yeux?

              Aucun jugement (chacun est libre de ses priorités, le tout est d'avoir le même vocabulaire pour ne pas tromper les autres sur ce qu'on aime, ça va aussi très bien de filtrer suivant si c'est libre diffusion hors ND ou pas, comme tu dis c'est personnel), c'est juste par curiosité de connaître ton positionnement sur le libre.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.