Nano Hash - криптовалюты, майнинг, программирование

Очистите динамически загружаемую страницу с помощью BeautifulSoup

Я новичок в пакете BeautifulSoup. Я пытаюсь собрать все рецепты блюд, ссылки и ингредиенты с сайта https://indianrecipes.com/new_and_popular. Проблема в том, что этот сайт загружает больше еды только при прокрутке вниз. Я передал этот вопрос Beautifulsoup - очищать веб-страницу - динамически загружаемая страница, но не могу не придаю этому большого значения. Я проверил вкладку сети в элементе проверки и обнаружил, что каждый раз, когда я прокручиваю вниз, отправляется запрос XHR.

api?tm=1565542062069
api?tm=1565542065302
api?tm=1565542073116
api?tm=1565542075617

Можно ли смоделировать такой запрос в python, чтобы извлечь все рецепты еды с этой страницы?


  • пожалуйста, попробуйте и попробуйте закодировать это и поделитесь, где вы застряли. 11.08.2019

Ответы:


1

Число в api?tm=1565542075617 — это временная метка эпохи в миллисекундах. Это может быть не нужно для запроса.

Важно видеть, какие данные отправляет запрос, на что сервер ответит. В запросе XHR прокрутите вниз до Request Payload, чтобы увидеть полезную нагрузку.

Ниже приведен код Python, который загружает recipes_per_page рецептов после исходного offset количества рецептов.

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']
11.08.2019
  • Спасибо за ответ, очень полезно. Однако у меня есть некоторые сомнения. что делает response.json() и что мне делать, если я хочу загрузить весь response.json() в красивый объект супа. 12.08.2019
  • response — это объект requests.Response (см. документацию в здесь) . response.json() предполагает, что ответ находится в формате JSON, и пытается проанализировать response.content и вернуть словарь данных. Поскольку ответ сервера находится в формате JSON, вы можете проанализировать его как словарь Python. Вам не нужно использовать Beautiful Soup, так как вместо этого предполагается использовать его для HTML/XML. Надеюсь, это поможет. 13.08.2019

  • 2

    Вы должны использовать селен для загрузки javascript с веб-страницы в html, а затем использовать код прокрутки селена

    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
    

    а затем используйте beautifusoup, чтобы очистить данные, которые вам нужны,

    soup = BeautifulSoup(driver.page_source, 'lxml')

    11.08.2019

    3

    Я сделал простой скрипт, в котором вы указываете количество рецептов на странице и количество страниц, которые хотите очистить. Он возвращает данные в формате JSON:

    from itertools import count, islice
    import requests
    import json
    
    url = 'https://indianrecipes.com/api'
    data = {"id":1,"jsonrpc":"2.0","method":"recipe.get_trending","params":[50,50,None,False]}
    
    per_page = 50
    num_pages = 2
    
    for i, c in enumerate( islice(count(0, per_page), 0, num_pages), 1):
        print('Page no.{} :'.format(i))
        print('-' * 80)
        data['params'][0] = c
        data['params'][1] = per_page
        json_data = requests.post(url, json=data).json()
        print(json.dumps(json_data, indent=4))
        print('-' * 80)
    

    Отпечатки:

    Page no.1 :
    --------------------------------------------------------------------------------
    {
        "id": 1,
        "jsonrpc": "2.0",
        "result": {
            "recipes": [
                {
                    "has_video": false,
                    "id": 8630002,
                    "image_url": "//lh3.googleusercontent.com/zgZHuLeSg_lKRc66RycpaDoSVMULp3puzoignsoEH40DJBQtOpQi0Ub1L1ET52VFhd3ZUF8r8ZEiD_kEsZNQPloO3_T1KW9sbBE",
                    "link": "//indianrecipes.com/recipe/Dahi-Vada_Ad3A",
                    "name": "Dahi Vada",
                    "rating": 5.0,
                    "score": 0.0
                },
                {
                    "has_video": false,
                    "id": 9330018,
                    "image_url": "//lh3.googleusercontent.com/HXd-CD3P0U_v4ItJplGsT5oKZ8mKAAA0AXRsgeOoeLeH4ggvyGRdx-6Y_J1H1EdRLv5De7b5oYqeHkBts4VwIpqBAHNA_OYP8g",
                    "link": "//indianrecipes.com/recipe/French-Egg-Casserole_D9aa",
                    "name": "French Egg Casserole",
                    "rating": 0.0,
                    "score": 0.0
                },
    
    ...and so on
    
    11.08.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..