📜  使用 Scrapy 进行分页 - 使用Python进行网页抓取

📅  最后修改于: 2022-05-13 01:55:38.057000             🧑  作者: Mango

使用 Scrapy 进行分页 - 使用Python进行网页抓取

使用 Scrapy 进行分页。网页抓取是一种从网站获取信息的技术。Scrapy 用作网页抓取的Python框架。从普通网站获取数据比较容易,只需拉取网站的HTMl,通过过滤标签获取数据即可。但是,如果您尝试获取的数据中存在分页,例如 – 亚马逊的产品可以有多个页面并成功地废弃所有产品,则需要分页的概念。

分页:分页,也称为分页,是将文档划分为离散页面的过程,这意味着不同页面上的数据捆绑。这些不同的页面有自己的 url。所以我们需要把这些url一个一个地抓取下来。但要记住的是何时停止分页。通常页面有下一个按钮,这个下一个按钮是可以的,当页面完成时它会被禁用。此方法用于获取页面的 url,直到下一个页面按钮可用,当它被禁用时,没有页面可供抓取。

使用scrapy应用分页的项目

从亚马逊网站抓取移动细节并在以下项目中应用分页。
抓取的详细信息涉及手机的名称和价格以及分页以抓取以下搜索 url 的所有结果

分页背后的逻辑:
此处 next_page 变量仅在下一页可用时获取下一页的 url,但如果没有剩余页面,则此 if 条件为 false。
next_page = response.xpath("//div/div/ul/li[@class='alast']/a/@href").get()
if next_page:
    abs_url = f"https://www.amazon.in{next_page}"
yield scrapy.Request(
    url=abs_url,
    callback=self.parse
)

笔记:

abs_url = f"https://www.amazon.in{next_page}"

这里需要取 https://www.amazon.in 是因为 next_page 是 /page2。这是不完整的,完整的网址是 https://www.amazon.in/page2

  • 获取细节的 xpath 需要被抓取 –
    按照以下步骤获取 xpath –
    项目的xpath:

    名称的xpath:

    价格的xpath:

    下一页的xpath:

  • 蜘蛛代码:从亚马逊网站抓取名称和价格,并在下面的代码中应用分页。
    import scrapy
      
    class MobilesSpider(scrapy.Spider):
        name = 'mobiles'
        # create request object initially
        def start_requests(self):
            yield scrapy.Request(
                url ='https://www.amazon.in / s?k = xiome + mobile + phone&crid'\
                + '= 2AT2IRC7IKO1K&sprefix = xiome % 2Caps % 2C302&ref = nb_sb_ss_i_1_5',
                callback = self.parse
            )
      
        #  parse products
        def parse(self, response):
            products = response.xpath("//div[@class ='s-include-content-margin s-border-bottom s-latency-cf-section']")
            for product in products:
                yield {
                    'name': product.xpath(".//span[@class ='a-size-medium a-color-base a-text-normal']/text()").get(),
                    'price': product.xpath(".//span[@class ='a-price-whole']/text()").get()
                }
      
            print()
            print("Next page")
            print()
            next_page = response.xpath("//div / div / ul / li[@class ='a-last']/a/@href").get()
            if next_page:
                abs_url = f"https://www.amazon.in{next_page}"
                yield scrapy.Request(
                    url = abs_url,
                    callback = self.parse
                )
            else:
                print()
                print('No Page Left')
                print()
    

抓取结果: