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

Scrapy可爬取主页但无法爬取目标页面的问题求助

问题根源

你爬取的目标页面是AngularJS构建的单页应用(SPA),URL里的#/station/4属于前端路由——服务器返回的初始HTML里并没有h1.ng-binding的实际内容,这些内容是浏览器加载并执行JavaScript后动态渲染出来的。Scrapy默认只会抓取服务器返回的静态HTML,自然拿不到动态生成的数据。

两种可行解决方案

方案1:直接调用后端API(推荐)

打开浏览器开发者工具(F12),切换到「Network」标签页,刷新目标页面后过滤「XHR」请求,能找到站点数据的接口。比如这个页面的站点信息接口大概率是https://weather.aims.gov.au/api/stations/4,直接请求这个接口就能拿到结构化的JSON数据,比渲染页面高效得多。

示例代码:

class GBRspider(scrapy.Spider):
    name = 'GBRspider'
    allowed_domains = ['weather.aims.gov.au']
    start_urls = ['https://weather.aims.gov.au/api/stations/4']

    def parse(self, response):
        station_data = response.json()
        yield {
            'station_name': station_data.get('name')  # 接口返回的name字段就是"Davies Reef"
        }

方案2:用Playwright渲染动态页面

如果找不到合适的API,可以用Scrapy结合Playwright模拟浏览器执行JS,获取渲染后的完整页面。

步骤1:安装依赖

pip install scrapy-playwright

步骤2:修改Scrapy配置(settings.py)

DOWNLOAD_HANDLERS = {
    "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
    "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}

PLAYWRIGHT_LAUNCH_OPTIONS = {
    "headless": True,  # 无头模式,设为False会弹出浏览器窗口
}

步骤3:修改爬虫代码

class GBRspider(scrapy.Spider):
    name = 'GBRspider'
    allowed_domains = ['weather.aims.gov.au']
    start_urls = ['https://weather.aims.gov.au/#/station/4']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url,
                meta={"playwright": True},
                callback=self.parse
            )

    def parse(self, response):
        yield {
            'temp': response.css('h1.ng-binding::text').get().strip()
        }
补充提示
  • 优先选API方案,速度快、资源占用少,数据格式还规整。
  • 用Playwright时,首次运行会自动下载浏览器驱动,不用手动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:32:43