Crawler
Installation
Ce projet utilise Python 3.11
pip install -r requirements.txt
Fonctionnement
Une fois le fichier de référentiel généré, une commande permet de moissoner :
- un ensemble de collections / source
- une source directement avec ses collections
- récuperation des données
retourne une liste de collections
- processus de crawl
Exemple
python3 manage.py crawl -pid ALL -source ELIBM -username username
python3 manage.py crawl -pid PID -source ELIBM -username username
Données initiales
Les données de références se trouvent dans /data/all_cols.json le fichier contient l'ensemble des collections, avec leurs sources respectives.
Ce fichier provient initialement d'un fichier excel. Si besoin de mettre à jour le fichier json, la conversion ods -> json s'effectue en deux étapes :
# Transformation d'un fichier ods en csv
libreoffice --convert-to csv --outdir . all_cols.ods
# Transformation du fichier csv en json
python manage.py convert_all_cols -i "all_cols.csv" -o "all_cols.json"
Contribuer
Installation
Les tests de ce repository sont stockés dans de gros fichiers JSON. Afin de les télécharger, veuillez installer l'extension git lfs.
Installer git lfs n'est nécessaire que si vous souhaitez utiliser ou modifier les tests.
# Sous Ubuntu
apt install git-lfs
Cloner le repo avec git
git clone https://gricad-gitlab.univ-grenoble-alpes.fr/mathdoc/ptfs/ptf-app-crawler
cd ptf-app-crawler
git lfs install
git lfs pull
Tests
Les tests se situent dans le dossier src/crawler/tests
.
Pour chaque source, les fonctions testées sont les suivantes :
parse_collection_content
parse_issue_content
crawl_article
Afin de limiter les régressions lors du développement, un jeu de données est généré préalablement. Celui ci contient les entrées et sorties de ces fonctions au moment de sa génération.
Attention: introduire un bug durant la génération de ces fichiers signifie que les tests valideront le bug. Il est nécessaire de ne pas considérer les tests comme une source de vérité.
Lancement des tests
Installer les paquets
pip install -r requirements-test.txt
Lancer les tests
pytest -v src/crawler
Génerer les données
Un script python permet de générer les données de tests pour des collections, issues et articles, à la fois prédéfinis et pris au hasard.
Voir le fichier src/crawler/tests/data_generation/generate_test_data.py
pour plus de détails.
Générer toutes les données de test
python src/crawler/tests/data_generation/generate_test_data.py
Génerer les données de test pour une ou plusieurse sources uniquement
python src/crawler/tests/data_generation/generate_test_data.py LOFPL EUDML
Regénérer les données de test pour une ou plusieurse sources
Cette commande est très utile dans les cas où un fix est rajouté à une source : elle permet de voir le diff.
python src/crawler/tests/data_generation/generate_test_data.py --keep LOFPL EUDML
Si nécessaire, il est possible de marquer une fonction comme "non testable" et faire ignorer la génération de données pour celle ci.
Le décorateur from crawler.tests.data_generation.decorators import skip_generation
peut être utilisé dans ces cas là
from crawler.tests.data_generation.decorators import skip_generation
class AmsCrawler(BaseCollectionCrawler):
# [...]
@skip_generation
def parse_collection_content(self, content):
xissues = []
# [...]
return xissues
Guideslines
Lors qu'un article ne possède pas de PDF, nous ne voulons pas afficher l'article sur Geodesic.
Les fichiers .ps ne sont pas des pdf. Les articles ne fournissant que un fichier .ps doivent être ignorés.
Deployment
Environment variables
Environment variable | Default |
---|---|
REQUESTS_CACHE_LOCATION | "/requests_cache" |
REQUESTS_USER_AGENT | "Geodesic/1.0.0-beta" |
REQUESTS_EMAIL | "accueil@listes.mathdoc.fr" |
REQUESTS_INTERVAL | 90 |
REQUESTS_CACHE_LOCATION
Only used in celery workers or during development.
Path where the crawler will store HTTP cache.
REQUESTS_USER_AGENT
Only used in celery workers or during development.
Value of the User-Agent
header sent in HTTP requests.
REQUESTS_EMAIL
Only used in celery workers or during development.
Value of the From
header sent in HTTP requests.
REQUESTS_INTERVAL
Seconds to wait between two HTTP requests