Différences entre les versions de « ERG::Code-2020-2 »

De {}
Aller à la navigation Aller à la recherche
 
(25 versions intermédiaires par 6 utilisateurs non affichées)
Ligne 3 : Ligne 3 :
  
 
==Sessions==
 
==Sessions==
 +
===22 avril 2021===
 +
<syntaxhighlight lang="python">
 +
import time
 +
import mechanize
 +
import lxml.html as lh
 +
import cssselect
 +
import ssl
 +
import os
 +
from urllib.parse import urlparse
 +
import mysql.connector as mysql
 +
 +
def getSrcFromURL(url):
 +
    data = br.open(url)
 +
 +
    rawdata = data.read()
 +
    unicode = rawdata.decode('utf-8', 'ignore')
 +
    src = lh.fromstring(unicode)
 +
    return src
 +
 +
def getResults(src, selecteurs):
 +
    results = []
 +
    cssSelectSelecteurs = cssselect.parse(selecteurs)
 +
    for cssSelectSelecteur in cssSelectSelecteurs:
 +
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)
 +
        results = results + src.xpath(chemin_xpath)
 +
 +
    return results
 +
 +
 +
#initialisation de l'objet db, interface avec la base de données mysql
 +
db = mysql.connect(
 +
    host = "localhost",
 +
   
 +
    user = "root",
 +
    passwd = "cry373",
 +
    database = "indice_popularité_termes"
 +
)
 +
 +
def getData(htmlElements, operation):
 +
    data = []
 +
    for element in htmlElements:
 +
        if operation == 'get_href':
 +
            data.append(element.get('href'))
 +
        elif operation == 'get_content_date':
 +
            #2021-04-19T10:09:10+00:00
 +
            #2021-04-19 10:09:10
 +
            date = element.get('content')
 +
            date = date.replace('T', ' ')
 +
            date = date[0:19]
 +
            data.append(date)
 +
        elif operation == 'text_content':
 +
            data.append(element.text_content())
 +
        elif operation == 'get_datetime':
 +
            data.append(element.get('datetime'))
 +
 +
    return data
 +
 +
 +
selecteurs = [
 +
    #  {
 +
    #    'url':'https://www.lenouvelliste.ch',
 +
    #    'selecteur_links':{'name':'article_link', 'selecteur':'h1 a, h3 a', 'operation':'get_href'},
 +
    #    'selecteurs_article':[
 +
    #        {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
 +
    #        {'name': 'date_pub', 'selecteur': 'article datetime', 'operation':'text_content'},
 +
    #    ]
 +
 +
    # },
 +
    # {
 +
    #    'url':'https://www.arcinfo.ch',
 +
    #    'selecteur_links':{'name':'article_link', 'selecteur':'h1 a, h3 a', 'operation':'get_href'},
 +
    #    'selecteurs_article':[
 +
    #        {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
 +
    #        {'name': 'date_pub', 'selecteur': 'article datetime', 'operation':'text_content'},
 +
    #    ]
 +
 +
    # },
 +
    # {
 +
    #    'url':'https://www.heidi.news',
 +
    #    'selecteur_links':{'name':'article_link', 'selecteur':'h3 a, h2 a', 'operation':'get_href'},
 +
    #    'selecteurs_article':[
 +
    #        {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
 +
    #        {'name': 'date_pub', 'selecteur': 'article datetime', 'operation':'text_content'},
 +
    #    ]
 +
 +
    # },
 +
    # {
 +
    #    'url':'https://www.lacote.ch',
 +
    #    'selecteur_links':{'name':'article_link', 'selecteur':'h3 a, h2 a', 'operation':'get_href'},
 +
    #    'selecteurs_article':[
 +
    #        {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
 +
    #        {'name': 'date_pub', 'selecteur': 'article datetime', 'operation':'text_content'},
 +
    #    ]
 +
 +
    # },
 +
    # {
 +
    #    'url':'https://lecourrier.ch',
 +
    #    'selecteur_links':{'name':'article_link', 'selecteur':'a.c-Card-permalink', 'operation':'get_href'},
 +
    #    'selecteurs_article':[
 +
    #        {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
 +
    #        {'name': 'date_pub', 'selecteur': 'article metaDate', 'operation':'text_content'},
 +
    #    ]
 +
 +
    # },
 +
    {
 +
        'url':'https://lemonde.fr',
 +
        'source_id':1,
 +
        'selecteur_links':{'name':'article_link', 'selecteur':'div.article a','operation':'get_href'},
 +
        'selecteurs_article':[
 +
            {'name': 'titre', 'selecteur': 'h1.article__title', 'operation':'text_content'},
 +
            {'name': 'date_pub', 'selecteur': 'meta[property="og:article:published_time"]', 'operation':'get_content_date'}, 
 +
        ]
 +
 +
    },
 +
    # {
 +
    #    'url':'https://www.lefigaro.fr',
 +
    #    'selecteur_links':{'name':'article_link', 'selecteur':'a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link', 'operation':'get_href'},
 +
    #    'selecteurs_article':[
 +
    #        {'name': 'titre', 'selecteur': 'h1', 'operation':'text_content'},
 +
    #        {'name': 'date_pub', 'selecteur': 'span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small', 'operation':'text_content'}, 
 +
    #    ]
 +
 +
    # },
 +
    # {
 +
    #    'url':'https://www.la-croix.com',
 +
    #    'selecteur_links':{'name':'article_link', 'selecteur':'a.block-item__title', 'operation':'get_href'},
 +
    #    'selecteurs_article':[
 +
    #        {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
 +
    #        {'name': 'date_pub', 'selecteur': 'div .font_xs color_grey margin-xxs-right font_tertiary', 'operation':'text_content'},
 +
    #    ]
 +
 +
    # },
 +
]
 +
 +
#initialisation d'un objet "navigateur" avec la librairie mechanize
 +
br = mechanize.Browser()
 +
 +
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 +
 +
br.set_handle_robots(False)
 +
#fin de la configuration de mechanize
 +
 +
try:
 +
    _create_unverified_https_context = ssl._create_unverified_context
 +
except AttributeError:
 +
    # Legacy Python that doesn't verify HTTPS certificates by default
 +
    pass
 +
else:
 +
    # Handle target environment that doesn't support HTTPS verification
 +
    ssl._create_default_https_context = _create_unverified_https_context
 +
 +
#0: pour chaque source dans le tableau sélecteurs
 +
for source in selecteurs:
 +
    #0:récupérer l'id de la source dans la base de données
 +
    sourceId = source['source_id']
 +
    #1: récupérer la première page de la source
 +
    premierePage = getSrcFromURL(source['url'])
 +
    #2: appliquer le sélecteur contenu dans 'selecteur_links'
 +
    liensArticles = getResults(premierePage, source['selecteur_links']['selecteur'])
 +
    #3: appliquer l'opération sur chaque élément récupéré -> url articles
 +
    urlsArticles = getData(liensArticles, source['selecteur_links']['operation'])
 +
    #4: pour chaque url article:
 +
    for urlArticle in urlsArticles:
 +
        #5: checker si l'url de l'article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations
 +
        query = "SELECT * FROM article WHERE url='"+urlArticle+"'"
 +
        alreadyInDB = False
 +
        with db.cursor() as cursor:
 +
            cursor.execute(query)
 +
            result = cursor.fetchall()
 +
            if len(result) > 0:
 +
                alreadyInDB = True
 +
       
 +
        if(alreadyInDB == True):
 +
            continue
 +
 +
        #5bis: récupérer la source de la page désignée par l'url
 +
        # print(urlArticle)
 +
        sourceUrl = getSrcFromURL(urlArticle)
 +
        print(sourceUrl)
 +
        print(urlArticle)
 +
        # print(sourceUrl)
 +
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -> dataArticle
 +
        dataArticle = []
 +
        # #7: pour chaque sélecteur contenu dans "selecteurs_article":
 +
        for selecteur_article in source['selecteurs_article']:
 +
        #    #8: appliquer le sélecteur article sur la source de la page
 +
            applySelector = getResults(sourceUrl, selecteur_article['selecteur'])
 +
            # print(applySelector)
 +
        #    #9: appliquer l'opération sur l'élément récupéré -> donnée
 +
            operateelement = getData(applySelector, selecteur_article['operation'])
 +
            #10: ajouter la donnée au tableau dataArticle
 +
            dataArticle.append(operateelement)
 +
        print(dataArticle)
 +
 +
        if(len(dataArticle[0]) == 0):
 +
            continue
 +
       
 +
        #[['Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique'], ['2021-04-18 02:33:09']]
 +
        # #11: insérer le tableau dans la base de données
 +
        query = "INSERT INTO article (titre, date_crea, url, source_id) VALUES ('"+dataArticle[0][0]+"', '"+dataArticle[1][0]+"', '"+urlArticle+"', '"+str(sourceId)+"')"
 +
        print(query)
 +
        # query = "INSERT INTO article (titre, date_crea, source_id) VALUES ('%s', '%s', 1)" % (dataArticle[0], dataArticle[1])
 +
 +
        cursor = db.cursor()
 +
        cursor.execute(query)
 +
        db.commit()
 +
 +
