You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬取Rightmove时如何在同一URL下实现多页房源翻页(不使用Selenium)

解决Rightmove爬虫无URL变化的翻页问题(无需Selenium)

嘿,我完全懂你遇到的麻烦!Rightmove的分页确实是靠JS动态加载的,下一页按钮根本没有直接跳转链接,而是通过URL里的index参数控制房源起始位置——每页固定显示24条,第1页对应index=0,第2页是index=24,第3页index=48,以此类推。不用Selenium完全能搞定,下面给你具体方案和代码修改:

核心思路

我们不用纠结下一页按钮的链接,直接构造带不同index值的URL就能实现翻页,步骤很清晰:

  • 先从页面提取总房源数量
  • 按每页24条的规则,算出需要爬取的总页数
  • 循环生成每个页面的URL,复用你的parse方法处理内容

修改后的爬虫代码

import scrapy

class listingsSpider(scrapy.Spider):
    name = 'listings'
    # 修正初始URL的转义字符,把&改成&避免解析问题
    start_urls = ['https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=STATION%5E1712&maxPrice=500000&radius=0.5&sortType=10&propertyTypes=&mustHave=&dontShow=&furnishTypes=&keywords=']
    # Rightmove固定每页显示24条房源
    PAGE_SIZE = 24

    def parse(self, response):
        current_index = int(response.url.split("index=")[-1]) if "index=" in response.url else 0
        self.logger.info(f'正在处理起始位置为 {current_index} 的页面')
        
        # 提取当前页面房源信息(保留你原有的逻辑,也可以优化xpath让结果更整洁)
        listings = response.xpath('//h2[@class="propertyCard-title"]')
        for listing in listings:
            yield {
                'Listing': listing.get().strip()
            }
        
        # 提取总房源数
        total_results_text = response.xpath('//span[@class="searchHeader-resultCount"]/text()').get()
        if not total_results_text:
            self.logger.warning("无法获取总房源数,终止翻页")
            return
        
        # 处理带逗号的数字字符串,比如"1,234"转成整数1234
        total_results = int(total_results_text.replace(',', ''))
        
        # 计算下一页的起始位置
        next_index = current_index + self.PAGE_SIZE
        
        # 只要下一页起始位置小于总房源数,就继续爬取
        if next_index < total_results:
            # 构造下一页URL
            if "index=" in response.url:
                next_url = response.url.split("index=")[0] + f"index={next_index}"
            else:
                next_url = response.url + f"&index={next_index}"
            yield scrapy.Request(next_url, callback=self.parse)

关键细节说明

  1. URL参数修正:初始URL里的&amp;要改成&,否则Scrapy解析URL会出错
  2. 总房源数提取:Rightmove在页面顶部会显示总结果数,我们提取数字部分并转成整数,用来判断何时停止翻页
  3. 翻页终止条件:当next_index超过总房源数时,停止请求,避免无效爬取
  4. 反爬提示:记得在settings.py里设置真实的USER_AGENT,还可以加DOWNLOAD_DELAY控制爬取速度,降低被封风险

为什么你的原代码没生效?

你原代码里试图提取下一页按钮的href,但Rightmove的下一页按钮是通过JavaScript触发请求的,根本没有直接的href属性,所以pageTest一直是None,自然不会触发翻页。而构造index参数的方法完全绕开了这个问题,效率和普通Scrapy请求一样高。

内容的提问来源于stack exchange,提问作者Luke Ashton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 03:07:44