не парсит данные

Рейтинг: 0Ответов: 2Опубликовано: 10.01.2023

Надо спарсить данные, название бренда, цену. Сайт динамический. Парсит только первые 32 значения, остальне не берет. Откуда можно подтянуть остальные данные? JSON не нашел, быть может есть какой то другой вариант? Желательно с помощью requests.

import requests
from bs4 import BeautifulSoup as bs
import time

url = 'https://www.zalando.co.uk/men/?q=hoodie&order=price&dir=asc'
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0'
}
r = requests.post(url, headers = headers)
#print(r.status_code)

src = r.text
soup = bs(src, 'lxml')
items = soup.find_all('div', class_='DT5BTM w8MdNG cYylcv _1FGXgy _75qWlu iOzucJ JT3_zV vut4p9')
num = 0
for i in items:
    num = num + 1
    print(num)
    try:
        brand_name = i.find('div', class_='_3KN5mc').find('h3')
        print(brand_name)
        time.sleep(1)
    except Exception:
        data = "None"
        print(data)

Ответы

▲ 1Принят

Продукты запрашиваются через POST запрос на https://www.zalando.co.uk/api/graphql/ увидеть это вы можете открыв консоль (F12) перейти на вкладку Network => Fetch/XHR

▲ 2
import requests
from bs4 import BeautifulSoup as bs
import json

url = 'https://www.zalando.co.uk/men/?q=hoodie&p=1&order=price&dir=asc'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0'
}
r = requests.get(url, headers=headers)
soup = bs(r.text, 'lxml')
items = soup.find('script', class_="re-data-el-hydrate")
dct = json.loads(items.text)['graphqlCache']
qq = (z['data']['product']['name'] for x, z in dct.items() if '8a351c55e39' in x)
for i,x in enumerate(qq, 1):
    print(i, x)

1 CORE HOODIE BIG & TALL - Hoodie - dusty pink
2 EMBROIDERED - Sweatshirt - light green

...

83 RAINBOW HEART HOODIE PRIDE UNISEX - Hoodie - black
84 UNISEX - Hoodie - bordeaux