</syntaxhighlight>
 +
 +
 +
===01 avril 2021===
 +
Programme de récupération de données d'actualité: structure générale
 +
<syntaxhighlight lang="python">
 +
import time
 +
import mechanize
 +
import lxml.html as lh
 +
import cssselect
 +
 +
 +
def getSrcFromURL(url):
 +
    data = br.open(url)
 +
 +
    rawdata = data.read()
 +
    unicode = rawdata.decode('utf-8', 'ignore')
 +
    src = lh.fromstring(unicode)
 +
    return src
 +
 +
def getResults(src, selecteurs):
 +
    results = []
 +
    cssSelectSelecteurs = cssselect.parse(selecteurs)
 +
    for cssSelectSelecteur in cssSelectSelecteurs:
 +
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)
 +
        results = results + src.xpath(chemin_xpath)
 +
 +
    return results
 +
 +
def getData(htmlElements, operation):
 +
    data = []
 +
    for element in htmlElements:
 +
        if operation == 'get_href':
 +
            data.append(element.get('href'))
 +
        elif operation == 'text_content':
 +
            data.append(element.text_content())
 +
        elif operation == 'get_datetime':
 +
            data.append(element.get('datetime'))
 +
 +
    return data
 +
 +
 +
 +
selecteurs = [
 +
    {
 +
        'url':'http://lemonde.fr',
 +
        'selecteur_links':{'name':'article_link', 'selecteur':'div.article a','operation':'get_href'},
 +
        'selecteurs_article':[
 +
            {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
 +
            {'name': 'date_pub', 'selecteur': 'span.date_pub', 'operation':'text_content'},
 +
            {'name': 'date_modif', 'selecteur': 'span.date_modif', 'operation':'text_content'} 
 +
        ]
 +
 +
    },
 +
    {
 +
        'url':'http://lesoir.be',
 +
        'selecteur_links':{'name':'article_link', 'selecteur':'h1 a','operation':'get_href'},
 +
        'selecteurs_article':[
 +
            {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
 +
            {'name': 'date_pub', 'selecteur': 'span.date_pub', 'operation':'text_content'},
 +
            {'name': 'date_modif', 'selecteur': 'span.date_modif', 'operation':'text_content'}
 +
        ]
 +
 +
    }
 +
]
 +
 +
#initialisation d'un objet "navigateur" avec la librairie mechanize
 +
br = mechanize.Browser()
 +
 +
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 +
 +
br.set_handle_robots(False)
 +
#fin de la configuration de mechanize
 +
 +
 +
 +
#0: pour chaque source dans le tableau sélecteurs
 +
for source in selecteurs:
 +
    #1: récupérer la première page de la source
 +
    premierePage = getSrcFromURL(source['url'])
 +
    #2: appliquer le sélecteur contenu dans 'selecteur_links'
 +
    liensArticles = getResults(premierePage, source['selecteur_links']['selecteur'])
 +
    #3: appliquer l'opération sur chaque élément récupéré -> url articles
 +
    urlsArticles = getData(liensArticles, source['selecteur_links']['operation'])
 +
    #4: pour chaque url article:
 +
        #5: récupérer la source de la page désignée par l'url
 +
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -> dataArticle
 +
        #7: pour chaque sélecteur contenu dans "selecteurs_article":
 +
            #8: appliquer le sélecteur article sur la source de la page
 +
            #9: appliquer l'opération sur l'élément récupéré -> donnée
 +
            #10: ajouter la donnée au tableau dataArticle
 +
        #11: insérer le tableau dans la base de données
 +
 +
    print(urlsArticles)
 +
    time.sleep(2)
 +
 +
 +
 +
</syntaxhighlight>
 +
 +
===18 mars 2021===
 +
 +
Exemple de structure de données pour récupérer plusieurs sources
 +
 +
<syntaxhighlight lang="python">
 +
selecteurs = [
 +
    {
 +
        'url':'http://lemonde.fr',
 +
        'selecteur_links':'h1 a',
 +
        'selecteurs_article':{
 +
            'titre':'article h1',
 +
            'date_pub':'span.date_pub',
 +
            'date_modif':'span.date_modif'
 +
        }
 +
 +
    },
 +
    {
 +
        'url':'http://lesoir.be',
 +
        'selecteur_links':'h1 a',
 +
        'selecteurs_article':{
 +
            'titre':'article h1',
 +
            'date_pub':'span.date_pub',
 +
            'date_modif':'span.date_modif'
 +
        }
 +
       
 +
    }
 +
]
 +
 +
print(selecteurs[0]['selecteurs_article']['date_pub'])
 +
</syntaxhighlight>
 +
 +
 +
===4 mars 2021===
 +
<syntaxhighlight lang="sql">
 +
-- phpMyAdmin SQL Dump
 +
-- version 4.9.7deb1
 +
-- https://www.phpmyadmin.net/
 +
--
 +
-- Host: localhost:3306
 +
-- Generation Time: Mar 04, 2021 at 10:12 AM
 +
-- Server version: 10.3.24-MariaDB-2
 +
-- PHP Version: 7.4.11
 +
 +
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
 +
SET AUTOCOMMIT = 0;
 +
START TRANSACTION;
 +
SET time_zone = "+00:00";
 +
 +
 +
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
 +
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
 +
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
 +
/*!40101 SET NAMES utf8mb4 */;
 +
 +
--
 +
-- Database: `news_suisse`
 +
--
 +
 +
-- --------------------------------------------------------
 +
 +
--
 +
-- Table structure for table `article`
 +
--
 +
 +
CREATE TABLE `article` (
 +
  `id` int(10) UNSIGNED NOT NULL,
 +
  `titre` text NOT NULL,
 +
  `header` text NOT NULL,
 +
  `body` text NOT NULL,
 +
  `date_crea` datetime NOT NULL DEFAULT current_timestamp(),
 +
  `date_modif` datetime NOT NULL DEFAULT current_timestamp(),
 +
  `url` text DEFAULT NULL,
 +
  `source_id` int(10) UNSIGNED NOT NULL
 +
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 +
 +
-- --------------------------------------------------------
 +
 +
--
 +
-- Table structure for table `article_auteur`
 +
--
 +
 +
CREATE TABLE `article_auteur` (
 +
  `id` int(10) UNSIGNED NOT NULL,
 +
  `id_article` int(10) UNSIGNED NOT NULL,
 +
  `id_auteurice` int(10) UNSIGNED NOT NULL
 +
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 +
 +
-- --------------------------------------------------------
 +
 +
--
 +
-- Table structure for table `article_mots`
 +
--
 +
 +
CREATE TABLE `article_mots` (
 +
  `id` int(10) UNSIGNED NOT NULL,
 +
  `id_article` int(11) NOT NULL,
 +
  `id_mots` int(11) NOT NULL
 +
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 +
 +
-- --------------------------------------------------------
 +
 +
--
 +
-- Table structure for table `aut-eur-rice`
 +
--
 +
 +
CREATE TABLE `aut-eur-rice` (
 +
  `id` int(10) UNSIGNED NOT NULL,
 +
  `nom` text NOT NULL,
 +
  `prénom` text NOT NULL,
 +
  `bio` text NOT NULL
 +
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 +
 +
-- --------------------------------------------------------
 +
 +
--
 +
-- Table structure for table `mots`
 +
--
 +
 +
CREATE TABLE `mots` (
 +
  `id` int(10) UNSIGNED NOT NULL,
 +
  `mots` text NOT NULL,
 +
  `fréquence` int(11) NOT NULL
 +
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 +
 +
-- --------------------------------------------------------
 +
 +
--
 +
-- Table structure for table `source`
 +
--
 +
 +
CREATE TABLE `source` (
 +
  `id` int(10) UNSIGNED NOT NULL,
 +
  `nom` text NOT NULL,
 +
  `url` text NOT NULL
 +
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 +
 +
--
 +
-- Indexes for dumped tables
 +
--
 +
 +
--
 +
-- Indexes for table `article`
 +
--
 +
ALTER TABLE `article`
 +
  ADD PRIMARY KEY (`id`);
 +
 +
--
 +
-- Indexes for table `article_auteur`
 +
--
 +
ALTER TABLE `article_auteur`
 +
  ADD PRIMARY KEY (`id`);
 +
 +
--
 +
-- Indexes for table `article_mots`
 +
--
 +
ALTER TABLE `article_mots`
 +
  ADD PRIMARY KEY (`id`);
 +
 +
--
 +
-- Indexes for table `aut-eur-rice`
 +
--
 +
ALTER TABLE `aut-eur-rice`
 +
  ADD PRIMARY KEY (`id`);
 +
 +
--
 +
-- Indexes for table `mots`
 +
--
 +
ALTER TABLE `mots`
 +
  ADD PRIMARY KEY (`id`);
 +
 +
--
 +
-- Indexes for table `source`
 +
--
 +
ALTER TABLE `source`
 +
  ADD PRIMARY KEY (`id`);
 +
 +
--
 +
-- AUTO_INCREMENT for dumped tables
 +
--
 +
 +
--
 +
-- AUTO_INCREMENT for table `article`
 +
--
 +
ALTER TABLE `article`
 +
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
 +
 +
--
 +
-- AUTO_INCREMENT for table `article_auteur`
 +
--
 +
ALTER TABLE `article_auteur`
 +
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
 +
 +
--
 +
-- AUTO_INCREMENT for table `article_mots`
 +
--
 +
ALTER TABLE `article_mots`
 +
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
 +
 +
--
 +
-- AUTO_INCREMENT for table `aut-eur-rice`
 +
--
 +
ALTER TABLE `aut-eur-rice`
 +
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
 +
 +
--
 +
-- AUTO_INCREMENT for table `mots`
 +
--
 +
ALTER TABLE `mots`
 +
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
 +
 +
--
 +
-- AUTO_INCREMENT for table `source`
 +
--
 +
ALTER TABLE `source`
 +
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
 +
COMMIT;
 +
 +
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 +
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
 +
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 +
</syntaxhighlight>
 +
<syntaxhighlight lang="python">
 +
import mechanize
 +
 +
import lxml.html as lh
 +
 +
import cssselect
 +
 +
import ssl
 +
 +
import os
 +
 +
from urllib.parse import urlparse
 +
 +
import mysql.connector as mysql
 +
 +
 +
 +
def getSrcFromURL(url):
 +
    data = br.open(url)
 +
 +
    rawdata = data.read()
 +
    unicode = rawdata.decode('utf-8', 'ignore')
 +
    src = lh.fromstring(unicode)
 +
    return src
 +
 +
def getResults(src, selecteur):
 +
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
 +
    results = src.xpath(chemin_xpath)
 +
    return results
 +
 +
 +
#initialisation de l'objet db, interface avec la base de données mysql
 +
db = mysql.connect(
 +
    host = "localhost",
 +
    user = "root",
 +
    passwd = "root",
 +
    database = "news_suisse"
 +
)
 +
 +
#SELECT = sélectionner des données
 +
#INSERT = insérer des données
 +
#UPDATE = mettre à jour des données
 +
#DELETE = supprimer des données
 +
 +
 +
#query = "SELECT * FROM article WHERE titre = '%chat%'"
 +
 +
query = "SELECT * FROM article"
 +
 +
 +
with db.cursor() as cursor:
 +
    cursor.execute(query)
 +
    result = cursor.fetchall()
 +
    for row in result:
 +
        print(row)
 +
</syntaxhighlight>
 +
 +
===25 février 2021===
 +
<syntaxhighlight lang="python">
 +
#un programme qui récupère les données contenues dans les sélecteurs css suivants à partir d'une page d'article de 24heures.ch
 +
#article h1, article h2, article h3, article p et article time
 +
 +
import mechanize
 +
 +
import lxml.html as lh
 +
 +
import cssselect
 +
 +
import ssl
 +
 +
import os
 +
 +
from urllib.parse import urlparse
 +
 +
import mysql.connector as mysql
 +
 +
 +
 +
def getSrcFromURL(url):
 +
    data = br.open(url)
 +
   
 +
    rawdata = data.read()
 +
    unicode = rawdata.decode('utf-8', 'ignore')
 +
    src = lh.fromstring(unicode)
 +
    return src
 +
 +
def getResults(src, selecteur):
 +
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
 +
    results = src.xpath(chemin_xpath)
 +
    return results
 +
 +
 +
#initialisation de l'objet db, interface avec la base de données mysql
 +
db = mysql.connect(
 +
    host = "localhost",
 +
    user = "root",
 +
    passwd = "cry373",
 +
    database = "news_suisse"
 +
)
 +
 +
 +
#initialisation d'un objet "navigateur" avec la librairie mechanize
 +
br = mechanize.Browser()
 +
 +
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 +
 +
br.set_handle_robots(False)
 +
#fin de la configuration de mechanize
 +
 +
try:
 +
    _create_unverified_https_context = ssl._create_unverified_context
 +
except AttributeError:
 +
    # Legacy Python that doesn't verify HTTPS certificates by default
 +
    pass
 +
else:
 +
    # Handle target environment that doesn't support HTTPS verification
 +
    ssl._create_default_https_context = _create_unverified_https_context
 +
 +
 +
 +
#data = br.open('https://lecourrier.ch/2021/02/10/morten-gisselbaek-le-candidat-de-la-decroissance/', timeout=10.0)
 +
 +
src = getSrcFromURL('https://lecourrier.ch/theme/neuchatel/')
 +
 +
 +
selecteurs = cssselect.parse('article h1 a.c-Card-permalink')
 +
 +
 +
for selecteur in selecteurs:
 +
    print(selecteur)
 +
    articleLinks = getResults(src, selecteur)
 +
   
 +
    for articleLink in articleLinks:
 +
        print(articleLink.get('href'))
 +
        src = getSrcFromURL(articleLink.get('href'))
 +
       
 +
        selecteursArticle = cssselect.parse('article h1.c-Article-titre, article .c-Article-chapeau, article .c-Article-texte')
 +
        articleDB = []
 +
        for selecteurArticle in selecteursArticle:
 +
            print(selecteurArticle)
 +
            resultats = getResults(src, selecteurArticle)
 +
           
 +
            for resultat in resultats:
 +
                articleDB.append(resultat.text_content())
 +
                break
 +
           
 +
        print(articleDB)
 +
        #query = "INSERT INTO article (titre, header, body) VALUES ("+articleDB[0]+", "+articleDB[1]+", "+articleDB[2]+")"
 +
        query = "INSERT INTO article (titre, header, body, source_id) VALUES ('%s', '%s', '%s', 1)" % (articleDB[0], articleDB[1], articleDB[2])
 +
 +
        cursor = db.cursor()
 +
        cursor.execute(query)
 +
        db.commit()
 +
 +
</syntaxhighlight>
 +
 +
 +
<syntaxhighlight lang="python">
 +
import mysql.connector as mysql
 +
 +
db = mysql.connect(
 +
    host = "localhost",
 +
    user = "root",
 +
    passwd = "cry373",
 +
    database = "news_suisse"
 +
)
 +
 +
 +
 +
 +
#SELECT = sélectionner des données
 +
#INSERT = insérer des données
 +
#UPDATE = mettre à jour des données
 +
#DELETE = supprimer des données
 +
 +
 +
 +
#query = "SELECT * FROM article WHERE titre = '%chat%'"
 +
 +
query = "SELECT * FROM article"
 +
 +
with db.cursor() as cursor:
 +
    cursor.execute(query)
 +
    result = cursor.fetchall()
 +
    for row in result:
 +
        print(row)
 +
 +
 +
query = "INSERT INTO article (titre, header, body, date_crea, date_modif, url, source_id) VALUES ('article numéro 2', 'header de l article','le texte', '2021-02-25 11:15:00', '2021-02-25 11:15:00', 'http://fausseurl.com', 1)"
 +
 +
cursor = db.cursor()
 +
cursor.execute(query)
 +
db.commit()
 +
 +
 +
</syntaxhighlight>
 +
 +
 +
<syntaxhighlight lang="python">
 +
import mysql.connector as mysql
 +
 +
db = mysql.connect(
 +
    host = "localhost",
 +
    user = "root",
 +
    passwd = "",
 +
    database = "news_suisse"
 +
)
 +
 +
 +
 +
query = "SELECT * FROM article"
 +
 +
 +
with db.cursor() as cursor:
 +
    cursor.execute(query)
 +
    result = cursor.fetchall()
 +
    for row in result:
 +
        print(row)
 +
 +
</syntaxhighlight>
 +
 +
===18 février 2021===
 +
<syntaxhighlight lang="python">
 +
#un programme qui récupère les données contenues dans les sélecteurs css suivants à partir d'une page d'article de 24heures.ch
 +
#article h1, article h2, article h3, article p et article time
 +
 +
import mechanize
 +
 +
import lxml.html as lh
 +
 +
import cssselect
 +
 +
import ssl
 +
 +
import os
 +
 +
from urllib.parse import urlparse
 +
 +
 +
def getSrcFromURL(url):
 +
    data = br.open(url)
 +
   
 +
    rawdata = data.read()
 +
    unicode = rawdata.decode('utf-8', 'ignore')
 +
    src = lh.fromstring(unicode)
 +
    return src
 +
 +
def getResults(src, selecteur):
 +
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
 +
    results = src.xpath(chemin_xpath)
 +
    return results
 +
 +
 +
#initialisation d'un objet "navigateur" avec la librairie mechanize
 +
br = mechanize.Browser()
 +
 +
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 +
 +
br.set_handle_robots(False)
 +
#fin de la configuration de mechanize
 +
 +
try:
 +
    _create_unverified_https_context = ssl._create_unverified_context
 +
except AttributeError:
 +
    # Legacy Python that doesn't verify HTTPS certificates by default
 +
    pass
 +
else:
 +
    # Handle target environment that doesn't support HTTPS verification
 +
    ssl._create_default_https_context = _create_unverified_https_context
 +
 +
 +
 +
#data = br.open('https://lecourrier.ch/2021/02/10/morten-gisselbaek-le-candidat-de-la-decroissance/', timeout=10.0)
 +
 +
src = getSrcFromURL('https://lecourrier.ch/theme/neuchatel/')
 +
 +
 +
selecteurs = cssselect.parse('article h1 a.c-Card-permalink')
 +
 +
 +
for selecteur in selecteurs:
 +
    print(selecteur)
 +
    articleLinks = getResults(src, selecteur)
 +
   
 +
    for articleLink in articleLinks:
 +
        print(articleLink.get('href'))
 +
        src = getSrcFromURL(articleLink.get('href'))
 +
       
 +
        selecteursArticle = cssselect.parse('article h1.c-Article-titre, article .c-Article-chapeau, article .c-Article-metaDate, article c-Article-metaJournaliste, article .c-Article-texte')
 +
        for selecteurArticle in selecteursArticle:
 +
            print(selecteurArticle)
 +
            resultats = getResults(src, selecteurArticle)
 +
           
 +
            for resultat in resultats:
 +
                print(resultat.text_content())
 +
 +
</syntaxhighlight>
 +
 +
===11 février 2021===
 +
 +
Liste des sources: sites d'actualités, Suisse Romande
 +
* 24 heures (Canton de Vaud)
 +
* Tribune de Genève (Canton de Genève)
 +
* Le Temps (Canton de Genève)
 +
* La Liberté (Canton de Fribourg)
 +
* La Gruyère (Canton de Fribourg)
 +
* Le Nouvelliste (Canton du Valais)
 +
* Arc Info (Canton de Neuchâtel)
 +
* Le Journal du Jura (partie francophone du Canton de Berne)
 +
* Le Quotidien jurassien (Canton du Jura)
 +
* La Côte (Région lémanique)
 +
* La Région (Région Nord-vaudoise)
 +
* Le Courrier (Romandie)
 +
* Le Matin (Romandie)
 +
* 20 Minutes (Romandie)
 +
 +
24 heures :
 +
https://www.24heures.ch/la-protection-civile-apprehende-une-baisse-drastique-de-ses-effectifs-630970735239
 +
selecteurs = cssselect.parse('article h1, article h2, article h3, article p, article time')
 +
 +
Tribune de Genève :
 +
https://www.tdg.ch/astrazeneca-double-ses-benefices-528778374505
 +
selecteurs = cssselect.parse('article h1, article h2, article h3, article p, article time')
 +
 +
 +
 +
La Gruyère  : https://www.lagruyere.ch/2021/02/%C2%AB-nous-demand%C3%A9-de-nous-endetter-pour-la-soci%C3%A9t%C3%A9%C2%BB.html
 +
 +
selecteurs = cssselect.parse('article h1, h2, article h3, article p, article time')
 +
 +
Le Nouvelliste : https://www.lenouvelliste.ch/articles/monde/reseaux-sociaux-twitter-ne-laissera-pas-revenir-donald-trump-1043625
 +
 +
selecteurs = cssselect.parse('article h1, h2, article h3, article p, article time')
 +
 +
 +
 +
Le Matin : https://www.lematin.ch/story/il-faut-permettre-davantage-dactivites-pour-les-jeunes-916146511842
 +
 +
Sélecteurs : cssselect.parse('div.Article_elementTitle__3we9B h1, div.Article_elementLead__2nNxU h2, h3, div.Article_elementTextblockarray__WdRYM p, .sc-17d1f6z-1.gBPCId')
 +
 +
20 Minutes : https://www.20min.ch/fr/story/futurs-apprentis-les-profs-genes-par-les-recruteurs-259502039975
 +
 +
Sélecteurs : cssselect.parse('div.Article_elementTitle__3we9B h1, div.Article_elementLead__2nNxU h2, h3, div.Article_elementTextblockarray__WdRYM p, .sc-17d1f6z-1.gBPCId')
 +
 +
La côte.ch : https://www.lacote.ch/articles/sports/tennis/tennis-open-d-australie-belinda-bencic-se-qualifie-pour-le-troisieme-tour-1043578
 +
 +
Sélécteurs : selecteurs = cssselect.parse('h1,.strong.article-header, div.datetime, div.article-main-content')
 +
 +
<syntaxhighlight lang="python">
 +
#un programme qui récupère les données contenues dans les sélecteurs css suivants à partir d'une page d'article de lecourrier.ch
 +
#article h1, article h2, article h3, article p et article time
 +
 +
import mechanize
 +
 +
import lxml.html as lh
 +
 +
import cssselect
 +
 +
import ssl
 +
 +
import os
 +
 +
from urllib.parse import urlparse
 +
 +
#initialisation d'un objet "navigateur" avec la librairie mechanize
 +
br = mechanize.Browser()
 +
 +
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 +
 +
br.set_handle_robots(False)
 +
#fin de la configuration de mechanize
 +
 +
try:
 +
    _create_unverified_https_context = ssl._create_unverified_context
 +
except AttributeError:
 +
    # Legacy Python that doesn't verify HTTPS certificates by default
 +
    pass
 +
else:
 +
    # Handle target environment that doesn't support HTTPS verification
 +
    ssl._create_default_https_context = _create_unverified_https_context
 +
 +
data = br.open('https://lecourrier.ch/2021/02/10/morten-gisselbaek-le-candidat-de-la-decroissance/', timeout=10.0)
 +
 +
 +
rawdata = data.read()
 +
unicode = rawdata.decode('utf-8', 'ignore')
 +
src = lh.fromstring(unicode)
 +
 +
 +
#on convertit un sélecteur css en objets de type "cssselector"
 +
selecteurs = cssselect.parse('article h1.c-Article-titre, article .c-Article-chapeau, article .c-Article-metaDate, article c-Article-metaJournaliste, article .c-Article-texte')
 +
 +
selecteursImages = cssselect.parse('article .c-Article-imageFeatured img')
 +
 +
for selecteur in selecteurs:
 +
    print(selecteur)
 +
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
 +
    resultats = src.xpath(chemin_xpath)
 +
    for resultat in resultats:
 +
        print(resultat.text_content())
 +
 +
for selecteur in selecteursImages:
 +
    print(selecteur)
 +
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
 +
    resultats = src.xpath(chemin_xpath)
 +
    for resultat in resultats:
 +
        imageUrl = 'https://lecourrier.ch'+resultat.get('src')
 +
        print('downloading'+imageUrl)
 +
        filename = 'test.jpg'
 +
        data = br.open(imageUrl).read()
 +
       
 +
        save = open(filename, 'wb')
 +
        save.write(data)
 +
        save.close()
 +
 +
</syntaxhighlight>
 +
 
===17 décembre 2020===
 
===17 décembre 2020===
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
Ligne 402 : Ligne 1 347 :
  
 
[[César]]
 
[[César]]
 +
 +
[[Utilisateur:arthurlafontaine|Arthur Lafontaine]]
 +
 +
[[Etienne Grignon]]
  
 
==Déroulement du cours==
 
==Déroulement du cours==

Version actuelle datée du 22 avril 2021 à 08:36

Introduction

Ce cours est destiné aux étudiant.e.s de BAC3. Cette année, nous nous concentrons sur les bases de données, définies comme "une collection structurée d'éléments sur laquelle l'utilisateur.trice peut effectuer une série d'opérations: voir, naviguer, chercher" (Lev Manovich, Le langage des Nouveaux Médias).

Sessions

22 avril 2021

import time
import mechanize
import lxml.html as lh
import cssselect
import ssl
import os
from urllib.parse import urlparse
import mysql.connector as mysql

def getSrcFromURL(url):
    data = br.open(url)

    rawdata = data.read()
    unicode = rawdata.decode('utf-8', 'ignore')
    src = lh.fromstring(unicode)
    return src

def getResults(src, selecteurs):
    results = []
    cssSelectSelecteurs = cssselect.parse(selecteurs)
    for cssSelectSelecteur in cssSelectSelecteurs:
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)
        results = results + src.xpath(chemin_xpath)

    return results


#initialisation de l'objet db, interface avec la base de données mysql
db = mysql.connect(
    host = "localhost",
    
    user = "root",
    passwd = "cry373",
    database = "indice_popularité_termes"
)

def getData(htmlElements, operation):
    data = []
    for element in htmlElements:
        if operation == 'get_href':
            data.append(element.get('href'))
        elif operation == 'get_content_date':
            #2021-04-19T10:09:10+00:00
            #2021-04-19 10:09:10
            date = element.get('content')
            date = date.replace('T', ' ')
            date = date[0:19]
            data.append(date)
        elif operation == 'text_content':
            data.append(element.text_content())
        elif operation == 'get_datetime':
            data.append(element.get('datetime'))

    return data


selecteurs = [
    #  {
    #     'url':'https://www.lenouvelliste.ch',
    #     'selecteur_links':{'name':'article_link', 'selecteur':'h1 a, h3 a', 'operation':'get_href'},
    #     'selecteurs_article':[
    #         {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
    #         {'name': 'date_pub', 'selecteur': 'article datetime', 'operation':'text_content'},
    #     ]

    # },
    # {
    #     'url':'https://www.arcinfo.ch',
    #     'selecteur_links':{'name':'article_link', 'selecteur':'h1 a, h3 a', 'operation':'get_href'},
    #     'selecteurs_article':[
    #         {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
    #         {'name': 'date_pub', 'selecteur': 'article datetime', 'operation':'text_content'},
    #     ]

    # },
    # {
    #     'url':'https://www.heidi.news',
    #     'selecteur_links':{'name':'article_link', 'selecteur':'h3 a, h2 a', 'operation':'get_href'},
    #     'selecteurs_article':[
    #         {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
    #         {'name': 'date_pub', 'selecteur': 'article datetime', 'operation':'text_content'},
    #     ]

    # },
    # {
    #     'url':'https://www.lacote.ch',
    #     'selecteur_links':{'name':'article_link', 'selecteur':'h3 a, h2 a', 'operation':'get_href'},
    #     'selecteurs_article':[
    #         {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
    #         {'name': 'date_pub', 'selecteur': 'article datetime', 'operation':'text_content'},
    #     ]

    # },
    # {
    #     'url':'https://lecourrier.ch',
    #     'selecteur_links':{'name':'article_link', 'selecteur':'a.c-Card-permalink', 'operation':'get_href'},
    #     'selecteurs_article':[
    #         {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
    #         {'name': 'date_pub', 'selecteur': 'article metaDate', 'operation':'text_content'},
    #     ]

    # },
     {
        'url':'https://lemonde.fr',
        'source_id':1,
        'selecteur_links':{'name':'article_link', 'selecteur':'div.article a','operation':'get_href'},
        'selecteurs_article':[
            {'name': 'titre', 'selecteur': 'h1.article__title', 'operation':'text_content'},
            {'name': 'date_pub', 'selecteur': 'meta[property="og:article:published_time"]', 'operation':'get_content_date'},  
        ]
 
    },
    # {
    #     'url':'https://www.lefigaro.fr',
    #     'selecteur_links':{'name':'article_link', 'selecteur':'a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link', 'operation':'get_href'},
    #     'selecteurs_article':[ 
    #         {'name': 'titre', 'selecteur': 'h1', 'operation':'text_content'},
    #         {'name': 'date_pub', 'selecteur': 'span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small', 'operation':'text_content'},  
    #     ]
 
    # },
    # {
    #     'url':'https://www.la-croix.com',
    #     'selecteur_links':{'name':'article_link', 'selecteur':'a.block-item__title', 'operation':'get_href'},
    #     'selecteurs_article':[
    #         {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
    #         {'name': 'date_pub', 'selecteur': 'div .font_xs color_grey margin-xxs-right font_tertiary', 'operation':'text_content'},
    #     ]
 
    # },
]

#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()

br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

br.set_handle_robots(False)
#fin de la configuration de mechanize

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

#0: pour chaque source dans le tableau sélecteurs
for source in selecteurs:
    #0:récupérer l'id de la source dans la base de données
    sourceId = source['source_id']
    #1: récupérer la première page de la source
    premierePage = getSrcFromURL(source['url'])
    #2: appliquer le sélecteur contenu dans 'selecteur_links'
    liensArticles = getResults(premierePage, source['selecteur_links']['selecteur'])
    #3: appliquer l'opération sur chaque élément récupéré -> url articles
    urlsArticles = getData(liensArticles, source['selecteur_links']['operation'])
    #4: pour chaque url article:
    for urlArticle in urlsArticles:
        #5: checker si l'url de l'article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations
        query = "SELECT * FROM article WHERE url='"+urlArticle+"'"
        alreadyInDB = False
        with db.cursor() as cursor:
            cursor.execute(query)
            result = cursor.fetchall()
            if len(result) > 0:
                alreadyInDB = True
        
        if(alreadyInDB == True):
            continue

        #5bis: récupérer la source de la page désignée par l'url
        # print(urlArticle)
        sourceUrl = getSrcFromURL(urlArticle)
        print(sourceUrl)
        print(urlArticle)
        # print(sourceUrl)
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -> dataArticle
        dataArticle = []
        # #7: pour chaque sélecteur contenu dans "selecteurs_article":
        for selecteur_article in source['selecteurs_article']:
        #     #8: appliquer le sélecteur article sur la source de la page
            applySelector = getResults(sourceUrl, selecteur_article['selecteur'])
            # print(applySelector)
        #     #9: appliquer l'opération sur l'élément récupéré -> donnée
            operateelement = getData(applySelector, selecteur_article['operation'])
            #10: ajouter la donnée au tableau dataArticle
            dataArticle.append(operateelement)
        print(dataArticle)

        if(len(dataArticle[0]) == 0):
            continue
        
        #[['Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique'], ['2021-04-18 02:33:09']]
        # #11: insérer le tableau dans la base de données
        query = "INSERT INTO article (titre, date_crea, url, source_id) VALUES ('"+dataArticle[0][0]+"', '"+dataArticle[1][0]+"', '"+urlArticle+"', '"+str(sourceId)+"')"
        print(query)
        # query = "INSERT INTO article (titre, date_crea, source_id) VALUES ('%s', '%s', 1)" % (dataArticle[0], dataArticle[1])

        cursor = db.cursor()
        cursor.execute(query)
        db.commit()


01 avril 2021

Programme de récupération de données d'actualité: structure générale

import time
import mechanize
import lxml.html as lh
import cssselect


def getSrcFromURL(url):
    data = br.open(url)
 
    rawdata = data.read()
    unicode = rawdata.decode('utf-8', 'ignore')
    src = lh.fromstring(unicode)
    return src

def getResults(src, selecteurs):
    results = []
    cssSelectSelecteurs = cssselect.parse(selecteurs)
    for cssSelectSelecteur in cssSelectSelecteurs:
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)
        results = results + src.xpath(chemin_xpath)

    return results

def getData(htmlElements, operation):
    data = []
    for element in htmlElements:
        if operation == 'get_href':
            data.append(element.get('href'))
        elif operation == 'text_content':
            data.append(element.text_content())
        elif operation == 'get_datetime':
            data.append(element.get('datetime'))

    return data



selecteurs = [
    {
        'url':'http://lemonde.fr',
        'selecteur_links':{'name':'article_link', 'selecteur':'div.article a','operation':'get_href'},
        'selecteurs_article':[
            {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
            {'name': 'date_pub', 'selecteur': 'span.date_pub', 'operation':'text_content'},
            {'name': 'date_modif', 'selecteur': 'span.date_modif', 'operation':'text_content'}  
        ]
 
    },
    {
        'url':'http://lesoir.be',
        'selecteur_links':{'name':'article_link', 'selecteur':'h1 a','operation':'get_href'},
        'selecteurs_article':[
            {'name': 'titre', 'selecteur': 'article h1', 'operation':'text_content'},
            {'name': 'date_pub', 'selecteur': 'span.date_pub', 'operation':'text_content'},
            {'name': 'date_modif', 'selecteur': 'span.date_modif', 'operation':'text_content'}
        ]
 
    }
]

#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()
 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 
br.set_handle_robots(False)
#fin de la configuration de mechanize



#0: pour chaque source dans le tableau sélecteurs
for source in selecteurs:
    #1: récupérer la première page de la source
    premierePage = getSrcFromURL(source['url'])
    #2: appliquer le sélecteur contenu dans 'selecteur_links'
    liensArticles = getResults(premierePage, source['selecteur_links']['selecteur'])
    #3: appliquer l'opération sur chaque élément récupéré -> url articles
    urlsArticles = getData(liensArticles, source['selecteur_links']['operation'])
    #4: pour chaque url article:
        #5: récupérer la source de la page désignée par l'url
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -> dataArticle
        #7: pour chaque sélecteur contenu dans "selecteurs_article":
            #8: appliquer le sélecteur article sur la source de la page
            #9: appliquer l'opération sur l'élément récupéré -> donnée
            #10: ajouter la donnée au tableau dataArticle
        #11: insérer le tableau dans la base de données

    print(urlsArticles)
    time.sleep(2)

18 mars 2021

Exemple de structure de données pour récupérer plusieurs sources

selecteurs = [
    {
        'url':'http://lemonde.fr',
        'selecteur_links':'h1 a',
        'selecteurs_article':{
            'titre':'article h1',
            'date_pub':'span.date_pub',
            'date_modif':'span.date_modif'
        }

    },
    {
        'url':'http://lesoir.be',
        'selecteur_links':'h1 a',
        'selecteurs_article':{
            'titre':'article h1',
            'date_pub':'span.date_pub',
            'date_modif':'span.date_modif'
        }
        
    }
]

print(selecteurs[0]['selecteurs_article']['date_pub'])


4 mars 2021

-- phpMyAdmin SQL Dump
-- version 4.9.7deb1
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Generation Time: Mar 04, 2021 at 10:12 AM
-- Server version: 10.3.24-MariaDB-2
-- PHP Version: 7.4.11

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `news_suisse`
--

-- --------------------------------------------------------

--
-- Table structure for table `article`
--

CREATE TABLE `article` (
  `id` int(10) UNSIGNED NOT NULL,
  `titre` text NOT NULL,
  `header` text NOT NULL,
  `body` text NOT NULL,
  `date_crea` datetime NOT NULL DEFAULT current_timestamp(),
  `date_modif` datetime NOT NULL DEFAULT current_timestamp(),
  `url` text DEFAULT NULL,
  `source_id` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `article_auteur`
--

CREATE TABLE `article_auteur` (
  `id` int(10) UNSIGNED NOT NULL,
  `id_article` int(10) UNSIGNED NOT NULL,
  `id_auteurice` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `article_mots`
--

CREATE TABLE `article_mots` (
  `id` int(10) UNSIGNED NOT NULL,
  `id_article` int(11) NOT NULL,
  `id_mots` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `aut-eur-rice`
--

CREATE TABLE `aut-eur-rice` (
  `id` int(10) UNSIGNED NOT NULL,
  `nom` text NOT NULL,
  `prénom` text NOT NULL,
  `bio` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `mots`
--

CREATE TABLE `mots` (
  `id` int(10) UNSIGNED NOT NULL,
  `mots` text NOT NULL,
  `fréquence` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `source`
--

CREATE TABLE `source` (
  `id` int(10) UNSIGNED NOT NULL,
  `nom` text NOT NULL,
  `url` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `article`
--
ALTER TABLE `article`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `article_auteur`
--
ALTER TABLE `article_auteur`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `article_mots`
--
ALTER TABLE `article_mots`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `aut-eur-rice`
--
ALTER TABLE `aut-eur-rice`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `mots`
--
ALTER TABLE `mots`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `source`
--
ALTER TABLE `source`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `article`
--
ALTER TABLE `article`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT for table `article_auteur`
--
ALTER TABLE `article_auteur`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT for table `article_mots`
--
ALTER TABLE `article_mots`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT for table `aut-eur-rice`
--
ALTER TABLE `aut-eur-rice`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT for table `mots`
--
ALTER TABLE `mots`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT for table `source`
--
ALTER TABLE `source`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
import mechanize
 
import lxml.html as lh
 
import cssselect
 
import ssl
 
import os
 
from urllib.parse import urlparse
 
import mysql.connector as mysql
 
 
 
def getSrcFromURL(url):
    data = br.open(url)
 
    rawdata = data.read()
    unicode = rawdata.decode('utf-8', 'ignore')
    src = lh.fromstring(unicode)
    return src
 
def getResults(src, selecteur):
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
    results = src.xpath(chemin_xpath)
    return results
 
 
#initialisation de l'objet db, interface avec la base de données mysql
db = mysql.connect(
    host = "localhost",
    user = "root",
    passwd = "root",
    database = "news_suisse"
)

#SELECT = sélectionner des données
#INSERT = insérer des données
#UPDATE = mettre à jour des données
#DELETE = supprimer des données


#query = "SELECT * FROM article WHERE titre = '%chat%'"

query = "SELECT * FROM article"


with db.cursor() as cursor:
    cursor.execute(query)
    result = cursor.fetchall()
    for row in result:
        print(row)

25 février 2021

#un programme qui récupère les données contenues dans les sélecteurs css suivants à partir d'une page d'article de 24heures.ch
#article h1, article h2, article h3, article p et article time 
 
import mechanize
 
import lxml.html as lh
 
import cssselect
 
import ssl

import os

from urllib.parse import urlparse

import mysql.connector as mysql



def getSrcFromURL(url):
    data = br.open(url)
    
    rawdata = data.read()
    unicode = rawdata.decode('utf-8', 'ignore')
    src = lh.fromstring(unicode)
    return src

def getResults(src, selecteur):
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
    results = src.xpath(chemin_xpath)
    return results


#initialisation de l'objet db, interface avec la base de données mysql
db = mysql.connect(
    host = "localhost",
    user = "root",
    passwd = "cry373",
    database = "news_suisse"
)

 
#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()
 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 
br.set_handle_robots(False)
#fin de la configuration de mechanize
 
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context
 


#data = br.open('https://lecourrier.ch/2021/02/10/morten-gisselbaek-le-candidat-de-la-decroissance/', timeout=10.0)

src = getSrcFromURL('https://lecourrier.ch/theme/neuchatel/')


selecteurs = cssselect.parse('article h1 a.c-Card-permalink')


for selecteur in selecteurs:
    print(selecteur)
    articleLinks = getResults(src, selecteur)
    
    for articleLink in articleLinks:
        print(articleLink.get('href'))
        src = getSrcFromURL(articleLink.get('href'))
        
        selecteursArticle = cssselect.parse('article h1.c-Article-titre, article .c-Article-chapeau, article .c-Article-texte')
        articleDB = []
        for selecteurArticle in selecteursArticle:
            print(selecteurArticle)
            resultats = getResults(src, selecteurArticle)
            
            for resultat in resultats:
                articleDB.append(resultat.text_content())
                break
            
        print(articleDB)
        #query = "INSERT INTO article (titre, header, body) VALUES ("+articleDB[0]+", "+articleDB[1]+", "+articleDB[2]+")"
        query = "INSERT INTO article (titre, header, body, source_id) VALUES ('%s', '%s', '%s', 1)" % (articleDB[0], articleDB[1], articleDB[2])

        cursor = db.cursor()
        cursor.execute(query)
        db.commit()


import mysql.connector as mysql

db = mysql.connect(
    host = "localhost",
    user = "root",
    passwd = "cry373",
    database = "news_suisse"
)




#SELECT = sélectionner des données
#INSERT = insérer des données
#UPDATE = mettre à jour des données
#DELETE = supprimer des données



#query = "SELECT * FROM article WHERE titre = '%chat%'"

query = "SELECT * FROM article"

with db.cursor() as cursor:
    cursor.execute(query)
    result = cursor.fetchall()
    for row in result:
        print(row)


query = "INSERT INTO article (titre, header, body, date_crea, date_modif, url, source_id) VALUES ('article numéro 2', 'header de l article','le texte', '2021-02-25 11:15:00', '2021-02-25 11:15:00', 'http://fausseurl.com', 1)"

cursor = db.cursor()
cursor.execute(query)
db.commit()


import mysql.connector as mysql

db = mysql.connect(
    host = "localhost",
    user = "root",
    passwd = "",
    database = "news_suisse"
)



query = "SELECT * FROM article"


with db.cursor() as cursor:
    cursor.execute(query)
    result = cursor.fetchall()
    for row in result:
        print(row)

18 février 2021

#un programme qui récupère les données contenues dans les sélecteurs css suivants à partir d'une page d'article de 24heures.ch
#article h1, article h2, article h3, article p et article time 
 
import mechanize
 
import lxml.html as lh
 
import cssselect
 
import ssl

import os

from urllib.parse import urlparse


def getSrcFromURL(url):
    data = br.open(url)
    
    rawdata = data.read()
    unicode = rawdata.decode('utf-8', 'ignore')
    src = lh.fromstring(unicode)
    return src

def getResults(src, selecteur):
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
    results = src.xpath(chemin_xpath)
    return results

 
#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()
 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 
br.set_handle_robots(False)
#fin de la configuration de mechanize
 
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context
 


#data = br.open('https://lecourrier.ch/2021/02/10/morten-gisselbaek-le-candidat-de-la-decroissance/', timeout=10.0)

src = getSrcFromURL('https://lecourrier.ch/theme/neuchatel/')


selecteurs = cssselect.parse('article h1 a.c-Card-permalink')


for selecteur in selecteurs:
    print(selecteur)
    articleLinks = getResults(src, selecteur)
    
    for articleLink in articleLinks:
        print(articleLink.get('href'))
        src = getSrcFromURL(articleLink.get('href'))
        
        selecteursArticle = cssselect.parse('article h1.c-Article-titre, article .c-Article-chapeau, article .c-Article-metaDate, article c-Article-metaJournaliste, article .c-Article-texte')
        for selecteurArticle in selecteursArticle:
            print(selecteurArticle)
            resultats = getResults(src, selecteurArticle)
            
            for resultat in resultats:
                print(resultat.text_content())

11 février 2021

Liste des sources: sites d'actualités, Suisse Romande

  • 24 heures (Canton de Vaud)
  • Tribune de Genève (Canton de Genève)
  • Le Temps (Canton de Genève)
  • La Liberté (Canton de Fribourg)
  • La Gruyère (Canton de Fribourg)
  • Le Nouvelliste (Canton du Valais)
  • Arc Info (Canton de Neuchâtel)
  • Le Journal du Jura (partie francophone du Canton de Berne)
  • Le Quotidien jurassien (Canton du Jura)
  • La Côte (Région lémanique)
  • La Région (Région Nord-vaudoise)
  • Le Courrier (Romandie)
  • Le Matin (Romandie)
  • 20 Minutes (Romandie)

24 heures : https://www.24heures.ch/la-protection-civile-apprehende-une-baisse-drastique-de-ses-effectifs-630970735239 selecteurs = cssselect.parse('article h1, article h2, article h3, article p, article time')

Tribune de Genève : https://www.tdg.ch/astrazeneca-double-ses-benefices-528778374505 selecteurs = cssselect.parse('article h1, article h2, article h3, article p, article time')


La Gruyère : https://www.lagruyere.ch/2021/02/%C2%AB-nous-demand%C3%A9-de-nous-endetter-pour-la-soci%C3%A9t%C3%A9%C2%BB.html

selecteurs = cssselect.parse('article h1, h2, article h3, article p, article time')

Le Nouvelliste : https://www.lenouvelliste.ch/articles/monde/reseaux-sociaux-twitter-ne-laissera-pas-revenir-donald-trump-1043625

selecteurs = cssselect.parse('article h1, h2, article h3, article p, article time')


Le Matin : https://www.lematin.ch/story/il-faut-permettre-davantage-dactivites-pour-les-jeunes-916146511842

Sélecteurs : cssselect.parse('div.Article_elementTitle__3we9B h1, div.Article_elementLead__2nNxU h2, h3, div.Article_elementTextblockarray__WdRYM p, .sc-17d1f6z-1.gBPCId')

20 Minutes : https://www.20min.ch/fr/story/futurs-apprentis-les-profs-genes-par-les-recruteurs-259502039975

Sélecteurs : cssselect.parse('div.Article_elementTitle__3we9B h1, div.Article_elementLead__2nNxU h2, h3, div.Article_elementTextblockarray__WdRYM p, .sc-17d1f6z-1.gBPCId')

La côte.ch : https://www.lacote.ch/articles/sports/tennis/tennis-open-d-australie-belinda-bencic-se-qualifie-pour-le-troisieme-tour-1043578

Sélécteurs : selecteurs = cssselect.parse('h1,.strong.article-header, div.datetime, div.article-main-content')

#un programme qui récupère les données contenues dans les sélecteurs css suivants à partir d'une page d'article de lecourrier.ch
#article h1, article h2, article h3, article p et article time 
 
import mechanize
 
import lxml.html as lh
 
import cssselect
 
import ssl

import os

from urllib.parse import urlparse
 
#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()
 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 
br.set_handle_robots(False)
#fin de la configuration de mechanize
 
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context
 
data = br.open('https://lecourrier.ch/2021/02/10/morten-gisselbaek-le-candidat-de-la-decroissance/', timeout=10.0)
 
 
rawdata = data.read()
unicode = rawdata.decode('utf-8', 'ignore')
src = lh.fromstring(unicode)
 
 
#on convertit un sélecteur css en objets de type "cssselector"
selecteurs = cssselect.parse('article h1.c-Article-titre, article .c-Article-chapeau, article .c-Article-metaDate, article c-Article-metaJournaliste, article .c-Article-texte')

selecteursImages = cssselect.parse('article .c-Article-imageFeatured img')
 
for selecteur in selecteurs:
    print(selecteur)
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
    resultats = src.xpath(chemin_xpath)
    for resultat in resultats:
        print(resultat.text_content())

for selecteur in selecteursImages:
    print(selecteur)
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
    resultats = src.xpath(chemin_xpath)
    for resultat in resultats:
        imageUrl = 'https://lecourrier.ch'+resultat.get('src')
        print('downloading'+imageUrl)
        filename = 'test.jpg'
        data = br.open(imageUrl).read()
        
        save = open(filename, 'wb')
        save.write(data)
        save.close()

17 décembre 2020

import mechanize

import lxml.html as lh

import cssselect

import ssl


def getInfos(src, selecteurcss):
    selecteur = cssselect.parse(selecteurcss)
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur[0], translate_pseudo_elements=True)
    resultats = src.xpath(chemin_xpath)
    return resultats

#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()

br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0')]

br.set_handle_robots(False)
#fin de la configuration de mechanize

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

data = br.open('https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1', timeout=10.0)

#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1

#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1

#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/2

#br.follow_link(text_regex=r"cheese\s*shop", nr=1)
#data = br.follow_link(url=r"/lesgrandsclassiques/Poemes", nr=0)

rawdata = data.read()

unicode = rawdata.decode('utf-8', 'ignore')
src = lh.fromstring(unicode)


thumbnails = getInfos(src, 'span.thumbnail_url')
descriptions = getInfos(src, 'span.asset-descr')

10 décembre 2020

import re

#on part de l'url de la thumbnail: https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw
#et l'url du lien pour le zoom: fr/asset/id/99816/tour-de-la-lanterne-lanterne-vitraux/fromSearch/1/initiatorAction/metadataInternalLink/mosaicCount/2877/thumbIndex/0
#on veut arriver à ça: https://regards.monuments-nationaux.fr/fr/asset/assetFile/id/99816/size/3/type/1/filename/CMN_gmw20_0194

thumbnailURL = input('Entrer l\'url de la thumbnail')
linkURL = input('Entrer l\'url du lien')

#thumbnailURL = 'https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw'
#linkURL = 'fr/asset/id/99816/tour-de-la-lanterne-lanterne-vitraux/fromSearch/1/initiatorAction/metadataInternalLink/mosaicCount/2877/thumbIndex/0'


#de l'url du lien on récupère l'id grâce à une expression régulière
searchObj = re.search( r'id/([0-9]+)/', linkURL )
id = searchObj.group(1)

#https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw
#de l'url de la thumbnail on récupère le nom du fichier sans l'extension
searchObj = re.search( r'/([^/]*)\.thw', thumbnailURL )
fileName = searchObj.group(1)

finalURL = 'https://regards.monuments-nationaux.fr/fr/asset/assetFile/id/'+id+'/size/3/type/1/filename/'+fileName
print('Attention voici l\'URL de l\'image! ' + finalURL)

03 décembre 2020

#un programme qui récupère les données contenues dans les sélecteurs css suivants:
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d'une page d'article de lesoir.be

import mechanize

import lxml.html as lh

import cssselect

import ssl

#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()

br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

br.set_handle_robots(False)
#fin de la configuration de mechanize

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

data = br.open('https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de', timeout=10.0)


#print(data.read())
#br.follow_link(text_regex=r"cheese\s*shop", nr=1)
#data = br.follow_link(url=r"/lesgrandsclassiques/Poemes", nr=0)

rawdata = data.read()
unicode = rawdata.decode('utf-8', 'ignore')
src = lh.fromstring(unicode)


#on convertit un sélecteur css en objets de type "cssselector"
selecteurs = cssselect.parse('article h1, article h2')
#   0
#[selecteur1, selecteur2]

#[selecteur de type cssselect]

for selecteur in selecteurs:
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)
    resultats = src.xpath(chemin_xpath)
    for resultat in resultats:
        print(resultat.text_content())

26 novembre 2020

#un programme qui récupère les données contenues dans les sélecteurs css suivants:
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d'une page d'article de lesoir.be

import mechanize

import lxml.html as lh

import cssselect


#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()

br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

br.set_handle_robots(False)
#fin de la configuration de mechanize

data = br.open('https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de', timeout=10.0)

print(data.read())
#un programme qui récupère les données contenues dans les sélecteurs css suivants:
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d'une page d'article de lesoir.be

import mechanize

import lxml.html as lh

import cssselect

import ssl

#initialisation d'un objet "navigateur" avec la librairie mechanize
br = mechanize.Browser()

br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

br.set_handle_robots(False)
#fin de la configuration de mechanize

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

data = br.open('https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de', timeout=10.0)


#print(data.read())
#br.follow_link(text_regex=r"cheese\s*shop", nr=1)
#data = br.follow_link(url=r"/lesgrandsclassiques/Poemes", nr=0)

rawdata = data.read()
unicode = rawdata.decode('utf-8', 'ignore')
src = lh.fromstring(unicode)

#une liste en python
#           0          1            2
liste = ['coucou', 'pouetpouet', 'byebye']

print(liste[2])

selecteurs = cssselect.parse('article h1')
#[selecteur de type cssselect]
chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteurs[0], translate_pseudo_elements=True)
#selecteur de type xpath

resultats = src.xpath(chemin_xpath)
#    0
#[html element]
print(resultats[0].text_content())

Formation HTML/CSS utile en complément du cours ici :

https://www.youtube.com/watch?v=Y80juYcu3ZI&list=PLwLsbqvBlImHG5yeUCXJ1aqNMgUKi1NK3

19 novembre 2020

html et css

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Sélecteurs css</title>
    <link href="styles.css" rel="stylesheet" type="text/css">
  </head>
  <body>
    <section id="actualite">
      <h1>Ma section actualité</h1>
      <article class="breve">
        <header>Chapeau de l'article</header>
        <div>
          Contenu de l'article <a href="http://www.curlybraces.be">Un lien vers un site</a>
          <h3>Sous-titre de l'article</h3>
          <time>13:00</time>
          <time>13:00</time>
          <time data-type="begin-hour">15:00</time>

        </div>
        <footer>Footer de l'article</footer>
      </article>
      <article class="article-full">
        <header>Chapeau de l'article 2</header>
        <div>
          Contenu de l'article 2 <a href="http://www.curlybraces.be">Un lien vers un site</a>

        </div>
        <footer>Footer de l'article 2</footer>
      </article>
      <article class="article-full">
        <header>Chapeau de l'article 3</header>
        <div>
          Contenu de l'article 3 <a href="http://www.curlybraces.be">Un lien vers un site</a>

        </div>
        <footer>Footer de l'article 3</footer>
      </article>
    </section>

    <section id="archives">
      <h1>Ma section Archives</h1>
      <article class="breve">
        <header>Chapeau de l'article</header>
        <div>
          Contenu de l'article <a href="http://www.curlybraces.be">Un lien vers un site</a>

        </div>
        <footer>Footer de l'article</footer>
      </article>
    </section>
  </body>
</html>
/*pointeur css vers balise html*/
html, body{
  margin:0;
  padding:0;
}
h1{
  font-family:Helvetica, Arial, sans-serif;
  font-weight:normal;
  margin:10px;
  padding:10px;
  border:1px solid black;
}
/*pointeur css vers un ID*/
section#archives{
  background-color:gray;
}

article{
  border-bottom:1px solid black;
}
/*pointeur css vers une classe*/
.breve{
  font-size:48pt;
  border-bottom:2px solid black;
}
.article-full{
  font-size:16pt;
}
/* pointeur css avec chemin */
section#actualite a{
  color:green;
}
section#actualite article.article-full a{
  color:red;
}
/* pointeur css avec chemin vers un enfant précis d'une balise */
section#actualite article.article-full:nth-child(3) a{
  color:pink;
}

/*pointeur css avec un chemin vers un élément qui suit directement un autre élément*/
h3+time{
  background:green;
}

time[data-type='begin-hour']{
  background:blue;
}

Librairies Python

#!/usr/bin/python
# -*- coding: utf-8 -*-

import mechanize
import lxml.html as lh
import cssselect

br = mechanize.Browser()
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.set_handle_robots(False)
data = br.open('https://poesie.webnet.fr/lesgrandsclassiques/Authors/B', timeout=10.0)

#br.follow_link(text_regex=r"cheese\s*shop", nr=1)

#data = br.follow_link(url=r"/lesgrandsclassiques/Poemes", nr=0)

rawdata = data.read()
unicode = rawdata.decode('utf-8', 'ignore')
src = lh.fromstring(unicode)

for selector in cssselect.parse('.author-list__link'):
    expression = cssselect.HTMLTranslator().selector_to_xpath(selector, translate_pseudo_elements=True)
    for result in src.xpath(expression):
        print(result.text_content())
        print(result.get('href'))

Pages des étudiant.e.s

Simon Blondeau

Page de William

Mondher

Lea

MP Antoin

Pierre Ethève

Chloé

Jonquille

margot

Léo

César

Arthur Lafontaine

Etienne Grignon

Déroulement du cours

Le cours ne nécessite aucun prérequis si ce n'est une capacité d'attention pendant les séances. Cette attention implique qu'à certains moments, par exemple lors des moments de discussions ou de présentations, il sera demandé aux étudiant.e.s de fermer leur ordinateur, que l'usage des smartphones est interdit et que les étudiant.e.s doivent arriver à l'heure au cours (9h, le lundi matin).

Comme il s'agit d'un cours technique, les travaux se feront majoritairement en classe et il n'est pas absolument nécessaire de travailler en dehors du cours, à part pour documenter les travaux ou préparer leurs présentations (les cotations).

Le cours fonctionne en évaluation continue, ce qui signifie que chaque exercice réalisé en atelier aura une note attribuée. Pour réussir le cours, il faut essentiellement être présent.e.

À cette évaluation continue s'ajoute deux notes en décembre et en mai qui correspondent aux moments de cotations. Il est demandé pour ces cotations de présenter une sélection des travaux réalisés jusque là.

La difficulté technique, bien que présente, ne doit pas constituer une barrière pour assister au cours. Il ne sera pas demandé aux étudiant.e.s d'être performant.e.s mais plutôt de ne pas se braquer et d'accepter d'être inefficaces durant des périodes qui semblent parfois longues (voire trouver du plaisir dans ces périodes de recherches). L'entraide et le partage sont encouragés. Tout sera fait pour éviter des comportements de mise à distance du savoir entre celles et ceux "qui savent" et les "newbies".

Chaque étudiant.e a accès à ce wiki, qui servira durant toute l'année à documenter les travaux. La création des comptes pour le wiki se fait au début du deuxième cours (au moment de l'inscription au cours).