Скребущий мимо бесконечный скроллер - PullRequest
1 голос
/ 04 июля 2019

Я уже определил другие страницы с помощью инструмента проверки Chrome. Тип XHR и страницы различаются по 2 числам. «https://us.pandora.net/en/charms/?sz=30&start=30&format=page-element" является первой страницей, «https://us.pandora.net/en/charms/?sz=30&start=60&format=page-element" - это страница вторая, "https://us.pandora.net/en/charms/?sz=30&start=90&format=page-element" - это третья страница и т. Д.

Это продолжается до страницы 990.

Вот мой код:

from urllib.request import urlopen
from bs4 import BeautifulSoup
url = "https://us.pandora.net/en/charms/?sz=30&start=60&format=page-element"
html = urlopen(url)

page_count = 0
while page_count < 0:
    url = "https://us.pandora.net/en/charms/?sz=30&start=%d&format=page-element" %(page_count)
    page_count += 30

html = urlopen(url)

Я стремлюсь получить все продукты, которые продаются. Читая исходный код, используя inspect, я обнаружил, что товары, которые продаются, имеют два класса: «цена-продажа» и «цена-стандарт».

Здесь я пытался получить все продукты, используя приведенный выше код, чтобы взломать бесконечный скроллер, и получить все продукты с продажей в списке.

def retrieve_products_sale():
    all_products = soup.find_all('li', class_='grid-tile')
    num_of_prods = []
    for items in all_products:
        if items == class_'price-standard':
            num_of_prods.append(items)
    print(num_of_prods)
if __name__ == '__main__':
    retrieve_products_sale()

Не уверен, что делать дальше.

Позвольте мне добавить: Моя конечная цель - собрать все товары, которые продаются в списке. И сколько продуктов, и на сколько процентов каждая вещь.

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Вы можете создать цикл while внутри функции и использовать .select() вместо find_all(), чтобы избежать определения дополнительных циклов для фильтрации желаемых элементов.

import requests
from bs4 import BeautifulSoup    

url = "https://us.pandora.net/en/charms/?sz=30&start={}&format=page-element"

def fetch_items(link,page):
    while page<=100:
        print("current page no: ",page)
        res = requests.get(link.format(page),headers={"User-Agent":"Mozilla/5.0"})
        soup = BeautifulSoup(res.text,"lxml")
        for items in soup.select('.grid-tile .price-standard'):
            product_list.append(items)

        print(product_list)
        page+=30

if __name__ == '__main__':
    page = 0
    product_list = []
    fetch_items(url,page)
0 голосов
/ 04 июля 2019

это может быть что-то вроде этого

from urllib.request import urlopen
from bs4 import BeautifulSoup    

def retrieve_products_sale(soup):
    all_products = soup.find_all('li', class_='grid-tile')
    num_of_prods = []
    for items in all_products:
        if items == class_'price-standard':
            num_of_prods.append(items)
    print(num_of_prods)

if __name__ == '__main__':
    page_count = 0        
    while page_count <= 990:
        url = "https://us.pandora.net/en/charms/?sz=30&start=%d&format=page-element" % page_count
        html = urlopen(url)
        soup = BeautifulSoup(html, "html.parser")
        retrieve_products_sale(soup)
        page_count += 30

Если вам нужны все данные в одном списке, используйте список вне функции

from urllib.request import urlopen
from bs4 import BeautifulSoup    

def retrieve_products_sale(soup):
    all_products = soup.find_all('li', class_='grid-tile')
    num_of_prods = []
    for items in all_products:
        if items == class_'price-standard':
            num_of_prods.append(items)
    #print(num_of_prods)
    return num_of_prods

if __name__ == '__main__':
    page_count = 0      
    all_results = []  
    while page_count <= 990:
        url = "https://us.pandora.net/en/charms/?sz=30&start=%d&format=page-element" % page_count
        html = urlopen(url)
        soup = BeautifulSoup(html, "html.parser")
        all_results += retrieve_products_sale(soup)
        page_count += 30

    print(all_results)

РЕДАКТИРОВАТЬ: Я не знаю, что вы пытаетесь делать с

 if items == class_'price-standard':

, поэтому я использую

 for x in items.find_all(class_='price-standard'):

, который дает некоторые результаты (но не на всех страницах)

from urllib.request import urlopen
from bs4 import BeautifulSoup    

def retrieve_products_sale(soup):
    all_products = soup.find_all('li', class_='grid-tile')
    num_of_prods = []
    for items in all_products:
        for x in items.find_all(class_='price-standard'):
            #print(x)
            num_of_prods.append(x)
    print(num_of_prods)

if __name__ == '__main__':
    page_count = 0        
    while page_count <= 990:
        url = "https://us.pandora.net/en/charms/?sz=30&start=%d&format=page-element" % page_count
        html = urlopen(url)
        soup = BeautifulSoup(html, "html.parser")
        retrieve_products_sale(soup)
        page_count += 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...