Scrapy Link Extractor适配滚动分页爬取的规则调整咨询
滚动分页爬取的实现方案
针对该站点滚动时URL按page-N规律变化的情况,可通过以下两种方式实现全部分页内容的爬取:
方法一:直接构造分页URL发起请求
由于站点分页URL遵循明确规律(第一页无page后缀,后续为https://www.softsurroundings.com/clothing/tops/page-{页码}),可以直接生成所有分页URL并发起请求,无需依赖Link Extractor自动提取:
- 替换原
start_urls,重写start_requests方法:
def start_requests(self): # 示例爬取1-10页,可根据实际需求调整上限,或改为动态判断终止条件 for page_num in range(1, 11): if page_num == 1: url = "https://www.softsurroundings.com/clothing/tops/" else: url = f"https://www.softsurroundings.com/clothing/tops/page-{page_num}" yield scrapy.Request(url, callback=self.parse)
- 保留原有的商品链接提取规则和
parse_items回调,每个分页页面的商品都会被正常解析。
方法二:补充分页链接提取规则(需页面支持)
若页面源码中存在隐性的下一页线索(比如<link rel="next">标签),可以修改rules配置,添加分页链接提取规则:
rules = [ # 提取商品链接并解析 Rule(LinkExtractor(restrict_css='.flexWrap.flexStart.prw .thumb a[class="thmNm"]'), callback='parse_items', follow=True), # 自动跟进下一页链接(需页面存在rel="next"标签) Rule(LinkExtractor(restrict_xpaths='//link[@rel="next"]'), follow=True) ]
注意:如果站点滚动加载时不会在初始HTML中注入rel="next"标签,这种方法无效,此时优先选择方法一。
进阶:动态判断终止分页
如果不确定总页数,可在解析方法中判断当前页面是否有商品,自动停止爬取:
def parse(self, response): # 提取当前页商品链接 item_links = response.css('.flexWrap.flexStart.prw .thumb a[class="thmNm"]::attr(href)').getall() # 无商品则终止 if not item_links: return # 遍历商品链接发起解析请求 for link in item_links: yield response.follow(link, callback=self.parse_items) # 构造下一页URL current_page = response.meta.get('page', 1) next_page = current_page + 1 if current_page == 1: next_url = f"https://www.softsurroundings.com/clothing/tops/page-{next_page}" else: # 从当前URL提取页码并构造下一页地址 page_segment = [seg for seg in response.url.split('/') if seg.startswith('page-')][0] current_page = int(page_segment.split('-')[1]) next_url = response.url.replace(page_segment, f'page-{current_page + 1}') yield scrapy.Request(next_url, callback=self.parse, meta={'page': next_page})
这种方式会自动爬取直到没有商品的页面,无需预先设定总页数。
内容的提问来源于stack exchange,提问作者Malik Zohaib Mustafa
相关产品推荐
相关产品推荐

