Очистить данные с ленивой страницы загрузки - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь очистить данные с этой веб-страницы, и я успешно могу очистить данные, что мне нужно.
Проблема в том, что загруженная страница с использованием requests содержит только 45 сведений о продукте. но на самом деле на этой веб-странице имеется более 4000 продуктов, это происходит потому, что все данные не доступны напрямую, они отображаются только в том случае, если вы прокрутите страницу вниз.
Я хотел бы просмотреть все продукты, доступные на странице.

КОД

import requests
from bs4 import BeautifulSoup
import json
import re

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}

base_url = "link that i provided"
r = requests.get(base_url,headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')

scripts = soup.find_all('script')[11].text
script = scripts.split('=', 1)[1]
script = script.rstrip()
script = script[:-1]

data = json.loads(script) 

skus = list(data['grid']['entities'].keys())

prodpage = []
for sku in skus:
   prodpage.append('https://www.ajio.com{}'.format(data['grid']['entities'][sku]['url']))

print(len(prodpage))   

1 Ответ

3 голосов
/ 08 апреля 2020

Прокрутка вниз означает, что данные генерируются с помощью JavaScript, поэтому у вас есть несколько вариантов: первый - использовать селен, второй - отправить тот же Ajax запрос, который использует веб-сайт следующим образом:

def get_source(page_num = 1):
        url = 'https://www.ajio.com/api/category/830216001?fields=SITE&currentPage={}&pageSize=45&format=json&query=%3Arelevance%3Abrickpattern%3AWashed&sortBy=relevance&gridColumns=3&facets=brickpattern%3AWashed&advfilter=true'

        res = requests.get(url.format(1),headers={'User-Agent': 'Mozilla/5.0'})
        if res.status_code == 200 :
                return res.json()
# data = get_source(page_num = 1)
# total_pages = data['pagination']['totalPages'] # total pages are 111
prodpage = []
for i in range(1,112):
        print(f'Getting page {i}')
        data = get_source(page_num = i)['products']
        for item in data:
                prodpage.append('https://www.ajio.com{}'.format(item['url']))
        if i == 3: break
print(len(prodpage)) # output 135 for 3 pages 
...