Как очистить данные с помощью следующей кнопки с многоточием с помощью Scrapy - PullRequest
0 голосов
/ 09 апреля 2019

Мне нужно постоянно получать данные о следующей кнопке <1 2 3 ... 5>, но в источнике нет ссылки на href, а также есть elipsis.Любая идея, пожалуйста?вот мой код

def start_requests(self):
    urls = (
        (self.parse_2, 'https://www.forever21.com/us/shop/catalog/category/f21/sale'),
    )
    for cb, url in urls:
        yield scrapy.Request(url, callback=cb)


def parse_2(self, response):
    for product_item_forever in response.css('div.pi_container'):
        forever_item = {
            'forever-title': product_item_forever.css('p.p_name::text').extract_first(),
            'forever-regular-price': product_item_forever.css('span.p_old_price::text').extract_first(),
            'forever-sale-price': product_item_forever.css('span.p_sale.t_pink::text').extract_first(),
            'forever-photo-url': product_item_forever.css('img::attr(data-original)').extract_first(),
            'forever-description-url': product_item_forever.css('a.item_slider.product_link::attr(href)').extract_first(),
        }
        yield forever_item

Пожалуйста, помогите мне спасибо

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Похоже, эта нумерация страниц использует дополнительный запрос к API. Итак, есть два пути:

  1. Используйте Splash / Selenium для рендеринга страниц по шаблону QHarr;
  2. Сделайте те же вызовы API. Проверьте инструменты разработчика, вы найдете POST-запрос https://www.forever21.com/us/shop/Catalog/GetProducts будет все необходимые параметры (они слишком длинные, поэтому я не буду публиковать полный список здесь).
1 голос
/ 09 апреля 2019

URL-адрес изменяется, поэтому вы можете указать номер страницы и результаты на страницу в URL-адресе, например:

https://www.forever21.com/uk/shop/catalog/category/f21/sale/#pageno=2&pageSize=120&filter=price:0,250

Как упоминалось в @vezunchik и обратной связи OP, для этого подхода требуется селен / всплеск, чтобы js мог работать настраница.Если вы шли по этому маршруту, вы можете просто нажимать следующий (.p_next) до тех пор, пока не получите конечную страницу, поскольку легко получить номер последней страницы (.dot + .pageno) из документа.


Я ценю, что вы пытаетесь с помощью скрапа.

Демонстрация идеи с селеном на случай, если это поможет.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url_loop = 'https://www.forever21.com/uk/shop/catalog/category/f21/sale/#pageno={}&pageSize=120&filter=price:0,250'
url = 'https://www.forever21.com/uk/shop/catalog/category/f21/sale'
d = webdriver.Chrome()
d.get(url)

d.find_element_by_css_selector('[onclick="fnAcceptCookieUse()"]').click() #get rid of cookies
items =  WebDriverWait(d,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#products .p_item")))
d.find_element_by_css_selector('.selectedpagesize').click()
d.find_elements_by_css_selector('.pagesize')[-1].click() #set page result count to 120
last_page = int(d.find_element_by_css_selector('.dot + .pageno').text) #get last page

if last_page > 1:
    for page in range(2, last_page + 1):
        url = url_loop.format(page)
        d.get(url)
        try:
            d.find_element_by_css_selector('[type=reset]').click() #reject offer
        except:
            pass
        # do something with page
        break #delete later
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...