应对贝壳网的IP封禁与人机验证,需结合代理IP池、请求频率控制、Selenium自动化及OCR识别等技术。以下是具体策略及代码实现:
1. 应对IP封禁1.1 使用代理IP池频繁请求同一IP易被封禁,需通过代理IP池轮换。代码示例:
import requestsfrom fake_useragent import UserAgentPROXIES = { "http": "http://123.123.123.123:8888"
, "https": "http://123.123.123.123:8888"
}headers = {"User-Agent": UserAgent().random}url = "https://www.ke.com"try:
response = requests.get(url, headers=headers, proxies=PROXIES, timeout=5) print(response.status_code)except Exception as e: print("请求失败:", e)优化建议:
- 多IP轮换:每次请求更换代理。
- IP质量检测:定期验证代理可用性。
- 高匿代理:避免被识别为代理流量。
1.2 请求频率控制加入随机延迟,避免高频请求触发反爬。代码示例:
import timeimport randomdef crawl_with_delay(url): try: time.sleep(random.uniform(1, 3)) # 随机延迟1~3秒 response = requests.get(url, headers=headers, proxies=PROXIES) return response.text except Exception as e: print("请求失败:", e) return None2. 绕过人机验证贝壳网常见验证方式包括滑块验证、点击验证及短信验证。
2.1 Selenium模拟浏览器操作适用于滑块验证,通过模拟人工滑动破解。代码示例:
from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsoptions = webdriver.ChromeOptions()options.add_argument("--headless") # 无界面模式driver = webdriver.Chrome(options=options)driver.get("https://www.ke.com"
)# 模拟滑块拖动slider = driver.find_element_by_css_selector(".slider") # 替换为实际元素action = ActionChains(driver)action.click_and_hold(slider).move_by_offset(300, 0).release().perform()driver.quit()优化方案:
- 轨迹模拟:分阶段滑动(如先快后慢)。
- 手动介入:复杂验证时暂停脚本,人工完成。
2.2 OCR识别验证码针对图形验证码(如文字点选),使用OCR或第三方打码平台。代码示例:
import pytesseractfrom PIL import Imageimport requestsfrom io import BytesIOresponse = requests.get("https://www.ke.com/captcha.jpg"
)img = Image.open(BytesIO(response.content))text = pytesseract.image_to_string(img)print("识别结果:", text)优化方案:
- 深度学习模型:如CRNN训练专用验证码识别。
- 第三方平台:超级鹰、联众打码等。
3. 综合方案结合代理IP、频率控制、Selenium及OCR,完整流程如下:
- 使用代理IP池轮换请求。
- 控制请求频率,降低检测风险。
- 遇到验证码时,调用Selenium或OCR处理。
完整代码示例:
import requestsfrom selenium import webdriverimport timeimport random# 代理配置PROXIES = ["http://user:pass@proxy_ip:port"
]def get_with_proxy(url): proxy = random.choice(PROXIES) try: proxies = {"http": proxy, "https": proxy} response = requests.get(url, proxies=proxies, timeout=5) if "验证码" in response.text: return handle_captcha(url) return response.text except Exception as e: print("请求失败:", e) return Nonedef handle_captcha(url): options = webdriver.ChromeOptions() options.add_argument("--headless") driver = webdriver.Chrome(options=options) driver.get(url) time.sleep(2) # 添加验证码处理逻辑 page_source = driver.page_source driver.quit() return page_sourceif __name__ == "__main__": data = get_with_proxy("https://www.ke.com"
) if data: print(data[:500])4. 结论核心策略总结:
- 代理IP池:避免单一IP封禁。
- 频率控制:模拟人类操作节奏。
- Selenium:处理滑块/点击验证。
- OCR/打码平台:识别复杂验证码。
未来方向:
- 深度学习破解验证码。
- 浏览器指纹伪装(如修改User-Agent、Canvas指纹)。
- 分布式爬虫架构分散请求。
合理运用上述技术,可在合规前提下高效采集数据。