Запросы Python Webscrape против селена

Мне не очень понятен ответ, который я получаю здесь. Выглядит незавершенным. Мне было интересно, неправильный ли это подход и следует ли переключиться на селен. Я пытаюсь получить все пункты меню вместе с ценами и надстройками здесь. Я просто проверял ответ. Любое руководство было бы очень полезно. Спасибо

import requests
from bs4 import BeautifulSoup


url = 'https://www.swiggy.com/dapi/menu/v4/full?lat=12.9715987&lng=77.5945627&menuId=41100'
page = requests.get(url).json()
for k, v in page.items():
    print(v)

На первый взгляд, это не вопрос request vs selenium. Не могли бы вы улучшить свой вопрос и предоставить ожидаемый результат, пожалуйста.

HedgeHog 25.12.2020 11:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
151
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что происходит?

Думайте, что это не вопрос request против selenium для парсинга веб-страниц, потому что все, что вы делаете, это запрашиваете API и получаете json ответ.

И ваш код отлично работает так, как он написан, но то, что вы ожидаете сделать, это что-то другое, поэтому вам нужно иметь дело с итерацией dict по-другому.

Это поможет:

page['data']['menu']['items'].items()

Пример

import requests

url = 'https://www.swiggy.com/dapi/menu/v4/full?lat=12.9715987&lng=77.5945627&menuId=41100'
page = requests.get(url).json()

for k, v in page['data']['menu']['items'].items():
    print(v)

Выход

{'id': 8194821, 'name': 'Egg Omelette', 'category': 'Quick Bites', 'description': '', 'cloudinaryImageId': '', 'recommended': 0, 'inStock': 0, 'isVeg': 0, 'enabled': 1, 'displayOrder': 0, 'price': 8500, 'variants_new': {'exclude_list': [], 'variant_groups': []}, 'addons': [{'group_id': 21778839, 'group_name': 'Addons', 'choices': [{'id': 17471659, 'name': 'Watermelon Juice', 'price': 10000, 'inStock': 0, 'isVeg': 1, 'order': 1, 'default': 0}, {'id': 17471658, 'name': 'Coke (750 ml)', 'price': 6000, 'inStock': 1, 'isVeg': 1, 'order': 1, 'default': 0}], 'maxAddons': -1, 'maxFreeAddons': -1, 'minAddons': 0, 'order': 1}, {'group_id': 21778838, 'group_name': 'Beverage Addons', 'choices': [{'id': 17471658, 'name': 'Coke (750 ml)', 'price': 6000, 'inStock': 1, 'isVeg': 1, 'order': 1, 'default': 0}], 'maxAddons': -1, 'maxFreeAddons': -1, 'minAddons': 0, 'order': 1}], 'cropChoices': 2, 'itemScore': 0, 'itemDiscount': 0, 'isPopular': 0, 'restId': '41100', 'showMC': 0, 'ribbon': {'text': 'Must Try', 'textColor': '#ffffff', 'topBackgroundColor': '#d53d4c', 'bottomBackgroundColor': '#b02331'}, 'attributes': {'portionSize': '', 'vegClassifier': 'EGG', 'accompaniments': ''}, 'itemNudgeType': ''}
{'id': 8194822, 'name': 'Paneer Sholey', 'category': 'Starters', 'description': 'Fried cottage cheese cubes, tossed in signature spices & curry leaves garnish.', 'cloudinaryImageId': '', 'recommended': 0, 'inStock': 0, 'isVeg': 1, 'enabled': 1, 'displayOrder': 0, 'price': 22000, 'variants_new': {'exclude_list': [], 'variant_groups': []}, 'cropChoices': 2, 'itemScore': 0, 'itemDiscount': 0, 'isPopular': 0, 'restId': '41100', 'showMC': 0, 'attributes': {'portionSize': '', 'vegClassifier': 'VEG', 'accompaniments': ''}, 'itemNudgeType': ''}
...

Благодарю за ваш ответ. Если бы вы могли просто взглянуть на ответ выше. Я как бы ищу это только с описанием Блюда. Я слаб с json. Очень признателен,

Abhishek Rai 25.12.2020 13:02

Чтобы получить только описание, сделайте так: print(v.get('description')) вместо print(v)

HedgeHog 25.12.2020 13:09

возвращает None ..Мы используем get?

Abhishek Rai 25.12.2020 13:16

Это сработало. ` print("Описание: {}".format(v["описание"]))`

Abhishek Rai 25.12.2020 13:17

Вы можете использовать оба, это зависит от того, что вы делали раньше :for k,v in page['data']['menu']['items'].items(): print(v['description'])

HedgeHog 25.12.2020 13:18

Ах!.. Спасибо за информацию. Я могу принять только 1 ответ, иначе я бы принял оба. Ваш и другой очень помогли мне понять, как получить элементы внутри этих диктов. Проголосовал!.Еще раз спасибо.

Abhishek Rai 25.12.2020 13:21

Чтобы разобраться с json и попытаться найти значение для ключа, скрытого на нескольких уровнях вложенности, перейдите по этой ссылке. В середине страницы есть хороший фрагмент кода для определения значения ключа независимо от того, насколько глубоко он вложен. hackersandslacckers.com/extract-data-from-complex-json-python Хотя будьте осторожны с дубликатами ключей, потому что он вернет значения для всех из них. Также не идеально передавать через нее целую страницу с точки зрения скорости, поэтому, если вы можете извлечь один из нижних вложенных уровней ближе к тому месту, где, по вашему мнению, находится ключ, это будет быстрее.

Roochiedoor 29.07.2021 11:18
Ответ принят как подходящий

Попробуй это:

import requests

url = 'https://www.swiggy.com/dapi/menu/v4/full?lat=12.9715987&lng=77.5945627&menuId=41100'
page = requests.get(url).json()
menu_items = page["data"]["menu"]["items"]

for k, v in menu_items.items():
    print("Name: {}".format(v["name"]))
    print("Description: {}".format(v["description"]))
    print("Price: {}".format(v["price"]))
    if "addons" in v.keys():
        for i in v["addons"]:
            print("\t{}".format(i["group_name"]))
            for j in i["choices"]:
                print("\t\tName: {}".format(j["name"]))
                print("\t\tPrice: {}".format(j["price"]))
                print()
    print()

Благодарю за ваш ответ. Всего один вопрос. Могу я получить описание блюда, кажется, я видел его в ответе. Просто я не очень хорошо разбираюсь в json .

Abhishek Rai 25.12.2020 13:00

Кстати, переменная page — это просто вложенный словарь.

Ahmet Yıldırım 25.12.2020 15:28

Другие вопросы по теме