diff --git a/rapport/.vscode/spellright.dict b/rapport/.vscode/spellright.dict
new file mode 100644
index 0000000000000000000000000000000000000000..2069a6786f580890c3e8a9105b2d0ba041d21fcc
--- /dev/null
+++ b/rapport/.vscode/spellright.dict
@@ -0,0 +1,11 @@
+scraping
+catastrophiquement
+n'impacteront
+scrapées
+NScrap
+implémentées
+répartisseurs
+Schnell
+prérequis
+captcha
+threads
diff --git a/rapport/figs/client-infra.png b/rapport/figs/client-infra.png
new file mode 100644
index 0000000000000000000000000000000000000000..d780896914aeb0fecab5c10beb5e0ca545e81b5d
Binary files /dev/null and b/rapport/figs/client-infra.png differ
diff --git a/rapport/figs/infra.png b/rapport/figs/infra.png
new file mode 100644
index 0000000000000000000000000000000000000000..35bd710ebb7b345eb26fde7299f23b811095d259
Binary files /dev/null and b/rapport/figs/infra.png differ
diff --git a/rapport/text/1-references.md b/rapport/text/1-references.md
index f281c0042b211380620362e3debca0d05cc92fda..391b84d2d4969592e12c53eaeb80ad70f6f7fb62 100644
--- a/rapport/text/1-references.md
+++ b/rapport/text/1-references.md
@@ -9,6 +9,8 @@
     \multicolumn{1}{l}{URL03} & \multicolumn{1}{l}{\url{https://redmonk.com/sogrady/2020/02/28/language-rankings-1-20/}} \\
 \end{tabular}
 
+La figure 2.1 a été créée par mes soins et ne comporte donc pas de référence.
+
 \listoftables
 
 #### Référence des URL {-}
diff --git a/rapport/text/3-etude.md b/rapport/text/3-etude.md
index 673e216212a585e08a15582e9b2c819a47b95787..41a5be7fb0f48c2f4285c70f075e3750bea81009 100644
--- a/rapport/text/3-etude.md
+++ b/rapport/text/3-etude.md
@@ -23,7 +23,7 @@ application installée sur un poste.
 
 ## Etude et analyse
 
-Certains fournisseurs de données (entreprises, entités étatiques, etc.) facilitient l'obtention des documents, par exemple à l'aide d'une (+API_a)[^2], d'une publication régulière sur des flux lisibles directement par un ordinateur[^3]; certains mêmes proposent encore l'envoi de CDs par la poste pour
+Certains fournisseurs de données (entreprises, entités étatiques, etc.) facilitent l'obtention des documents, par exemple à l'aide d'une (+API_a)[^2], d'une publication régulière sur des flux lisibles directement par un ordinateur[^3]; certains mêmes proposent encore l'envoi de CDs par la poste pour
 récupérer leurs données.
 Les (+API_a)s restent de nos jours la meilleure méthode de récupération de données possible; elles donnent en effet la liberté à l'utilisateur de
 faire exactement ce qu'il souhaite. Ainsi, il est possible de récupérer des documents correspondant à certains critères sans
@@ -57,8 +57,8 @@ versions). Toutefois, une fois un (+framework_g) apprivoisé, il est possible, d
 quoi. Les prérequis pour l'utilisation d'un (+framework_g) sont donc la possession d'un ordinateur connecté à Internet et des connaissances en
 programmation.
 
-Les plateformes (+SAAS_a) possèdent les charactéristiques inverses; elles sont payantes, possèdent un support et demandent moins de connaissances
-en informatique. Certains services proposent un système "intelligent" capable de détecter précisemment ce que souhaite obtenir un utilisateur sur
+Les plateformes (+SAAS_a) possèdent les caractéristiques inverses; elles sont payantes, possèdent un support et demandent moins de connaissances
+en informatique. Certains services proposent un système "intelligent" capable de détecter précisément ce que souhaite obtenir un utilisateur sur
 un site juste en surveillant ses clics. Contrairement aux frameworks, la prise en main d'un service en ligne est généralement plus rapide.
 Toutefois, les (+SAAS_a) supportent un set de fonctionnalités bien défini; il est donc difficile d'obtenir
 des fonctionnalités supplémentaires. Les (+SAAS_a) étant pour la plupart situés sur un ordinateur externe, il est encore nécessaire d'importer les
@@ -89,7 +89,7 @@ de quitter leur précarité, et elles éprouvent donc une grande difficulté de
 
 Soutenir de telles plateformes est bien évidemment amoral; un tel salaire représente environ 50% du plus bas salaire minimum en Europe. [@noauthor_monthly_nodate]. Et la plateforme d'Amazon n'est qu'un exemple parmis d'autres : de tels _sweatshops_ similaires à _Mechanical Turk_
 existent par dizaines, simplement sous d'autres noms. D'autres services, utiles au scraping, proposent la résolution de (+captcha_g) par des humains
-(0.001$ par captcha) dans des pays pour la plupart pauvres.
+(0.001$ par (+captcha_g)) dans des pays pour la plupart pauvres.
 
 \cimg{figs/anticaptcha-stats.png}{scale=1.2}{Les statistiques des travailleurs d'un service similaire à Mechanical Turk}
 
@@ -108,14 +108,14 @@ ressorties de la recherche, en particulier du côté des fournisseurs de service
 Par exemple, certains services proposent la possibilité de récupérer des masses de données importantes en changeant régulièrement d'adresse IP.
 Cette technique permet d'éviter d'être bloqué du service; de cette façon il n'est plus possible pour l'hébergeur de bloquer un client accaparant la
 bande passante de son service. Il y a un problème de _fair play_ en utilisant ce genre de logiciel.
-On peut aussi noter l'utilisation de service de résolution de captcha, dont nous parlions plus haut; outre l'aspect amoral de sous-payer des travailleurs
+On peut aussi noter l'utilisation de service de résolution de (+captcha_g), dont nous parlions plus haut; outre l'aspect amoral de sous-payer des travailleurs
 dans des pays dont la plupart sont en difficulté, l'aspect légal de contourner une protection est tout à fait douteux. C'est toutefois un sujet à
-controverse; l'avocate Jennifer Granick dit, en parlant des captchas : _"Technologically and legally CAPTCHAs can be thought of as
-nothing more than a speed bump as opposed to a barrier"_ ("Techniquement et légalement, les captchas peuvent être concus comme qu'un dos d'âne et non
+controverse; l'avocate Jennifer Granick dit, en parlant des (+captcha_g)s : _"Technologically and legally (+captcha_g)s can be thought of as
+nothing more than a speed bump as opposed to a barrier"_ ("Techniquement et légalement, les (+captcha_g)s peuvent être conçus comme qu'un dos d'âne et non
 comme une barrière") [@zetter_is_2010].
 Certains systèmes particulièrement perfectionnés sont mêmes capables de simuler un comportement humain [@zetter_is_2010].
 
-Employer des techniques douteuses n'est pas puni par la loi, mais est socialement inacceptable; si une entreprise dépendant de sa renomée utilisait de
+Employer des techniques douteuses n'est pas puni par la loi, mais est socialement inacceptable; si une entreprise dépendant de sa renommée utilisait de
 telles techniques et que cela se savait, cela pourrait nuire gravement à leur image de marque.
 
 La question légale du scraping est complexe. C'est un sujet décrié par les grandes entreprises ne souhaitant pas voir "leurs" données s'échapper [@bode_court_2019], mais qui commence à être légalisé [@igor_us_2018]. La règle d'or semble être de faire preuve de bon sens en ne causant aucun tord
@@ -129,7 +129,7 @@ Le choix d'un logiciel de scraping n'est pas évident; il demande une réflexion
 Peu importe la solution choisie, une vigilance accrue doit être prise; respecter les règles, quelles qu'elles soient, est indispensable. Les services de
 scraping étant de façon générale mal vus par les entreprises, elles n'ont pas hésité (et n'hésiteront pas) à saisir la justice pour faire arrêter le scraping [@rummler_facebook_nodate] [@schaal_ryanair_2018] de leur site.
 
-Les frameworks ne sont pas parfaits : leur principal désavantage est leur compléxité variable, les rendant impraticables pour les usagers n'étant pas familiers avec la programmation ou l'informatique en général. Toutefois, ils permettent un contrôle accru de la récupération des données, ce qui permet
+Les frameworks ne sont pas parfaits : leur principal désavantage est leur complexité variable, les rendant impraticables pour les usagers n'étant pas familiers avec la programmation ou l'informatique en général. Toutefois, ils permettent un contrôle accru de la récupération des données, ce qui permet
 d'éviter les problèmes cités plus haut.
 
 Une solution, qui en l'occurence est la solution que nous allons adopter ici, est la création d'un framework permettant de simplifier l'utilisation d'un
diff --git a/rapport/text/4-conception.md b/rapport/text/4-conception.md
index 7e7e73a39bfec2d9e75a3a92c02726ab47fc3554..8b2ba0b792a1ae562a16ce688edfe878fa028b74 100644
--- a/rapport/text/4-conception.md
+++ b/rapport/text/4-conception.md
@@ -1,6 +1,6 @@
 # Méthodologie
 
-Ce chapitre parle en détail de la conception du (+framework_g) NScrap. Nous commencerons par parler en détail de l'architecture, en commencant par le langage de programmation choisi, des structures observables dans ce projet; nous continuerons en parlant des structures de données implémentées, pour enfin parler de la communication du projet.
+Ce chapitre parle en détail de la conception du (+framework_g) NScrap. Nous commencerons par parler en détail de l'architecture, en commençant par l'infrastructure du projet, son langage de programmation, des structures observables; nous continuerons en parlant des structures de données implémentées, pour enfin parler de la communication du projet.
 Une fois la partie architecture réalisée, nous décrirons la réalisation de ce projet, en donnant deux exemples de systèmes de scraping implémentés dans ce projet.
 
 ## Architecture du projet
@@ -14,6 +14,26 @@ Les modules ne sont, du point de vue de l'utilisateur, que des boîtes noires [^
 
 [^7]: En vérité, il ne s'agit pas véritablement de boîtes noires comme l'entendrait par exemple Stallman [@williams_hackers_2002]. L'utilisateur serait tout à fait en mesure d'aller voir comment fonctionne le module et le modifier s'il le souhaitait.
 
+### Infrastructure
+
+Scraper un site est une action qui peut être longue. Sur des sites simples, c'est une action qui est relativement rapide, mais sur des sites complexes embarquant du JavaScript pour naviguer sur le site, cela prend beaucoup plus de temps. De plus, tout processus long a un risque plus élevé de planter
+qu'un processus plus court.
+Il est intéressant pour d'énormes masses de données de départager la charge de travail. Ce travail propose deux répartisseurs; le premier, nommé _Schnell_[^8], permet de créer plusieurs processus sur un même hôte. Le second, quant à lui, permet de répartir la quantité de travail sur plusieurs machines. Ces deux répartitions permettent d'effectuer un grand nombre de tâches en même temps.
+Les machines travaillant sur une ou plusieurs tâches sont considérées comme les machines _clientes_ : elles n'ont aucun contrôle sur le flux d'exécution et ne connaissent jamais les autres machines.
+Une machine, quant à elle, est considérée comme le _serveur_ : c'est elle qui va envoyer les tâches aux clients, qui va décider si un client doit s'arrêter et qui peut récupérer les documents téléchargés de chaque client. Le serveur respecte la tolérance aux pannes de l'infrastructure; en cas de plantage, seul le serveur cessera de fonctionner car une fois les tâches envoyées, les clients ne dépendent plus du serveur.
+Enfin, un second serveur est nécessaire au fonctionnement optimal du service : une base de données permettant de stocker les tâches. Même si la base de données plante, les tâches, effectuées ou non, seront conservées.
+
+\cimg{figs/infra.png}{scale=0.5}{Infrastructure du projet}
+
+Le serveur est assez simpliste. Une fois démarré, il va lire un fichier qui permettra de créer les tâches à envoyer aux clients. Une fois ces dernières distribuées, il reste allumé dans le seul but de laisser un accès au panneau de contrôle. Il permet de récupérer les fichiers téléchargés par les clients.
+
+Les clients, en revanche, sont plus complexes. Ils sont à l'écoute en permanence de nouvelles commandes de la part du serveur, mais doivent en plus supporter toute l'infrastructure pour les différents processus (en l'occurence, ceux téléchargeant les documents).
+Chaque client possède _N_ processus, où _N_ est fixé à l'avance et un processus "principal", contenant deux threads : un en charge de la communication vers l'extérieur et un autre en charge de gérer les communications entre les processus travaillant sur une tâche. Cette configuration, bien que compliquée, permet de gérer n'importe quelle tâche de façon aisée.
+
+\cimg{figs/client-infra.png}{scale=.30}{Infrastructure interne du client}
+
+[^8]: _Schnell_ signifie _vite_ ou _rapidement_ en allemand.
+
 ### Langage de programmation
 
 Le langage choisi pour ce projet a été Python. Python est un langage particulièrement populaire, et ce pour deux raisons : sa facilité de lecture et sa capacité à effectuer des tâches complexes (ce malgré sa simplicité).
@@ -29,11 +49,20 @@ Bli
 
 ### Modèles de données
 
-Les différents modèles de données dans l'application (BDD, queues, piles, etc)
+Différents modèles sont implémentés dans ce projet. Les deux principaux sont certainement les tâches et les modules : un module est en charge d'une action spécifique (les boîtes noires dont nous parlions plus haut). Une tâche, quant à elle, est une instance d'un module. Un module est défini par un numéro d'identification unique, un nom, un fanion déterminant si le module doit effectuer une tâche complexe ou non, et un tableau contenant les arguments attendus pour lancer le module en question.
+
+Les tâches sont définies elles aussi par un numéro d'identification unique, par le numéro unique du module que représente la tâche, les arguments à fournir au module pour fonctionner et le nombre de fois que cette tâche a été effectuée. Chaque tâche est effectuée au moins une fois. Si la tâche est accomplie avec succès à la première exécution, alors la tâche est supprimée, sinon elle est relancée. Elle sera relancée au maximum trois fois, puis mise dans la table des tâches en échec. De cette façon il est possible de déterminer quelle tâche a échoué systématiquement et pourquoi (le dernier message d'erreur est inclus avec la tâche).
+
+Enfin, NScrap effectue des mesures de performance pour chaque tâche, ce afin de déterminer l'efficacité du système dans son ensemble. Les mesures observées seront affichées dans la section résultats de ce rapport.
 
 ### Communication
 
-Bla
+La communication est faite de deux façons : dans la très grande majorité des cas, on utilise (+ZeroMQ_g) (ou ZMQ), qui permet une communication inter-hôte
+et inter-processus. ZeroMQ est particulièrement populaire, propose une implémentation en Python et est extrêmement bien documenté. Il possède différents modèles de communication dans lesquels nous ne rentrerons pas en détail; ces derniers permettent en somme d'émettre un message à un ou plusieurs destinataires.
+
+Quand la communication avec ZMQ n'est pas souhaitable ou possible, le protocole (+HTTP_a) est utilisé : le panneau de contrôle utilise par exemple exclusivement HTTP.
+Les scrapers utilisent aussi (+HTTP_a)car il ne leur est pas possible d'utiliser ZMQ. Pour gérer certains évènements générés par les pages web qu'ils visitent,
+il est nécessaire d'injecter du javascript dans la page web en question. Utiliser ZMQ dans cette situation aurait été bien plus compliqué qu'utiliser (+HTTP_a) (javascript permettant de faire des appels (+HTTP_a) très simplement), raison pour laquelle (+HTTP_a) a été utilisé à la place de ZMQ.  
 
 ## Réalisation
 
@@ -41,7 +70,7 @@ Blou
 
 ### Catégorie un : Scrapers simples
 
-Blu
+LEs sc
 
 ### Catégorie deux : Scrapers complexes
 
diff --git a/rapport/text/ZZ-glossaire.tex b/rapport/text/ZZ-glossaire.tex
index 7a6c696f89010f7e45a76d526027d9299030b2b4..02ab44a7a0fc600e14f7053185eb23f893f19299 100644
--- a/rapport/text/ZZ-glossaire.tex
+++ b/rapport/text/ZZ-glossaire.tex
@@ -6,6 +6,7 @@
 \newglossaryentry{scraping_g}{name=scraping,description=Utilisation d'un \gls{scraper_g}}
 \newglossaryentry{framework_g}{name=framework,description=Un framework est un ensemble de composants permettant de poser les fondations d'un logiciel de façon à ne pas tout programmer de zéro}
 \newglossaryentry{captcha_g}{name=captcha,description=Un système permettant de différencier une machine d'un humain en demandant par exemple de faire une addition ou lire du texte}
+\newglossaryentry{ZeroMQ_g}{name=ZeroMQ,description=Un librairie d'envoi et de réception de messages open-source.}
 
 % Insérez les termes pour la table des acronymes ici.
 % Ne mettez pas de points à la fin d'une entrée, ils sont mis pour vous !
@@ -13,4 +14,5 @@
 \newacronym{SAAS_a}{SaaS}{Software As A Service}
 \newacronym{RSS_a}{RSS}{Really Simple Syndication}
 \newacronym{IA_a}{IA}{Intelligence Artificielle}
-\newacronym{CSV_a}{CSV}{Comma Separated Value}
\ No newline at end of file
+\newacronym{CSV_a}{CSV}{Comma Separated Value}
+\newacronym{HTTP_a}{HTTP}{HyperText Transfer Protocol}
\ No newline at end of file