使用Selenium爬取Zillow遭遇PX Captcha的解决方法问询
Zillow爬取时PX Captcha验证无法通过的解决方法
问题描述
我正在开展一个基于Selenium的项目,目标是访问Zillow网站获取出租房源的链接、价格和地址等信息。我的代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH) driver.get(ZILLOW_HOUSES_URL) house_links = driver.find_elements(By.CSS_SELECTOR, LINKS_CSS_SELECTOR) prices = driver.find_elements(By.CSS_SELECTOR, PRICES_CSS_SELECTOR) addresses = driver.find_elements(By.CSS_SELECTOR, ADDRESSES_CSS_SELECTOR) for link in house_links: print(link.get_attribute('href')) for price in prices: print(price.text.split('+')[0].split(', ')[0].split('/')[0]) for address in addresses: print(address.text)
但运行代码时,多数情况下进入Zillow网页后会出现PX Captcha验证。我长按完成验证后,页面仍会显示‘Try Again’要求重试,多次尝试均无法通过,请问该如何解决这个问题?
可行解决方案
- 伪装浏览器指纹:Selenium默认的自动化特征极易被识别,通过ChromeOptions配置消除自动化标识:
from selenium.webdriver.chrome.options import Options options = Options() # 禁用自动化提示条 options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) # 设置真实浏览器的User-Agent options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") # 启用图片加载,避免无图模式被标记 options.add_argument("--enable-images") # 禁用沙箱模式,避免环境异常被识别 options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") driver = webdriver.Chrome(options=options, executable_path=CHROME_DRIVER_PATH) # 移除navigator.webdriver标识 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") - 模拟真实用户交互节奏:避免页面加载完成后立即爬取,加入随机延迟和滚动操作:
import time import random driver.get(ZILLOW_HOUSES_URL) # 随机等待2-5秒,模拟用户等待页面加载 time.sleep(random.uniform(2, 5)) # 模拟滚动浏览行为 driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2)") time.sleep(random.uniform(1, 3)) driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") time.sleep(random.uniform(1, 3)) - 切换代理IP:若当前IP因频繁访问被风控,添加代理IP更换访问源:
# 在ChromeOptions中配置代理 options.add_argument('--proxy-server=http://your-proxy-ip:port') - 优先使用官方API:通过Zillow官方提供的API接口获取数据,这是合规且无验证码风险的方案,能直接拿到结构化的房源信息。
- 持久化验证后的Cookie:手动通过验证后,保存当前Cookie,后续请求时加载Cookie跳过验证:
import pickle # 保存Cookie到本地文件 with open('zillow_cookies.pkl', 'wb') as f: pickle.dump(driver.get_cookies(), f) # 后续加载Cookie driver.get(ZILLOW_HOUSES_URL) with open('zillow_cookies.pkl', 'rb') as f: cookies = pickle.load(f) for cookie in cookies: driver.add_cookie(cookie) driver.refresh()
内容的提问来源于stack exchange,提问作者Codermint
相关产品推荐
相关产品推荐

