如何无需硬编码Cookie用Python爬取Zoopla房源链接?
核心思路:模拟真实浏览器行为维持有效会话
Zoopla的反爬机制依赖Cookie验证、JS渲染和会话追踪,直接用requests或硬编码Cookie都难以长期稳定,以下是可行解决方案:
1. 使用Playwright/Puppeteer模拟完整浏览器交互
这类工具会自动处理Cookie生成、JS渲染和会话维持,完全复刻真人浏览流程:
- 初始化浏览器实例,打开Zoopla搜索页面
- 等待动态内容加载完成
- 直接从页面提取房源链接,会话会自动保留有效Cookie
- 示例代码(Playwright 同步版):
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 调试时可关闭headless模式查看页面加载情况 browser = p.chromium.launch(headless=True) page = browser.new_page() # 访问目标搜索页 page.goto("https://www.zoopla.co.uk/for-sale/property/oxford-oxfordshire/") # 等待房源链接元素加载完成 page.wait_for_selector("a[data-testid='listing-details-link']") # 提取所有房源链接的href属性 links = page.locator("a[data-testid='listing-details-link']").all_attribute_values("href") for link in links: print(f"https://www.zoopla.co.uk{link}") browser.close()
- 优势:无需手动管理Cookie,自动应对大多数反爬检测
2. 复用CloudScraper会话维持Cookie
CloudScraper本身可绕过Cloudflare,但默认每次请求新建会话,复用同一个实例就能自动维持Cookie:
import cloudscraper import time # 初始化Scraper实例,建立持久会话 scraper = cloudscraper.create_scraper() # 先访问Zoopla首页,获取初始有效Cookie scraper.get("https://www.zoopla.co.uk/") # 添加随机延迟模拟真人操作 time.sleep(3) # 请求目标搜索页 response = scraper.get("https://www.zoopla.co.uk/for-sale/property/oxford-oxfordshire/") # 后续请求复用同一个scraper实例,Cookie会自动携带 # 示例:再次请求分页内容 response_page2 = scraper.get("https://www.zoopla.co.uk/for-sale/property/oxford-oxfordshire/?page_size=25&pn=2")
- 注意:若会话仍频繁失效,可添加随机User-Agent、请求间隔进一步模拟真人行为
3. 手动分析Cookie生成逻辑(适合进阶场景)
若不想依赖浏览器模拟,可通过抓包分析Zoopla的Cookie生成规则:
- 用浏览器开发者工具抓包首次访问的请求/响应,识别关键Cookie(如
__cf_bm、zuid)的生成逻辑 - 用
execjs执行页面中的关键JS代码,生成符合要求的Cookie并注入requests会话 - 弊端:维护成本高,Zoopla反爬规则更新后需重新分析适配
关键注意事项
- 避免高频请求:添加2-5秒的随机延迟,限制单日请求量,防止触发IP封禁
- 使用代理IP:若单IP被限制,切换代理分散请求来源
- 校验选择器有效性:定期检查页面结构,确保选择器对应最新的房源链接元素
内容的提问来源于stack exchange,提问作者SMTH
相关产品推荐
相关产品推荐

