Очистить категорию продуктов с помощью Python - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь почистить эту страницу, на ней около 21000 товаров

Мой вопрос заключается в том, как получить все названия продуктов, изображение и полную иерархию категорий из 21000 продуктов. Изображение и название находятся на той же странице, но категория находится на самой странице продукта.

из-за нумерации страниц я могу получить только 32 названия продуктов и изображения, которые присутствуют на первой странице

КОД для получения заголовка с первой страницы

import requests
from bs4 import BeautifulSoup

main_url = "https://paytmmall.com/fmcg-foods-glpid-101405?discoverability=online&use_mw=1"

import requests
result = requests.get(main_url)
print(result.text)

sp = BeautifulSoup(result.text,'html.parser')
print(sp.prettify())

getallTitle = [x.a.get('title') for x in sp.findAll("div", class_ = "_3WhJ")]

print(str(len(getallTitle )) + " fetched products Title")
print("/n")
print(getallTitle[2])

Ответы [ 3 ]

2 голосов
/ 21 мая 2019

Вы можете получить доступ к ответу json каждой страницы.Но имейте в виду, что на странице всего 32 товара, что означает, что вы будете запрашивать 659 раз.

import requests
import math

url = 'https://middleware.paytmmall.com/fmcg-foods-glpid-101405'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}

payload = {
'channel': 'web',
'child_site_id': '6',
'site_id': '2',
'version': '2',
'discoverability': 'online',
'use_mw': '1',
'category': '101405',
'page': '1',
'page_count': '1',
'items_per_page': '32'}

# Get total pages needed
jsonData = requests.post(url, headers=headers, data=payload).json()
total_count = jsonData['totalCount']
total_pages = total_count / 32
pages = math.ceil(total_pages)


# Iterate through each page
for page in range(1,pages + 1):
    payload.update({'page':page, 'page_count':page})

    jsonData = requests.post(url, headers=headers, data=payload).json()

    for product in jsonData['grid_layout']:
        name = product['name']
        brand = product['brand']
        actual_price = product['actual_price']
        try:
            category = product['attributes']['type']
        except:
            category = 'N/A'

        print ('%-20s ₹%-5s %-20s ₹%s' %(category, actual_price, brand, name))

Вывод:

Tea                  ₹185   Red Label            Red Label Tea 500 gm
Tea                  ₹93    Tata Tea Premium     Tata Tea Premium Leaf 250 gm
Tea                  ₹240   Red Label            Red Label Natural Care Tea 500 gm
N/A                  ₹230   Taj Mahal            Taj Mahal Tea 500 gm
Tea                  ₹120   Red Label            Red Label Natural Care Tea 250 gm
Dairy Whitener       ₹413   Nestle               Nestle Everyday Dairy Whitener Milk 1 kg
Sauces               ₹125   Kissan               Kissan Fresh Tomato Ketchup 950 gm
Whole Oats           ₹186   Quaker               Quaker Oats 1 kg Pouch
Tea                  ₹188   Tata Tea Premium     Tata Tea Premium Leaf 500 gm
Coffee               ₹90    Bru                  BRU Instant Coffee 50 gm
Almond               ₹300   Freshco              Freshco California Almonds 200Gm
Jam                  ₹250   Kissan               Kissan Mixed Fruit Jam 1.04 kg
Almond               ₹799   glomin               Glomin California Almond Raw 500 G 1Pc
Sauces               ₹152   Kissan               Kissan Sweet & Spicy Sauce 1 kg
Cashew Nut           ₹180   Nutty Gritties       Nutty Gritties Roasted Salted Cashews 80G
Coffee               ₹120   Bru                  BRU Gold Instant Coffee 50 gm
Tea                  ₹480   Red Label            Red Label Natural Care Tea 1 kg
Almond               ₹310   Miltop               Miltop California Almonds 250G
Cashew Nut           ₹425   glomin               Glomin Cashew 250 G 1Pc
Almond               ₹600   Wonderland           Wonderland California Almond 500g
Almond               ₹499   Shivram Peshawari & Bros Shivram Peshawari & Bros California Almonds/Badam 250 Grams
Peanut Butter        ₹425   Pintola              Pintola All Natural Peanut Butter 1 kg (Crunchy)
Soups                ₹55    Knorr                Knorr Classic Tomato Soup 53 gm
Peanut Butter        ₹425   Pintola              Pintola All Natural Peanut Butter 1 kg (Creamy)
Peanut Butter        ₹349   Pintola              Pintola Classic Peanut Butter 1 kg (Crcuncy)
Peanut Butter        ₹165   Pintola              Pintola All Natural Peanut Butter 350 gm (Crunchy)
Almond               ₹1599  glomin               Glomin Raw Almonds 1Kg (Pack Of 1)
Almond               ₹150   Nutty Gritties       Nutty Gritties Almonds 100G
Raisin               ₹250   OOSH                 Oosh Seedless Black Raisin 250G
N/A                  ₹455   Taj Mahal            Taj Mahal Tea 1 kg

