Webscraping :
enjeux techniques et éthiques
Alexandre Cebeillac (Post-Doc UMR IDEES)
Sébastien Rey-Coyrehourcq (IGR UMR IDEES)
15 nov. 2019 -Paris

CIST - INFTER
@reyman64
Déroulement de la présentation :
Première partie
* Généralités sur Internet
* Principe de collecte des données
Deuxième partie
exemples d'utilisations avec contexte, méthodes, limite et application
Avec API
* Bing
* Flightradar
* Airbnb
Sans API
* Géocache
* MarineTraffic
Conclusion
Difficulté technique
problèméthique
Cycle des données

ou ? comment ?
combien de temps ?
comment ?
combien de temps ?
Src : cat.opidor
The Internet
Src : IT Crowd, S03Ep4

Internet n'est pas le Web
Tim bernard lee (gauche), inventor of the WWW (1989)
Vint Cerf (droite), co-inventeur du protocole Tcp/Ip
Internet : 1969 - 2019 (50 ans en octobre)
World Wide Web : 1989 - 2019 (30 ans en octobre)
The Internet
1ère couche : Infrastructures physiques
The Internet
"LOGIN"
ex: TCP/IP
2 ème couche : Protocoles !
The Internet
Résolution DNS
1.2.2.1
2.4.3.1
5.1.1.2
3.4.2.1
2.4.3.1
5.1.1.2
6.1.4.2
DNS
DNS
DNS
en.wikipedia.org = ?
see 2.4.3.1
DNS .org
see 5.1.1.2
DNS
wikipedia.org
see 6.1.4.2
DNS
xxx.wikipedia.org
en.wikipedia.org = 6.1.4.2
The Internet
6.1.4.2
3.4.2.1
HTTP
Résolution HTTP (en théorie)
GET / /HTTP/1.1
Host: en.wikipedia.orgHTTP/1.1 200 OK
...
<html>
<head>
<title>Wikipedia EN</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>Résolution classique
Synchrone
Page web / scraping
Une page HTML ?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<title>Test</title>
</head>
<body>
<h1> Ma page web </h1>
<p> Hello World </p>
</body>
<script src="js/script.js"></script>
</html>let d = new Date();
document.body.innerHTML = "<h1>Today's date is " + d + "</h1>"body {
background-color: #0080ff;
}
h1 {
color: #fff;
font-family: Arial, Helvetica, sans-serif;
}
html
head
title
body
h1
p
Extraction
(xPath, CSS, Regex, etc.)
Librairies/Frameworks
SGBD
Navigateurs
wrapper
selenium
python
R
Xml
Curl
SSL
choisir la bonne entrée en fonction des usages
Librairies/Frameworks
rtweet
WikipediR
Collect lib.
Extract lib.
lxml
bs4
html5lib
urllib3
requests
selenium
pyCurl
Collect lib.
Extract lib.
xml2
selectr
stringr
httr
selenium
curl
rvest
scrapy
PYTHON
R
choisir la bonne entrée en fonction des usages
Tweepy
Applications
Évacuations massives
ANR Escape (2016 - 2020) / Eric Daudé
"Contribuer à la conception de systèmes d’aide à la décision dans le cas d’évacuations massives"
Un des objectifs :
Simuler les mobilités en cas de catastrophes (industrielles ou naturelles). Multisites
Comment ?
Simulation à base d'agents
Préalable :
Connaître les comportements de mobilités en condition "normale"
==> Intérêt des conditions de trafic
(en plus des EMD)


Condition de circulation
Site web : /www.bing.com/maps
Langage : R
Type de récolte : Campagne
Format : Raster (image)
Avantages & limites :
- Collecter et reprojecter des images
- Extraire les conditions de circulation

Principe :
- Trafic en temps réel
- Disponible dans 55 pays
- Méthodologie de Bing inconnue
Bing Map (Microsoft)
Collecte en temps réel des conditions de circulation

Condition de circulation

Exemple : Bing Map (Microsoft)
Collecte en temps réel des conditions de circulation
"As part of efforts on learning about traffic flows from data, researchers at Microsoft Research explored methods that enhance the safety and privacy of people who wish to help with the “crowdsourcing” of real-time flows of road data from their mobile GPS data. Principles of community sensing have been developed. These principles center on working with people under a “privacy budget” based on the use of the computations of the value of information for understanding flows over time on the road network"
https://www.microsoft.com/en-us/research/project/predictive-analytics-for-traffic/?from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fprojects%2Fclearflow%2F
Condition de trafic

Projeter l'image connaissant :
Centre de l'image :
Longitude =1.083
Latitude = 49.4375
Niveau de zoom : 12
Projection Bing :
ici UTM 31N
Résolution d'un pixel (m) :
156543.04 * cos(lat) / (2 ^ zoom)
Première approche : capture d'écran
Condition de trafic

