Automatisation de la récupération de données d'entreprises via requests

Le but est d’extraire les informations suivantes pour les 5 premières pages du site de la direction nationale des produits pharmaceutiques : nom de l’entreprise, numéro de licence et représentant légal.

Analyse technique :

  1. Les données cibles sont disponibles dans les pages détaillées des etnreprises. Pour vérifier si elles sont chargées dynamiquement :
  • Utiliser un outil de capture réseau (comme Browser DevTools) pour inspecter les requêtes.
  • Rechercher dans le réseau une requête correspondant à une page entreprise.
  • Si aucune réponse directe n’est trouvée dans les requêtes statiques, cela indique un chargement dynamique.
  1. Identification de l’endpoint dynamique :
  • URL : http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
  • Méthode : POST
  • Paramètre requis : id (ex : d601af664b5940029601d6d0a05be321)
  • Réponse : données JSON contenant les informations de l’entreprise.

Exemple de requête pour une entreprise unique :

import requests

url_detail = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}
payload = {"id": "d601af664b5940029601d6d0a05be321"}

response = requests.post(url=url_detail, headers=headers, data=payload)
data = response.json()

print(data["epsName"], data["legalPerson"], data["productSn"])

  1. Observation clé : chaque entreprise a un identifiant unique (ID) qui varie entre les requêtes, mais l’URL et la méthode restent constantes.
  2. Récupération des idantifiants depuis la page principale :
  • Ednpoint : http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
  • Méthode : POST
  • Paramètres dynamiques : page, pageSize, conditionType, etc.

Récupération des ID de la première page :

main_url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
params_page = {
    "on": "true",
    "page": "1",
    "pageSize": "15",
    "productName": "",
    "conditionType": "1",
    "applyname": "",
    "applysn": ""
}

response = requests.post(main_url, headers=headers, data=params_page)
result = response.json()

ids_list = [item["ID"] for item in result["list"]]

  1. Automatisation pour les 5 premières pages :
  • Modifier uniquement le paramètre page de 1 à 5.
  • Collecter tous les ID obtenus.

Code complet intégré :

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}

base_url_list = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
base_url_detail = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"

all_ids = []

# Récupérer les ID des 5 premières pages
for page_num in range(1, 6):
    payload = {
        "on": "true",
        "page": str(page_num),
        "pageSize": "15",
        "productName": "",
        "conditionType": "1",
        "applyname": "",
        "applysn": ""
    }
    response = requests.post(base_url_list, headers=headers, data=payload)
    data = response.json()
    all_ids.extend([item["ID"] for item in data["list"]])

# Récupérer les détails pour chaque entreprise
for enterprise_id in all_ids:
    detail_payload = {"id": enterprise_id}
    detail_response = requests.post(base_url_detail, headers=headers, data=detail_payload)
    detail_data = detail_response.json()

    name = detail_data["epsName"]
    license_num = detail_data["productSn"]
    legal_rep = detail_data["legalPerson"]
    address = detail_data["epsAddress"]

    print(f"{name} | {license_num} | {legal_rep} | {address}")

Ce script permet de collecter systématiquement les données de toutes les entreprises affichées sur les cinq premières pages du site, en exploitant des requêtes POST structurées avec des paramètres dynamiques.

Étiquettes: requests HTTP POST JSON parsing web scraping API automation

Publié le 15 octobre à 14h02