Python 如何使用带省略号的“下一步”按钮使用Scrapy刮取数据

Python 如何使用带省略号的“下一步”按钮使用Scrapy刮取数据,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我需要在“下一步”按钮上连续获取数据,但在源代码中没有提供href链接,也有省略号。有什么想法吗?这是我的密码 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, cal

我需要在“下一步”按钮上连续获取数据,但在源代码中没有提供href链接,也有省略号。有什么想法吗?这是我的密码

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

请帮我谢谢

url更改,以便您可以在url中指定页码和每页的结果,例如

https://www.forever21.com/uk/shop/catalog/category/f21/sale/#pageno=2&pageSize=120&filter=price:0,250
正如@vezunchik和OP feedback所提到的,这种方法需要selenium/splash来允许js在页面上运行。如果你沿着这条路线走,你只需点击下一页(
.p_next
),直到你得到最后一页,因为很容易从文档中获取最后一页的页码(
.dot+.pageno


我很感激你试着用scrapy

用硒元素演示这个想法,以备不时之需

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

这种分页似乎使用了对API的额外请求。 因此,有两种方法:

  • 使用Splash/Selenium按QHarr模式呈现页面
  • 对API进行相同的调用。检查开发人员工具,您将发现POST请求
    https://www.forever21.com/us/shop/Catalog/GetProducts
    将显示所有正确的参数(它们太长了,所以我不会在这里发布完整的列表)

  • 您好@Qharr感谢您的回答,我尝试了这一部分,但它不起作用,如果您尝试更改页面号,例如pageno=2,它将自动返回到pageno=1,但尚未测试,但如果您的浏览器自动显示url,则会将您带到正确的页面并停留在那里。但也就是说,如果你沿着这条路线走,你可以点击下一步,直到你得到最后一页,因为如果允许运行javascript,很容易从文档中获取最后一页的页码。但即使是我也试图更改它从未运行过的url,除非我点击特定的分页下一步按钮,该按钮的编号是selenium?hi@Qharr!我真的很感激你帮助我解决问题的努力,但不幸的是我正在使用SHub,需要使用Scrapy,有什么可能的解决方法吗?非常感谢您hi@vezunchik感谢您的帮助,但我很抱歉,我不知道如何对API进行相同的调用?这相当耗时,您应该自己尝试一下。检查开发工具,获取curl,检测所有需要的字段、标题,可能是cookies,然后将它们设置为请求。非常感谢您的帮助@vezunchik,我尝试了您告诉我的内容,但我真的不明白。这真的令人沮丧,因为我对这门语言还很陌生。