Prochaine étape : extraire les conditions de trafic
Condition de trafic



image avec trafic
image avec sans trafic
Masque
Condition de trafic



image avec trafic
Masque
(H) API !
Application Programming Interface
[ ...] is a set of features and rules that exist inside a software program (the application) enabling interaction with it through software - as opposed to a human user interface. The API can be seen as a simple contract (the interface) between the application offering it and other items, such as third party software or hardware.
Condition de trafic
2ème approche : Utiliser l'API pour récupérer une carte statique
https://dev.virtualearth.net/REST/V1/Imagery/Mapstyle/ lat,lon/zoom/?mapLayer=TrafficFlow&key=Token&autresparamètres
Adapter les paramètres pour obtenir une carte avec fond noir, sans texte :

Sélection des pixels vert, jaune et rouge

Condition de trafic
+ données comptages & enquêtes EMD
Arctique & système monde
ANR PUR (2016 - 2020) / Yvette Vaguet
Intégration des zones urbaines arctiques dans le système monde
Un des objectifs :
Analyser temporellement les flux affectant les zones arctiques, notamment les flux aériens.
Comment ?
En créant des réseaux à partir des données les plus appropriées et accessibles


FlightRadar

ANR PUR (2015 - 2019) / Yvette Vaguet
Récuperer les départs et arrivées d'avions pour les aéroports mondiaux pendant plus d'un an
Site web : flightradar24.com
Langage : Python
Framework : Scrapy
Type de récolte : Continue (depuis le 2018/06/10)
Format : mongoDB / Json
Difficultés :
- architecture technique pour une récolte continue
- gestion des timezones
- intégration/consolidation des données SGBD (work in progress)
flightradar
24
FlightRadar
API REST via appel XHR
json
limité à 100 départs/arrivées
query = 'https://api.flightradar24.com/common/v1/airport.json?code= &plugin\[\]=&plugin-setting\[schedule\]\[mode\]=&plugin-setting\[schedule\]\[timestamp\]= &page= &limit=100&token='
{code} = code aéroport IATA
{page} = numéro de la page
{code}
{timestamp}
{page}
{timestamp} = date de la requête
h24 & 7j/7
Focus sur les données ...
src : tom gauld

1 req. ~2 secondes
~ 4 heures de collecte
2 jours en échecs
json non structuré
~ 20 Go / an
800Mo / jour
SGBD
Variabilité +/- grande des sources !
intégration : vérification,
consolidation
+ bonus RPGD
impacte
Structuration des données
h24 & 7j/7
Time / TimeZone Nightmare !

Les jours font 24 h
... Heure d'été ....
Un jour fait 86400 secondes
... Secondes intercalaires ....
Les timezones sont stables
... NON ....
TZ Server = UTC
... Par convention oui mais ....
GMT = UTC
Non. UTC n'a pas de DST
zachholman.com
h24 & 7j/7
Quelle(s) infrastructure(s) pour y arriver ?

Docker
Production
Prototypage
python
python
container
container
import/export
h24 & 7j/7
Quelle(s) infrastructure(s) pour y arriver ?

VM vs Docker ?
- micro-services (1 container = 1 application)
- plus simple
- plus flexible
- consome moins de ressources
- facilite la reproductibilité
Dockerfile
docker-compose.yml
Image 1
organisation logique
h24 & 7j/7
Quelle(s) infrastructure(s) pour y arriver ?
FlightRadar


Clustering (louvain)
Vol vers la zone arctique
Arctique & système monde
ANR PUR (2016 - 2020) / Yvette Vaguet
Intégration des zones arctiques dans le système monde

Un des objectifs :
Analyser temporellement les flux affectant les zones arctiques, dont les flux touristiques.
Pourquoi ?
"Tourism is a powerful global force that is turning the north into a Global North—tied into the Global South by facing the same global problem" (Veijola and Strauss-Mazzullo, 2019)
Comment ?
En créant des réseaux à partir des données les plus appropriées et accessibles

https://news.airbnb.com/fast-facts/

Airbnb
Collecter des données permettant de former un réseau de flux touristiques vers l'Arctique
Site web : airbnb.com
Langage : R
Framework : rvest / httr
Type de récolte : Campagne
Format : Json
Caractéristiques :
- Accessible via code source
- (+) Plusieurs API officieuses & pas de token privé
- (-) 80 requêtes / min / IP ==> temps de collecte long
- Des extractions de zones (insideairbnb) mais que dans certaines villes
- Des codes sont disponibles (Tom Slee) python, mais pas sous R

