Extraction de vidéos depuis Pear Video : méthode complète

Approche technique d'extraction des contenus vidéo

Pour récupérer les vidéos du site Pear Video, il est essentiel d'analyser le mécanisme de chargement dynamique des données via l'outil de développement du navigateur.

En accédant à la page principale, on constate que les informations ne sont pas directement intégrées dans le code HTML. Lorsqu'on ouvre l'onglet "Network" (Réseau) après avoir fait défiler ou rafraîchi la page, on observe des requêtes AJAX effectuées via une méthode GET. Les paramètres comme categoryId et start permettent de contrôler la catégorie et le nombre de vidéos par page (multiples de 12).

À l’aide de la bibliothèque requests, on anvoie une requête vers l’API de catégorie :

response = requests.get(
    'https://www.pearvideo.com/category_9',
    params={
        'reqType': 5,
        'categoryId': 9,
        'start': page_index
    }
)

Le contenu retourné est analysé avec BeautifulSoup en utilisant le parser 'lxml' pour extraire les lians vers les pages détaillées :

soup = BeautifulSoup(response.text, 'lxml')
links = soup.select('.categoryem a.vervideo-lilink')

Chaque lien contient un identifiant unique (ID vidéo) extrait par découpage du chemin URL :

video_id = link.get('href').split('_')[-1]

La deuxième étape consitse à interroger l'endpoint videoStatus.jsp pour obtenir les métadonnées du média :

status_response = requests.get(
    'https://www.pearvideo.com/videoStatus.jsp?',
    params={'contId': video_id},
    headers={'Referer': f'https://www.pearvideo.com/video_{video_id}'}
)

Le résultat est au format JSON. Le champ srcUrl renvoie une URL temporaire contenant une valeur systemTime. Cette dernière doit être remplacée par cont-{video_id} pour obtenir l’URL réelle du fichier vidéo.

fake_url = status_response.json()['videoInfo']['videos']['srcUrl']
system_time = status_response.json()['systemTime']
real_url = fake_url.replace(system_time, f'cont-{video_id}')

Une fois la vraie URL obtenue, on peut télécharger le fichier vidéo en envoyant une nouvelle requête, en incluant toujours le header Referer pour contourner les mesures anti-bot :

video_response = requests.get(
    real_url,
    params={'contId': video_id},
    headers={'Referer': f'https://www.pearvideo.com/video_{video_id}'}
)

Le fichier est alors sauvegardé localement en mode binaire :

file_path = os.path.join('vidéos', real_url[-8:])
with open(file_path, 'wb') as file:
    file.write(video_response.content)

Pour éviter toute restriction IP due à une surcharge de requêtes, une pause de 1 seconde entre chaque téléchargement est recommandée :

import time
time.sleep(1)

Cette stratégie garantit un comportement plus discret et réduit le risque de blocage.

Étiquettes: Python requests BeautifulSoup web scraping API

Publié le 28 août à 17h32