Редактировать:

Если вы хотите иерархию, вам нужно будет перейти по ссылке каждого продукта и извлечь ее.Я предоставил код для этого, но имейте в виду, что это займет FORVER.Если предположить, что на запрос уходит около 2-3 секунд, это займет у вас около 18 часов.

# Iterate through each page
for page in range(1,pages + 1):
    payload.update({'page':page, 'page_count':page})

    jsonData = requests.post(url, headers=headers, data=payload).json()

    for product in jsonData['grid_layout']:
        name = product['name']
        brand = product['brand']
        actual_price = product['actual_price']
        img = product['image_url']
        category_id = product['category_id']

        new_url = product['newurl']

        jsonData_product = requests.get(new_url, headers=headers).json()

        category = '/'.join( [each['name'] for each in jsonData_product['ancestors'] ] )

        print ('Name: %s\nImage: %s\nCategory: %s\n' %(name, img, category))

Вывод:

Name: Red Label Tea 500 gm
Image: https://assetscdn1.paytm.com/images/catalog/product/F/FA/FASRED-LABEL-TETBL497475164B959/a_4.jpg
Category: Supermarket/Foods/Drinks & Beverages/Tea & Coffee/Red Label Tea 500 gm

Name: Tata Tea Premium Leaf 250 gm
Image: https://assetscdn1.paytm.com/images/catalog/product/F/FA/FASTATA-TEA-PREINNO985832A1E145F5/8.jpg
Category: Supermarket/Foods/Drinks & Beverages/Tea & Coffee/Tata Tea Premium Leaf 250 gm

Name: Red Label Natural Care Tea 500 gm
Image: https://assetscdn1.paytm.com/images/catalog/product/F/FA/FASRLNC-C-500GNTBL4974726639099/a_14.jpg
Category: Supermarket/Foods/Drinks & Beverages/Tea & Coffee/Red Label Tea & Coffee 500 Gm

Name: Taj Mahal Tea 500 gm
Image: https://assetscdn1.paytm.com/images/catalog/product/F/FA/FASTAJ-MAHAL-TEBIGB985832F0512392/0.jpg
Category: Supermarket/Foods/Drinks & Beverages/Tea & Coffee/Taj Mahal Tea 500 gm

Name: Red Label Natural Care Tea 250 gm
Image: https://assetscdn1.paytm.com/images/catalog/product/F/FA/FASNEW-RED-LABETBL49747FC4B364F/a_7.jpg
Category: Supermarket/Foods/Drinks & Beverages/Tea & Coffee/Red Label Natural Care Tea 250 gm

Name: Nestle Everyday Dairy Whitener Milk 1 kg
Image: https://assetscdn1.paytm.com/images/catalog/product/F/FA/FASNESTLE-EVERYTBL497478E1F2966/a_8.jpg
Category: Supermarket/Foods/Dairy Products/Dairy Whitener/Nestle Everyday Dairy Whitener Milk 1 kg

ИЛИ

