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

使用Scrapy Playwright爬取Zillow仅获8条房源,如何解决?

问题分析与解决方案

核心问题

你遇到的问题主要来自三个方面:

  • 单次滚动不足以触发Zillow全部房源的加载
  • 依赖初始response解析内容,动态加载的房源不会更新到该response中
  • 等待滚动完成的判断逻辑不准确

具体修正方案

1. 修复页面内容获取逻辑

动态加载的内容不会同步到Scrapy的response对象里,必须从Playwright的page实例中获取最新的页面HTML,再用Selector解析:

async def parse(self, response):
    page = response.meta["playwright_page"]  # 正确的page实例获取方式
    # 获取滚动加载后的完整页面HTML
    page_html = await page.content()
    sel = Selector(text=page_html)
    
    items = ZillowScrapItem()
    price = sel.css('.bqsBln span::text').extract()
    address = sel.css('address::text').extract()
    bed = sel.css('.dmDolk li:nth-child(1) b::text').extract()
    bath = sel.css('.dmDolk li:nth-child(2) b::text').extract()
    area = sel.css('.dmDolk li~ li+ li b::text').extract()
    link = sel.css('.property-card-data a::attr(href)').extract()
    img_link = sel.css('.gFiOAr::attr(src)').extract()
    
    items['price'] = price
    items['address'] = address
    items['bed'] = bed
    items['bath'] = bath
    items['area'] = area
    items['link'] = link
    items['img_link'] = img_link
    yield items
    
    await page.close()  # 解析完成后关闭page释放资源

2. 优化滚动加载逻辑

单次滚动仅能触发部分房源加载,需要循环滚动直到页面停止新增内容:
修改start_requests并在parse中添加循环滚动逻辑:

def start_requests(self):
    yield scrapy.Request(
        url="https://www.zillow.com/san-jose-ca/scroll",
        meta=dict(
            playwright=True,
            playwright_include_page=True,
            errback=self.errback,
        ),
        callback=self.parse
    )

async def parse(self, response):
    page = response.meta["playwright_page"]
    
    # 循环滚动加载直到没有新内容
    last_height = await page.evaluate("document.body.scrollHeight")
    while True:
        await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
        # 等待内容加载,可根据网络情况调整等待时长
        await page.wait_for_timeout(2000)
        new_height = await page.evaluate("document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height
    
    # 等待所有房源卡片加载完成
    await page.wait_for_selector('.property-card-data a', state='attached')
    
    # 后续解析逻辑同上述代码...

3. 修正等待逻辑

避免依赖特定房源的ID选择器(如#zpid_19470263),这类ID是动态生成的,改用通用选择器等待所有房源加载完成。

额外注意点

  • WSL环境下需确保Playwright浏览器驱动已正确安装,执行playwright install命令完成配置
  • Zillow存在反爬机制,建议添加随机等待时间,避免IP被封禁
  • 定期检查CSS选择器的有效性,Zillow的class名称可能会动态更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:07:48