python Webscrape запросы против selenium

#python #python-3.x #selenium #web-scraping #python-requests

#python #python-3.x #селен #веб-очистка #python-запросы

Вопрос:

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

 import requests
from bs4 import BeautifulSoup


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

Комментарии:

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

Ответ №1:

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

 import requests

url = 'https://www.swiggy.com/dapi/menu/v4/full?lat=12.9715987amp;lng=77.5945627amp;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("ttName: {}".format(j["name"]))
                print("ttPrice: {}".format(j["price"]))
                print()
    print()
 

Комментарии:

1. Спасибо за ваш ответ. Только один вопрос. Могу ли я получить описание блюда, я думаю, я видел это в ответе. Просто я не очень хорошо разбираюсь json .

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

Ответ №2:

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

Думаю, что это не вопрос request vs selenium для веб-очистки, потому что все, что вы делаете, это запрашиваете api и получаете json ответ.

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

Это сделает свое дело:

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

Пример

 import requests

url = 'https://www.swiggy.com/dapi/menu/v4/full?lat=12.9715987amp;lng=77.5945627amp;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 amp; 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': ''}
...
 

Комментарии:

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

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

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

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

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