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
相关产品推荐
相关产品推荐

