-1
votes

Grattez la page de chargement dynamique à l'aide de magnifiques

Je suis nouveau dans le paquet magnifique. J'essaie de gratter toutes les recettes et des liens de nourriture, ainsi que des ingrédients de https://indiandecipes.com/new_and_populaire Le problème est que ce site Web ne charge que plus de nourriture lorsqu'il est défilé. J'ai référé cette question Beautiful - Scrape Webpage - Page de chargement dynamique , mais COUDN ' t faire beaucoup de choses. J'ai vérifié l'onglet Réseau dans l'élément d'inspection et j'ai constaté que chaque fois que je fais défiler vers le bas, une demande XHR est envoyée xxx

est-il possible de simuler une telle demande dans Python d'extraire toutes les recettes alimentaires de celle-ci page?


1 commentaires

S'il vous plaît essayez de tenter de coder cela et de partager où vous êtes coincé.


3 Réponses :


2
votes

Vous devez utiliser sélénium pour charger JavaScript à partir de la page Web à HTML Ensuite, utilisez le code de défilement de SELENIUM

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd
import time
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('/home/sush/Downloads/Compressed/chromedriver_linux64/chromedriver')

driver.get('https://indianrecipes.com/new_and_popular')


heights = []
counter = 0
for i in range(1,300):
    bg = driver.find_element_by_css_selector('body')
    time.sleep(0.1)
    bg.send_keys(Keys.END)
    heights.append(driver.execute_script("return document.body.scrollHeight"))
    try :
        bottom = heights[i-16]
    except:
        pass
    if i%16 ==0:
        new_bottom = heights[i-1]
        if bottom == new_bottom:
            break


0 commentaires

1
votes

Le nombre dans API? TM = 1565542075617 code> est l'horodatage de l'époque en millisecondes. Cela peut ne pas être nécessaire pour la demande.

Il est important de voir quelles données la demande envoie à quel serveur répondra. Dans la demande XHR, faites défiler jusqu'à Demande de la charge utile code> pour voir la charge utile. P>

ci-dessous est un code Python qui charge recettes_per_page code> nombre de recettes, après la première page. Décalage code> Nombre de recettes. P>

import requests

offset = 50
recipes_per_page = 50
data = [{'jsonrpc': '2.0', 'method': 'recipe.get_trending', 'id': 1, 'params': [offset, recipes_per_page, None, False]}]
response = requests.post('https://indianrecipes.com/api', json=data)

recipes = response.json()[0]['result']['recipes']


2 commentaires

Merci d'avoir répondu, très utile. Cependant, j'ai des doutes. Que fait la réponse.json () et comment devrais-je continuer si je veux charger toute réponse.json () à un bel objet à soupe.


Réponse est un objet requests.Response.Response (voir la documentation dans ici ). Response.json () suppose que la réponse est au format JSON et tente d'analyser le intervention.Content et renvoyer un dictionnaire des données. Comme la réponse du serveur est à Json, vous pouvez essentiellement l'analyser en tant que dictionnaire Python. Vous n'avez pas besoin d'utiliser une belle soupe, car elle est censée être utilisée pour HTML / XML à la place. J'espère que ça aide.



1
votes

J'ai fait un script simple, où vous spécifiez le nombre de recettes par page et le nombre de pages que vous souhaitez gratter. Il renvoie des données dans le format JSON: xxx

impression: xxx


0 commentaires