Auparavant, j'avais publié une question sur la manière d'obtenir les données d'un site Web AJAX à partir de ce lien: Scraping du site de commerce électronique AJAX à l'aide de python
Je comprends un peu comment obtenir la réponse qui utilise le chrome F12 dans l'onglet Réseau et faire du codage avec python pour afficher les données. Mais je ne trouve presque pas l'URL spécifique de l'API. Les données JSON ne proviennent pas d'une URL comme le site Web précédent, mais elles se trouvent dans l'élément Inspect de Chrome F12.
Ma vraie question est en fait de savoir comment obtenir UNIQUEMENT les données JSON en utilisant BeautifulSoup ou tout ce qui y est lié? Une fois que je ne pourrai obtenir que les données JSON de l'application / id + json, je les convertirai en données JSON que python pourra reconnaître afin que je puisse afficher les produits sous forme de tableau.
Un autre problème est qu'après plusieurs fois que j'exécute le code, les données JSON sont manquantes. Je pense que le site Web bloquera mon adresse IP. Comment résoudre ce problème?
Voici le lien du site Web:
Voici mon code
depuis bs4 importer les demandes d'importation BeautifulSoup
page_link = ' https://www.lazada.com. mon / catalogue /? _ keyori = ss & from = input & page = 1 & q = h370m & sort = priceasc '
page_response = requests.get (page_link, timeout = 5)
page_content = BeautifulSoup (page_response.content, "html.parser")
print (page_content)
3 Réponses :
Essayez :
import requests response = requests.get(url) data = response.json()
Je suis désolé mais je comprends à peine votre solution. Pouvez-vous m'aider sur le code?
Vous devrez analyser manuellement les données HTML de votre Soupe
car d'autres sites Web restreindront leur API json
à d'autres parties.
Vous pouvez trouver plus de détails ici dans la documentation: https://www.crummy.com/software/BeautifulSoup/bs4/doc/ < / a>
Vous pouvez simplement utiliser la méthode find
avec le pointeur vers votre balise avec l'attr
type = application / json
Ensuite, vous pouvez utiliser le package json
pour charger la valeur dans un dict
Voici un exemple de code:
from bs4 import BeautifulSoup as soup import requests import json page_link = 'https://www.lazada.com.my/catalog/?_keyori=ss&from=input&page=1&q=h370m&sort=priceasc' page_response = requests.get(page_link, timeout=5) page_content = soup(page_response.text, "html.parser") json_tags = page_content.find_all('script',{'type':'application/ld+json'}) for jtag in json_tags: json_text = jtag.get_text() json_dict = json.loads(json_text) print(json_dict)
EDIT: Mon mauvais, je ne vous ai pas vu rechercher type = application / ld + json
attr
Comme il semble avoir plusieurs avec cet attr, vous pouvez simplement utiliser la méthode
find_all
:
from bs4 import BeautifulSoup as soup import requests import json page_link = 'https://www.lazada.com.my/catalog/?_keyori=ss&from=input&page=1&q=h370m&sort=priceasc' page_response = requests.get(page_link, timeout=5) page_content = soup(page_response.text, "html.parser") json_tag = page_content.find('script',{'type':'application/json'}) json_text = json_tag.get_text() json_dict = json.loads(json_text) print(json_dict)
p >
Merci pour le code. Ça marche. Mais après 3 fois l'exécution du même code, cela ne fonctionnera plus. Cela signifie-t-il que le site Web bloque mon adresse IP?
Comment éviter le blocage IP? Utilisez du sélénium?
Je ne sais pas s'il s'agit d'un blocage IP et je ne sais pas comment l'empêcher
C'est bon monsieur. Merci quand même