Спарсить информацию о товаре из интернет магазина
Нужно спарсить информацию о товаре в интернет магазине (https://www.perekrestok.ru). Однако нужно не просто получить информацию о товарах по поисковому запросу (например, https://www.perekrestok.ru/catalog/search?text=Лук), что просто и является элементарным парсером.
У пользователя запрашивается два параметра: точный адрес (до улицы и дома) и поисковой запрос (например, "лук", "тортик"), далее пользователю должны быть выданы в качестве результата цены на все товары с первой страницы поиска в формате json.
Как спарсить страницу я знаю, однако не совсем понимаю, на какой запрос я могу получить в результат страницу с продуктами и ценами для конкретного адреса?
Ответы (1 шт):
У перекрестка есть апи для аякса с номерами страниц и текстовым запросом:
https://www.perekrestok.ru/catalog/search?page=1&sort=weight_desc&text=%D0%BB%D1%83%D0%BA&ajax=true
Правда в ответе HTML
{"count":233,"html":"<ul class=\"xf-catalog js-catalog\" id=\"catalogItems\"\n data-gtm-category-id=\"\"\n data-gtm-category-name=\"\"\n data-gtm-total=\"0\"\n>\n <li class=\"xf-catalog__page-num\"><span>2<\/span><\/li>\n <li class=\"js-catalog-product _additionals xf-catalog__item\">\n <div class=\"xf-product js-product \"\n data-id=\"393090\"\n data-url=\"https:\/\/www.perekrestok.ru\/catalog\/393090\/quickView\"\n data-is-packaging-sale=\"\"\n data-packing-quantum=\"0\"\n data-package=\"0\"\n data-gtm-location=\"\"\n data-gtm-position=\"1\"\n data-gtm-category-id=\"1342\"\n data-gtm-category-name=\"\u041e\u0432\u043e\u0449\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u044b\"\n data-gtm-product-id=\"393090\"\n data-gtm-product-name=\"\u041a\u043e\u043a\u0442\u0435\u0439\u043b\u044c Sebastian Guerola \u041e\u043b\u0438\u0432\u043a\u0438 \u041b\u0443\u043a \u041a\u043e\u0440\u043d\u0438\u0448\u043e\u043d\u044b 370\u0433\"\n data-gtm-product-vendor-id=\"179451\"\n data-gtm-product-vendor-name=\"Aceitunas Guerola\"\n data-gtm-is-available=\"\"\n data-block-type=\"catalogProductCard\"\n data-quantum-images-count=\"0\"\n >\n \n <div class=\"xf-product__picture xf-product-picture\" >\n <a href=\"\/catalog\/konservy-orehi-sousy\/ovoschnye-konservy\/kons-kokt-olivlukkornish-370g--393090\" class=\"xf-product-picture__link js-product__image\">\n <img src=\"data:image\/gif;base6 .... 'ProductName': '\u0422\u043e\u043c\u0430\u0442\u044b \u041c\u0430\u0440\u043a\u0435\u0442 \u041f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u043e\u043a \u0440\u0435\u0437\u0430\u043d\u044b\u0435 \u0441 \u043b\u0443\u043a\u043e\u043c \u0438 \u0447\u0435\u0441\u043d\u043e\u043a\u043e\u043c 390\u0433',\n },\n {\n 'ProductId': '306496',\n 'ProductName': '\u041f\u0440\u0438\u043f\u0440\u0430\u0432\u0430 Maggi \u0417\u0430\u0436\u0430\u0440\u043a\u0430 c \u043b\u0443\u043a\u043e\u043c \u0438 \u043c\u043e\u0440\u043a\u043e\u0432\u044c\u044e 60\u0433',\n },\n {\n 'ProductId': '458407',\n 'ProductName': '\u0427\u0438\u043f\u0441\u044b Pringles \u0441\u043e \u0432\u043a\u0443\u0441\u043e\u043c \u0437\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u043b\u0443\u043a\u0430 165\u0433',\n },\n {\n 'ProductId': '318369',\n 'ProductName': '\u0412\u0430\u0440\u0435\u043d\u0438\u043a\u0438 \u0421\u044b\u0442\u044b\u0439 \u043f\u0430\u043f\u0430 \u0441 \u043a\u0430\u0440\u0442\u043e\u0444\u0435\u043b\u0435\u043c \u043b\u0443\u043a\u043e\u043c \u0438 \u0433\u0440\u0438\u0431\u0430\u043c\u0438 450\u0433',\n },\n {\n 'ProductId': '351303',\n 'ProductName': '\u041b\u0430\u043f\u0448\u0430 \u0411\u0438\u0433 \u041b\u0430\u043d\u0447 \u0441 \u0442\u0443\u0448\u0435\u043d\u043e\u0439 \u043a\u0443\u0440\u0438\u0446\u0435\u0439 \u0438 \u043b\u0443\u043a\u043e\u043c 90\u0433',\n },\n {\n 'ProductId': '311395',\n 'ProductName': '\u0427\u0438\u043f\u0441\u044b Pringles \u0441\u043e \u0432\u043a\u0443\u0441\u043e\u043c \u0441\u043c\u0435\u0442\u0430\u043d\u044b \u0438 \u043b\u0443\u043a\u0430 165\u0433',\n },\n {\n 'ProductId': '311965',\n 'ProductName': '\u041a\u0440\u0435\u043a\u0435\u0440 Tuc c\u043e \u0432\u043a\u0443\u0441\u043e\u043c \u0441\u043c\u0435\u0442\u0430\u043d\u044b \u0438 \u043b\u0443\u043a\u0430 100\u0433',\n },\n {\n 'ProductId': '331332',\n 'ProductName': '\u0427\u0438\u043f\u0441\u044b Tyrrells \u0441\u043e \u0432\u043a\u0443\u0441\u043e\u043c \u0441\u044b\u0440\u0430 \u0427\u0435\u0434\u0434\u0435\u0440 \u0438 \u043b\u0443\u043a\u0430-\u0440\u0435\u0437\u0430\u043d\u0435\u0446 150\u0433',\n },\n {\n 'ProductId': '696477',\n 'ProductName': '\u0425\u043b\u0435\u0431\u0446\u044b Take a Bite \u041a\u0443\u043a\u0443\u0440\u0443\u0437\u043d\u043e-\u0440\u0438\u0441\u043e\u0432\u044b\u0435 \u0441 \u043b\u0443\u043a\u043e\u043c 150\u0433',\n },\n {\n 'ProductId': '311388',\n 'ProductName': '\u0427\u0438\u043f\u0441\u044b Pringles Xtra \u0441\u043e \u0432\u043a\u0443\u0441\u043e\u043c \u0441\u043c\u0435\u0442\u0430\u043d\u044b \u0438 \u043b\u0443\u043a\u0430 150\u0433',\n },\n {\n 'ProductId': '480226',\n 'ProductName': '\u0427\u0438\u043f\u0441\u044b Pringles \u0441\u043e \u0432\u043a\u0443\u0441\u043e\u043c \u0441\u043c\u0435\u0442\u0430\u043d\u044b \u0438 \u043b\u0443\u043a\u0430 70\u0433',\n },\n {\n 'ProductId': '311392',\n 'ProductName': '\u0427\u0438\u043f\u0441\u044b Pringles \u0441\u043e \u0432\u043a\u0443\u0441\u043e\u043c \u0441\u044b\u0440\u0430 \u0438 \u043b\u0443\u043a\u0430 165\u0433',\n },\n {\n 'ProductId': '313385',\n 'ProductName': '\u0427\u0438\u043f\u0441\u044b Lorenz Bavarian Chips \u0420\u043e\u0441\u0442\u0431\u0438\u0444 \u0441 \u043b\u0443\u043a\u043e\u043c \u043f\u043e-\u0448\u0432\u0430\u0431\u0441\u043a\u0438 75\u0433',\n }\n ]\n });\n<\/script>"}
Но его можно парсить - только убрать экраны
data-gtm-product-name=\"\u0411\u0435\u0439\u043a\u0438\u0442\u0441\u044b Hammock \u043f\u0448\u0435\u043d\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u041f\u0430\u0440\u043c\u0435\u0437\u0430\u043d \u0438 \u0430\u043b\u044c\u043f\u0438\u0439\u0441\u043a\u0438\u0439 \u043b\u0443\u043a 140\u0433\"\n data-gtm-product-vendor-id=\"141151\"\n data-gtm-product-vendor-name=\"\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u0421\u043d\u044d\u043a\u0441\"\n
только убрать экраны
encoded = json.loads(data)['html']
decoded = bytes(encoded, "utf-8").decode("unicode_escape")
...Бейкитсы Hammock пшеничные запеченные Пармезан и альпийский лук 140г...