# Sommaire
1. [Introduction](#intro)
2. [Installation](#install)
    1. [Linux/Unix/MacOS](#unix)
    2. [Windows](#win)
3. [Usage](#usage)
4. [TODO](#todo)

<div id='intro'/>

# Un webcrawler pour extraire les arrêtés de péril du site de Marseille

Les données sont inscrites manuellement sur le site de la mairie, et présentent de nombreux problèmes de structure et de nomemclature qui empêchent d'extraire proprement chaque arrêté.

On a donc recours à plusieurs regex successifs et un peu de code pour séparer les adresses et obtenir une table structurée. Certaines adresses sont perdues en chemin (environ une cinquantaine) mais l'essentiel est extrait.

Les données sont ensuite classées par type (périls & périls imminents, main-levées, interdictions d'occupation, etc.).

Il est ensuite possible d'en éditer une carte, sur Qgis par exemple, en retrouvant chaque adresse par geocoding.

<a href="https://git.plefebvrebjo.fr/p/marseille-perils-webcrawler/raw/branch/main/doc/img/map1.jpeg" target="blank"><img src="./doc/img/map1.jpeg" width="1024" alt="Carte des périls de Marseille-Centre & caméras"></a><br>
<a href="https://git.plefebvrebjo.fr/p/marseille-perils-webcrawler/raw/branch/main/doc/img/map.jpeg" target="blank"><img src="./doc/img/map.jpeg" width="1024" alt="Carte des périls de Marseille-Centre"></a><br><br>

Le code repose sur le projet libre de webcrawler [Scrapy](https://scrapy.org/) écrit en python.

**Structure :**

- `crawler/perils/spiders/scraperil.py` : Le crawler initial qui récupère toutes les données brutes du site par des requêtes via sélecteurs XPATH (similaires aux selecteurs CSS mais plus polyvalents)

- `crawler/perils/items.py` : Les items dans lesquels sont inscrites les données brutes

- `crawler/perils/splittermidware.py` : La pipeline de tri des données brutes au moyen de regex et d'un peu de python rudimentaire. Le code est commenté pour inspection.


<div id='install'/>

# Installation

<div id='unix'/>

## Linux/Unix/MacOs (Posix compliant)
### Dépendances 

- Python >=3.5

### Environnement virtuel et modules python
#### Environnement virtuel

Mise en place d'un environnement virtuel pour scrapy dans lequel seront installées les dépendances :

        python -m venv scrapy-env
        source scrapy-env/bin/activate


#### Modules
        python -m pip install --upgrade pip
        python -m pip install regex
        python -m pip install scrapy

<div id='win'/>

## Windows

*Aux dernières nouvelles, ça fonctionnait. Je ne maintiendrai __pas__ le code pour le rentre compatible avec Windows si d'aventure il venait à y avoir des incompatibilités*

### Dépendances
- [Python >= 3.5](https://www.python.org/downloads/windows/)
- [Microsoft Visual C++ Build-tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)

    *Ces modules doivent être installés :*

    <img src="./doc/img/micrapsoft-visualstudio.jpg" height="320" alt="Screenshot de l'installation des build-tools pour Windows"><br><br>

- [Librairie libxml2](https://www.lfd.uci.edu/~gohlke/pythonlibs/#libxml-python) (documentation en haut de page, à priori ça s'installe via pip mais j'ai pas eu besoin, faudrait voir sur un windows vierge ce que ça donne)


### Environnement virtuel et modules python
#### Environnement virtuel

Mise en place d'un environnement virtuel pour scrapy dans lequel seront installées les dépendances :

        python -m venv scrapy-env
        scrapy-env\Scripts\activate.bat


#### Modules
        python -m pip install --upgrade pip
        python -m pip install regex
        python -m pip install scrapy

<div id='usage'/>

# Usage 
On exporte l'output du crawler dans un fichier csv. 

D'autres formats sont disponibles (json, xml, etc.) plus d'informations sur la [documentation de scrapy](https://docs.scrapy.org/en/latest/topics/feed-exports.html)

Toujours dans l'environnement virtuel scrapy-env *(pour toute utilisation non consecutive à l'installation, voir la deuxième ligne de la mise en place de l'environnement dans la section Installation pour réactiver l'environnement virtuel)*

        cd crawler
        scrapy crawl perils -O perils.csv

<div id='todo'/>

# TODO

- Permettre la possibilité de deux outputs : un csv pour Qgis et un csv pour consultation et mise en page. Pour le moment les deux sortent sur un même csv parce-que j'ai pas pris le temps de m'en occuper.
- installer ça sur un serveur et faire crawler quotidiennement puis mettre sur une base de données pour pouvoir sourcer les données directement depuis cette base sur Qgis ou autre (et permettre l'utilisation des données à d'autres personnes qui ne souhaitent pas installer ce programme)