Если все продукты относятся к одним и тем же категориям, то вам действительно нужно получить категории первого продукта, а затем применить ко всем остальным, когда вы будете перебирать страницы:

import requests
import math

url = 'https://middleware.paytmmall.com/fmcg-foods-glpid-101405'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}

payload = {
'channel': 'web',
'child_site_id': '6',
'site_id': '2',
'version': '2',
'discoverability': 'online',
'use_mw': '1',
'category': '101405',
'page': '1',
'page_count': '1',
'items_per_page': '32'}

# Get total pages needed
jsonData = requests.post(url, headers=headers, data=payload).json()
total_count = jsonData['totalCount']
total_pages = total_count / 32
pages = math.ceil(total_pages)


# Iterate through each page
category = ''
for page in range(1,pages + 1):
    payload.update({'page':page, 'page_count':page})

    jsonData = requests.post(url, headers=headers, data=payload).json()

    for product in jsonData['grid_layout']:
        name = product['name']
        brand = product['brand']
        actual_price = product['actual_price']
        img = product['image_url']
        category_id = product['category_id']

        if category == '':
            new_url = product['newurl']
            jsonData_product = requests.get(new_url, headers=headers).json()
            category = '/'.join( [each['name'] for each in jsonData_product['ancestors'] ][:-1] )

        print ('Name: %s\nImage: %s\nCategory: %s\n' %(name, img, category))
2 голосов
/ 21 мая 2019

Страница запрашивает первую страницу для контента следующим образом (который возвращает json).Посмотрите, можете ли вы изменить параметры, чтобы получить все результаты

Похоже, что вы можете изменить заголовок реферера и текущую страницу в теле, изменив URL для включения страницы, например

https://paytmmall.com/fmcg-foods-glpid-101405?discoverability=online&use_mw=1&page=2

Youможет извлечь общее количество результатов из вашего первого запроса

r['filters'][0]['values'][0]['count']

Вы знаете, что запрашиваете пакетами по 32 (хотя попробуйте увеличить его до максимально возможного значения).Затем вы можете рассчитать количество страниц / запросов, а затем выполнить цикл.

Python (запрос страницы 1)

import requests

headers = {
    'Content-Type' : 'application/json',
    'Referer' : 'https://paytmmall.com/fmcg-foods-glpid-101405?discoverability=online&use_mw=1',
    'User-Agent' : 'Mozilla/5.0'
}

body = {"tracking":{"current_page":"https://paytmmall.com/fmcg-foods-glpid-101405?discoverability=online&use_mw=1","prev_page":''},"context":{"device":{"os":"Win32","device_type":"PC","browser_uuid":"GA1.2.105449259.1558439396","ua":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36","connection_type":"Unknown"},"channel":"WEB","user":{"ga_id":"GA1.2.105449259.1558439396","user_id":''}}}

r = requests.post('https://middleware.paytmmall.com/fmcg-foods-glpid-101405?channel=web&child_site_id=6&site_id=2&version=2&discoverability=online&use_mw=1&items_per_page=32', json = body, headers = headers).json()
1 голос
/ 21 мая 2019

Вот как справиться с нумерацией страниц.Нумерация страниц - это не что иное, как отправка запроса по требованию, а не его получение сразу.Это означает, что каждый раз, когда вы нажимаете на любой номер страницы, вы видите некоторые изменения в соответствии с дизайном сайтов.В вашем случае URL-адрес меняется каждый раз, когда вы нажимаете на любую страницу.Полученный URL-адрес:

https://paytmmall.com/fmcg-foods-glpid-101405?discoverability=online&use_mw=1&category=101405&page=2

Если вы продолжите изменять страницу = 2 на любую страницу, которую хотите очистить, вы сможете очистить веб-сайт.

Логика:

main_url = "https://paytmmall.com/fmcg-foods-glpid-101405? discoverability=online&use_mw=1&category=101405&page="

for i in range(1,totalnumberofpages):
 url = main_url+str(i)
 #you logic to scrape one url
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...