Airbnb
Protocole :
1. Collecter les logements (listing) dans notre zone d'étude (fenêtres mobiles)
==> identifiant du propriétaire et du logement + localisation
2. Liste des personnes ayant visité un de ces logements
==> liste des personnes ayant laissé un commentaire
==> localisation du domicile (déclaré)
3. Collecter tous les commentaires concernant ces personnes.
==> Liste des personnes accueillies ou hébergées (+ localisation)

zone
d'étude

H= Host (hébergeur)
G : Guest (visiteur)
Airbnb : Listing

Liste de logements dans une fenêtre géographique donnée


Via l'API :
=> Collecte des informations
ex : host id, place id, lon/lat, etc.
Airbnb

Première étape :
Collecter les logements (listing) dans notre zone d'étude. (fenêtres mobiles)
- n=24K
- durée ~ 2 jours
Airbnb : commentaires



Page du logement
Commentaires :
Via l'API :
==> Date, identifiant, rôle, lieu déclaré, de toutes les personnes ayant commenté
https://www.airbnb.com/rooms/8513301
Idem pour la page de l'utilisateur : informations sur les visiteurs ou visités
Airbnb
Création de réseau :

- ~24K offres de locations (coordonnées précises)
- visitées par 537057 personnes (domicile déclaratif)
- qui ont laissé 4 millions de commentaires
- chez 634453 personnes (domicile déclaratif)

Durée de la collecte : plusieurs semaines
Airbnb






Airbnb
- Hey Joe!? Where are you going (...) ?
- I'm going downtown (...)
- Uh, hey Joe, I heard you (...)

Mobilités urbaines
FP7 DENFREE & ANR MO3 / Eric Daudé
Modéliser et simuler les épidémies de dengue


Un des objectifs :
Comprendre le rôle des mobilités quotidiennes dans la propagation des épidémies à Bangkok & Delhi
Moyen :
Créer un modèle de mobilité, individu centré, à base d'agents (couplé à d'autres modèles)
Concept d'espace d'activité
Un des enjeux :
Collecte de données de mobilité









stream_tweets("location",token)
~300 millions d'utilisateurs
mensuels
Juin 2014 – Décembre 2015 : Bangkok (~10M Hab.)
Données brutes ~ 30M de tweets / ~300K utilisateurs
Données filtrées ⇒ 17M / ~76K utilisateurs
~1% des tweets
globaux







stream_tweets("location",token)
~300 millions d'utilisateurs
mensuels
~1% des tweets
globaux
Site web : Twitter
Langage : Python ou R
Framework : Scrapy
Type de récolte : Continue
Format : csv
Difficultés :
- Mon premier code sous Python
- Nécessite un jeton (API)
- Accès a un échantillon
- Stockage et traitement des données
Collecter des données de mobilités
Bangkok (06/2014 – 12/2015)
- Données brutes :
~ 30M de tweets
~300K utilisateurs
- Données filtrées :
~ 17M de tweets
~ 76K utilisateurs
Twitter & géolocalisation


Twitter & géolocalisation



Majorité de tweets le soir
==> Domicile
Majorité de tweets en journée
==> Lieux de travail
?
?
Espace d'activité incomplet...

=> Couche d'utilisation du sol ? OSM ?
peu développé à Bangkok ...
Google maps
Site web : google maps
Langage : Python ou R
Framework : Scrapy / httr
Type de récolte : Campagne
Format : json

Collecter des informations sur l'utilisation du sol à Bangkok pour compléter l'espace d'activité Twitter
Google maps
Site web : google maps
Langage : Python ou R
Framework : Scrapy / httr
Type de récolte : Campagne
Format : json
Difficultés :
- Nécessite un jeton (API)
- Requêtes gratuites limitées
- Zone d'étude importante : Bangkok
- hiérarchisation de l'information renvoyées
- Évolution des conditions d'utilisation de l'API

Collecter des informations sur l'utilisation du sol à Bangkok pour compléter l'espace d'activité Twitter
Google maps
- POI : Point of Interest ⇒ Localisation et catégorie des lieux de la base

Google maps
- POI : Point of Interest ⇒ Localisation et catégorie des lieux de la base
- Fonction « nearby search » de l’API Place
https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=LAT,LON&types=*&radius=100&key=TOKEN


+ Fenêtre mobile
Google maps

Bangkok :
~ 100K POI
~100 catégories
Nombre limite de requêtes quotidiennes gratuites :
~2000 jusqu'en juin 2018 ; 5 aujourd'hui
AOI: « Areas of Interest - places where there's a lot of activities and things to do (..) We determine areas of interest with an algorithmic process that allows us to highlight the areas with the highest concentration of restaurants, bars and shops »
API « Static Map »
⇒ Afficher le fond de carte (ggmap, R)
⇒ Enregistrer l’image
⇒ Extraire les pixels selon leur couleur
S’inspirer de la composition des AOI en POI
⇒ Générer de nouveaux AOI
⇒ Typologie


