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 :
- 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.
- 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"])
- Observation clé : chaque entreprise a un identifiant unique (
ID) qui varie entre les requêtes, mais l’URL et la méthode restent constantes. - 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"]]
- Automatisation pour les 5 premières pages :
- Modifier uniquement le paramètre
pagede 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.