%matplotlib inline

import urllib.request as ulib

def get_html(source):
    with ulib.urlopen(source) as u:
        return u.read()

page = get_html("https://www.lemonde.fr")
page[:500]

"""
Explanation: 2018-10-02 - Scraping, récupérer une image depuis LeMonde
Le notebook suivant récupère le contenu d'une page du journal Le Monde, extrait les urls d'images à l'aide d'une expression régulière puis télécharge les images pour les stocker dans un répertoire. Le notebook extrait les images d'une personnalité.
Première étape, on récupère automatiquement le contenu d'une page.
End of explanation
"""


ch = "é"
ch

ch.encode("utf-8")

"""
Explanation: Quelques expériences avec les encoding. La norme sur internet est l'encoding utf-8. Un caractère ne peut représenter que 255 caractères distincts ce qui est insuffisant pour certaines langues. L'encoding est un ensemble de codes qui permettent de représenter des caractères complexes avec une séquence d'octets.
End of explanation
"""


try:
    ch.encode("utf-8").decode("ascii")
except UnicodeDecodeError as e:
    print(e)

"""
Explanation: Quand on essaye d'encoder et décoder avec des encodings différents, cela a peu de chance de fonctionner.
End of explanation
"""


page2 = page.decode("utf-8")

page2[:500]

len(page)

"""
Explanation: On revient sur la page du monde.
End of explanation
"""


import re
reg = re.compile('src="(.*?[.]jpg)"')

images = reg.findall(page2)
images[:5]

import os
if not os.path.exists("images/lemonde2"):
    os.makedirs("images/lemonde2")

"""
Explanation: On cherche les urls d'images JPEG, quelque chose comme &lt;img ... src="...jpg" ... /&gt;.
End of explanation
"""


for i, img in enumerate(images):
    nom = img.split("/")[-1]
    dest = os.path.join("images/lemonde2", nom)
    if os.path.exists(dest):
        continue
    
    try:
        contenu = get_html(img)
    except Exception as e:
        print(e)
        continue
    print(f"{i+1}/{len(images)}: {nom}")
    with open(dest, "wb") as f:
        f.write(contenu)

"""
Explanation: Et on enregistre les images.
End of explanation
"""


from mlinsights.plotting import plot_gallery_images
import numpy
from datetime import datetime
now = datetime.now().strftime("%d/%m/%Y")
fold = "images/lemonde2"
imgs = [os.path.join(fold, img) for img in os.listdir(fold)]
choices = numpy.random.choice(len(imgs), 12)
random_set = [imgs[i] for i in choices]
ax = plot_gallery_images(random_set)
ax[0, 1].set_title("12 images aléatoires du Monde du %s" % now);

"""
Explanation: Affichons quelques images.
End of explanation
"""


import re
reg = re.compile('<img src=\\"([^>]+?[.]jpg)\\" alt=\\"([^>]*?)\\">', re.IGNORECASE)

len(page2)

imgs = reg.findall(page2)
len(imgs), imgs[:3]

if not os.path.exists("images/personne"):
    os.makedirs("images/personne")

with open(os.path.join("images/personne", "legend.txt"), "w") as fl:

    for img, alt in imgs:
        if alt == "":
            continue
        nom = img.split("/")[-1]
        dest = os.path.join("images/personne", nom)
        if os.path.exists(dest):
            continue

        try:
            contenu = get_html(img)
        except Exception as e:
            print(e)
            continue
        print(nom)
        with open(dest, "wb") as f:
            f.write(contenu)
        fl.write("{0};{1}\n".format(nom, alt))

now = datetime.now().strftime("%d/%m/%Y")
fold = "images/personne"
imgs = [os.path.join(fold, img) for img in os.listdir(fold) if ".jpg" in img]
ax = plot_gallery_images(imgs)
if len(ax) > 0:
    # Si on a trouvé des images.
    if len(ax.shape) == 2:
        ax[0, 0].set_title("Image du Monde %s" % now)        
    else:
        ax[0].set_title("Image du Monde %s" % now)
ax;

"""
Explanation: On se concentre sur d'une personnalité en utilisant la légende de l'image. On utilise une expression régulière pour récupérer toutes les images.
End of explanation
"""


