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