Twitter & Google maps


Twitter & Google



Pour chaque utilisateur de Twitter :
- Reconstruire des espaces d'activités hypothétiques
Coté modélisateur :
- utiliser les statistiques de visites pour générer des agents synthétiques mobiles
(Cebeillac & al, 2017,2018a,b)
Twitter & Google
Quelques précautions pour améliorer le niveau d'anonymat des personnes :
- Changement du nom de l'utilisateur
- Flou temporel :
- Mardi 10 juillet 2015 18h ==> Mardi 18h
- Séquences de visites ==> Fréquences de visites
- Flou spatial :
- Domicile agrégé au sous district (~arrondissement)
- Autre lieux dans des mailles (250m)
- Flou thématique :
- On ne sait pas exactement quelle activité réalisée ("lieu de sortie", "lieu d'éducation" etc.)
Sécurisation des données :
- Fichiers encryptés sur serveur protégé (Huma-num)
Printemps 2015 : Mise à jour de Twitter :
Désactivation automatique de la géolocalisation aprés l'envoi d'un message géolocalisé
Protocole





Zone de ~turbulence~


web asynchrone
protection anti-bot

WEB asynchrone
Javascript / AJAX
WEB asynchrone
Javascript + React
"What you see is not what you get"
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<script src="js/script.js"></script>
<title>Test</title>
</head>
<body>
<h1> Ma page web </h1>
<p> Hello World </p>
</body>
</html>div1
div2
??
??
Protection anti-bot
6.1.4.2
3.4.2.1
HTTP
Content Delivery Network (CDN)
(CloudFlare, Akamai, etc.)
Mise en cache du contenu
Requêtes DNS spatialisées
Protection anti-bot
Content Delivery Network (CDN)
Serveur http
(CloudFlare, Akamai, etc.)
Reverse-Proxy
détection de pattern
capcha
honey pot
filtrage ip
GeoCaching

GRR Trenum (2015 - 2019) / Philippe Vidal
Récupérer toutes les informations sur les ~ 13000 géocaches (1/page) de Normandie à un instant t
Site web : geocaching.com
Langage : Python
Framework : Scrapy
Type de récolte : Campagne
Format : Json
Difficultés :
- Pas d'API & limitation à 1000 résultats par recherche
- Mon premier scraping
- Login/Pwd pour accès à la donnée complète
- ASPX avec gestion des états précédents
GeoCaching
listes des urls
formulaire de selection
scraper 1
json

GeoCaching

navigation dans les pages & remplissage de formulaires

URL des 726 * 20 pages
<form method="post" action="./nearest.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="aspnetForm">
<div class="aspNetHidden">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATEFIELDCOUNT" id="__VIEWSTATEFIELDCOUNT" value="2" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="wNwKV9Z" />
<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="jFMBVQ" />
</div>
circulation token obligatoire
GeoCaching
listes des urls
page par cache
formulaire de selection
scraper 1
scraper 2
json
json
GeoCaching

N commentaires par cache ...
Analyse textuelle (work in progress)
Arctique & système monde
Intégration des zones arctiques dans le système monde
Flux maritime : Marine Traffic


Trafic maritime




Liste des bateaux dans un port (Murmansk) :
Dernières positions d'un bateau (Guldrangur) :
Même approche que pour Flightradar ?
403 Forbidden
Mr Robot
Server
API générique, multi-langage (Java,Python, R, etc.) pour piloter (envoyer des commandes) à un navigateur sans utiliser l'interface graphique.
web-driver
R, Python, C#, etc.
Selenium tools
firefox
chrome
safari
etc.
Marine Traffic


Trajectoire des bateaux sur 2 jours :
Ethique & Technique




pas de risque
complexe
risque elevé
simple
&
api
api
api
api XHR
api XHR




Impact sur la vie privée
VS
complexité de collecte
Un tryptique asymétrique
Propose des services & stock les données
(publicité)
Demande rarement
le consentement éclairé
Accède aux données consultable sur le site (webscrapping)
Vend ou donne des échantillons
contrôle l'utilisation (API)
Site Internet
Tiers
Entreprises privés ; Chercheurs ; (Etats?)
Utilisateur
Utilise ou contribue au service ==> participe à la création de données (+/- consciente)
(Schéma simpliste)
Traite des données
produit du contenu
Traite des données (échantillon)
produit du contenu
produit du contenu
Questions ?

le 13/11/2019

Merci de votre attention !
https://slides.com/sebastienreycoyrehourcq/cistscrapping
CistScrapping
By sebastien rey coyrehourcq
CistScrapping
- 1,166