Outils pour utilisateurs

Outils du site


nsi:tds:flux_rss

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:tds:flux_rss [2024/04/24 21:59] goupillwikinsi:tds:flux_rss [2024/04/29 14:18] (Version actuelle) goupillwiki
Ligne 99: Ligne 99:
  
 <code python> <code python>
 +# root.getElementByTagName('item') renvoie la liste des noeuds <item> sous root
 for article in root.getElementsByTagName('item'): for article in root.getElementsByTagName('item'):
-    # article correspond à un noeud <item> trouvez sous la racine +    # article correspond à un des noeuds <item> 
-    child0 = article.childNodes[0] # premier noeud enfant de article+    titlenode = article.childNodes[0] # premier noeud enfant de article
     # dans le flux, l'enfant [0] est toujours un noeud <title>     # dans le flux, l'enfant [0] est toujours un noeud <title>
-    textnode = child0.childNodes[0] +    # donc titlenode est un noeud <title> 
-    # textnode est l'unique enfant du noeud <item> +    textnode = titlenode.childNodes[0] 
-    print(textNode.data ) # affiche le contenu text+    # titlenode a un unique enfant, c'est un noeud de texte 
 +    # textnode est donc le noeud contenant le texte du noeud <item> titlenode 
 +    print(textNode.data) # par exemple, on affiche le contenu de textnode, c'est à dire le titre
 </code> </code>
  
Ligne 115: Ligne 118:
   - affichage des titres (//à faire//)   - affichage des titres (//à faire//)
  
-> **Remarque :** La plupart des sites sont aujourd'hui en https, c'est à dire chiffrés. Cela occasionne quelques complications. J'ai commenté autant que possible pour que vous compreniez le principe général. Dans tous les cas, gardez à l'esprit que, en fonction des évolutions des technologies, on est obligé de s'adapter. Par exemple, ici, j'ai découvert la bibliothèque python ssl à l'occasion de cet exercice. On a donc besoin de savoir lire des documentations sur internet pour prendre en main ces outils. +<WRAP tip>**Remarque :** La plupart des sites sont aujourd'hui en https, c'est à dire chiffrés. Cela occasionne quelques complications. J'ai commenté autant que possible pour que vous compreniez le principe général. Dans tous les cas, gardez à l'esprit que, en fonction des évolutions des technologies, on est obligé de s'adapter. Par exemple, ici, j'ai découvert la bibliothèque python ssl à l'occasion de cet exercice. On a donc besoin de savoir lire des documentations sur internet pour prendre en main ces outils.</WRAP>
  
 <code python linenums> <code python linenums>
Ligne 124: Ligne 126:
 import socket       # pour création socket TCP-IP import socket       # pour création socket TCP-IP
 import ssl          # gestion chiffrement pages https import ssl          # gestion chiffrement pages https
 +import urllib.request as req
 import xml.dom.minidom as xml import xml.dom.minidom as xml
  
-HTTP_VERSION = 1.0 +def get_xml(url):
-CRLF = "\r\n\r\n" +
- +
- +
- +
-# création d'un contexte sécurisé avec ssl +
-context = ssl.SSLContext() +
- +
- +
- +
-# Dans certains cas on utilise une ressource. Il faut demander au système d'exploitation +
-# de nous donner accès à cette ressource puis il faut lui dire quand on libère cette ressource. +
-# ex : ouverture / fermeture de fichier ; ouverture / fermeture de connexion +
-# avec le mot clé with, on crée un bloc qui réserve la ressource +
-# puis la libère dès qu'on sort du bloc. +
- +
-def cut_xml_part(text:str):+
     """     """
-    Renvoie le contenu de text à partir de "<?xml" +    url: adresse du flux rss
-    """ +
-    if "<?xml" not in text: +
-        return "" +
-    i = text.index("<?xml"+
-    return text[i:] +
- +
-def get_xml(hostname, address): +
-    """ +
-    hostname: nom du domaine hébergeant le flux +
-    address: adresse du flux rss+
     renvoie le contenu du fichier xml     renvoie le contenu du fichier xml
     """     """
-    # 443 est le port habituel pour https +    context = ssl.SSLContext() 
-    with socket.create_connection((hostname, 443)) as sock: +    with req.urlopen(urlcontext=context) as reponse
-        # sock est "emballé" dans le contexte sécurisé (donnée cryptée) avec ssl +        return reponse.read().decode('utf8'
-        with context.wrap_socket(sockserver_hostname=hostname) as ssock+    
-            # lancement la requête GET en précisant l'adresse +
-            ssock.send("GET {} HTTP/{} {}".format(address, HTTP_VERSION, CRLF).encode()) +
-            # la taille de la réponse est inconnue. +
-            # on réceptionne par morceaux de 1024 octets. +
-            reponse_xml = "" # au début la réponse est vide. +
- +
-            while True: +
-                block = ssock.recv(1024) +
-                if not block: +
-                    # block est vide, il n'y a plus rien à récupérer +
-                    # sortie de la boucle +
-                    break +
-                reponse_xml += block.decode("utf-8"+
-            return cut_xml_part(reponse_xml+
 def get_titles(texte_xml): def get_titles(texte_xml):
     '''     '''
Ligne 185: Ligne 147:
     pass     pass
 </code> </code>
 +
 +<WRAP important>En ligne 14 j'ai changé l'ancien ''context = ssl.create_default_context()'' qui ne fonctionnait plus pour ''ssl.SSLContext()''. Ce n'est pas idéal car ce choix fait qu'on ne vérifie pas le certificat ssl du site. Cela nous évite les erreurs mais est potentiellement dangereux (les certificats sont là pour la sécurité). Toutefois, dans le cadre de ce TP on échange aucune donnée sensible et on ne risque rien.</WRAP>
  
 <code python linenums> <code python linenums>
 +# main.py
 +
 from  rss import get_xml, get_titles from  rss import get_xml, get_titles
  
-# le flux qui nous sert d'exemple est un flux d'actualité sur wwww.francetvinfo.fr 
-# on donne l'adresse du serveur (domaine) 
-hostname = 'www.francetvinfo.fr' 
-  
 # adresse du flux lui-même # adresse du flux lui-même
-address = 'https://www.francetvinfo.fr/titres.rss'+url = 'https://www.francetvinfo.fr/titres.rss'
    
-xml = get_xml(hostname, address)+xml = get_xml(url)
 titles = get_titles(xml) titles = get_titles(xml)
  
Ligne 202: Ligne 164:
 print(titles[:3]) print(titles[:3])
 </code> </code>
- 
- 
- 
-<WRAP important>En ligne 14 j'ai changé l'ancien ''context = ssl.create_default_context()'' qui ne fonctionnait plus pour ''ssl.SSLContext()''. Ce n'est pas idéal car ce choix fait qu'on ne vérifie pas le certificat ssl du site. Cela nous évite les erreurs mais est potentiellement dangereux (les certificats sont là pour la sécurité). Toutefois, dans le cadre de ce TP on échange aucune donnée sensible et on ne risque rien.</WRAP> 
- 
-<WRAP tip>Tout le bloc des lignes 1 à 49 permet de comprendre le principe de l'échange. On peut passer par des modules qui font le tout de façon plus courtes. 
- 
-<code python linenums> 
-import ssl 
-import urllib.request as req 
-url = "https://www.francetvinfo.fr/titres.rss" 
-context = ssl.SSLContext()  # supprime la vérification du ssl 
-reponseXML = req.urlopen(url, context=context).read() 
-</code> 
-</WRAP> 
nsi/tds/flux_rss.1713988746.txt.gz · Dernière modification : de goupillwiki