Scrapy 爬虫中的分页爬取:如何处理分页数据?
在 Scrapy 爬虫中,分页爬取是一种经常使用的技巧。一般来说,分页是通过改变 URL 中的参数实现的。因此,在编写 Scrapy 爬虫的时候,我们需要考虑如何处理这些参数并在不同页面中提取数据。下面是一个基本的示例,演示如何处理分页数据。
假设我们要爬取网站 pidancode.com 上的文章,该网站的 URL 参数是 page=1 表示第一页,page=2 表示第二页,以此类推。首先,我们需要定义爬虫的起始 URL,即第一页的 URL。
import scrapy class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['https://pidancode.com/articles?page=1'] def parse(self, response): # parse first page pass
在 parse
方法中,我们将第一页的 HTML 内容作为参数传入,并在其中提取数据。接下来,我们需要找到下一页的链接,并用相同的方式爬取。
import scrapy class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['https://pidancode.com/articles?page=1'] def parse(self, response): # parse first page pass # find next page link next_page_url = response.css('a.next-page::attr(href)').get() if next_page_url: yield scrapy.Request(response.urljoin(next_page_url), callback=self.parse)
在上面的代码中,我们使用 CSS 选择器找到了下一页链接的 href
属性,并将其封装为一个 scrapy.Request
对象。这个对象用 response.urljoin
方法构造了一个绝对 URL,确保了我们能够正确地跨页面爬取数据。
最后,我们需要考虑结束爬取的条件。在本例中,我们可以使用一个简单的条件来检查是否还有下一页:
import scrapy class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['https://pidancode.com/articles?page=1'] def parse(self, response): # parse first page pass # find next page link next_page_url = response.css('a.next-page::attr(href)').get() if next_page_url: yield scrapy.Request(response.urljoin(next_page_url), callback=self.parse)
在上面的代码中,如果没有下一页链接,则 Scrapy 将自动停止爬取。这是因为 Scrapy 爬虫默认使用深度优先搜索算法,即每次遍历一条链,直到链结束。当找不到下一页链接时,算法就会停止。
相关文章