web-dev-qa-db-fra.com

Impossible de récupérer tous les liens d'une page Web à l'aide de requêtes

J'essaye d'obtenir tous les liens connectés à chaque image dans ceci page Web .

Je peux obtenir tous les liens si je laisse un script Selenium défiler vers le bas jusqu'à ce qu'il atteigne le bas. Un de ces liens que je souhaite gratter est celui-ci .

Maintenant, mon objectif ici est d'analyser tous ces liens à l'aide de requêtes. Ce que j'ai remarqué que les liens que je souhaite analyser sont créés à l'aide de B-uPwZsJtnB petit code.

Cependant, j'essaie de gratter ces différents shortcode disponibles dans une balise de script trouvée dans la source de la page de cette page Web. Il y a environ 600 shortcodes dans cette page. Le script que j'ai créé ne peut analyser que le premier 70 tel shortcode qui peut finalement créer 70 liens qualifiés.

Comment puis-je récupérer les 600 liens à l'aide de requêtes?

J'ai essayé jusqu'à présent avec:

import re
import json
import requests

base_link = 'https://www.instagram.com/p/{}/'
lead_url = 'https://www.instagram.com/explore/tags/baltimorepizza/'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
    req = s.get(lead_url)
    script_tag = re.findall(r"window\._sharedData[^{]+(.*?);",req.text)[0]
    for item in json.loads(script_tag)['entry_data']['TagPage']:
        tag_items = item['graphql']['hashtag']['Edge_hashtag_to_media']['edges']
        for elem in tag_items:
            profile_link = base_link.format(elem['node']['shortcode'])
            print(profile_link)
7
robots.txt

Si vous voulez le faire avec requests alors veuillez considérer d'interroger les requêtes XHR/Ajax Http pour imiter Lazy load . Voir l'image suivante:

enter image description here

Vous effectuez des requêtes sur le serveur instagram.com similaires à Grattez une page de chargement JS Lazy par Python requests post.

Avertissement

Vous risquez de ne pas réussir à terminer cette tâche en raison de certaines valeurs de cookies dynamiques ou d'une autre prévention de grattage imposée par Instagram.

2
Igor Savinkin

Je vous suggère d'utiliser API Instagram Graph , si vous créez un produit commercial, car l'utilisation des données publiques d'Instagram est requise en raison du RGPD. Cette API facilitera votre travail, mais sous des limitations d'API telles que vous pouvez interroger 30 recherches pendant 7 jours par jeton d'utilisateur.

Si vous créez un outil non commercial, vous avez deux approches.

  1. Grattez directement la page web instagram. Comme mentionné dans les réponses ci-dessus, vous pouvez utiliser Selenium et automatiser les interactions de page car la page Web utilise javascript pour générer des URL d'image. L'inconvénient de cette méthode est qu'instagram et facebook utilisent des méthodes anti-grattage pour éviter de gratter leurs données, telles que l'emballage d'éléments html avec des classes générées dynamiques, modifient fréquemment xpaths. Vous devrez peut-être passer beaucoup de temps à coder et à résoudre ces problèmes plus tard.

  2. Utilisation de bibliothèques tierces conçues pour récupérer les données Instagram. Il existe de nombreuses bibliothèques tierces open source dans github et instaloader est mon préféré. vous pouvez télécharger tous les résultats de recherche de hashtag en utilisant commande unique . Cette bibliothèque ne télécharge pas seulement des images mais aussi data json du post lié à l'image. Comme il y a des responsables de la bibliothèque, vous n'avez pas à vous soucier des modifications ultérieures de la page Web Instagram. Je recommande cette méthode dans votre cas.

0
Sajith Herath

La page Web Instagram utilise le chargement paresseux pour charger les images. Vous pouvez surmonter cela de 2 manières:

  1. Utilisez API Instagram comme mentionné dans les commentaires
  2. Utilisez un outil comme Selenium pour charger toutes les images de la page en défilement vers le bas, puis récupérez les liens

La première méthode est la meilleure façon de le faire.

0
BBloggsbott