Python爬虫如何应对贝壳网的IP封禁与人机验证?

简介: Python爬虫如何应对贝壳网的IP封禁与人机验证?
  1. 引言
    在数据采集领域,爬虫工程师常常面临目标网站的反爬机制,如IP封禁、人机验证(如滑块验证、点击验证、短信验证等)。贝壳网作为国内知名的房产交易平台,其反爬策略较为严格,包括但不限于:
    ● IP封禁:频繁请求会导致IP被拉黑,无法继续访问。
    ● 人机验证:如滑块验证、短信验证等,阻止自动化工具访问。
    ● 动态Token:关键请求需要携带动态生成的Token,防止直接模拟请求。
  2. 应对IP封禁的策略
    2.1 使用代理IP池
    频繁请求同一IP容易被封禁,因此需要采用 代理IP池 进行轮换。
    代码实现:使用代理IP请求贝壳网
    import requests
    from fake_useragent import UserAgent

代理IP示例(实际使用时建议从代理池API获取)

PROXIES = {
"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)
代理池优化建议

  1. 多IP轮换:每次请求更换不同代理。
  2. IP质量检测:定期检测代理IP是否可用。
  3. 使用高匿代理:避免被识别为代理流量。
    2.2 请求频率控制
    即使使用代理IP,过高频率的请求仍可能触发反爬。因此需要:
    ● 随机延迟:在请求之间加入 time.sleep(random.uniform(1, 3))。
    ● 降低并发量:避免多线程过高并发。
    代码示例:随机延迟+代理IP
    import time
    import random

def 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 None

  1. 绕过贝壳网的人机验证
    贝壳网常见的人机验证方式包括:
  2. 滑块验证(如极验验证)
  3. 点击验证(如点选图中文字)
  4. 短信验证(登录时需要手机验证码)
    3.1 使用Selenium模拟浏览器操作
    对于滑块验证,可通过 Selenium + ChromeDriver 模拟人工滑动。
    代码实现:自动滑动验证
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    import time

配置Chrome无头模式(可选)

options = webdriver.ChromeOptions()
options.add_argument("--headless") # 无界面模式
options.add_argument("--disable-blink-features=AutomationControlled")

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()

time.sleep(2)
driver.quit()
优化方案
● 轨迹模拟:使用 move_by_offset 分阶段滑动,模拟真人操作。
● 手动介入:遇到复杂验证时,可暂停脚本手动完成验证。
3.2 OCR识别验证码
对于图形验证码(如文字点选),可使用 OCR(光学字符识别) 技术自动识别。
代码示例:OCR识别验证码
import pytesseract
from PIL import Image
import requests
from io import BytesIO

下载验证码图片

response = requests.get("https://www.ke.com/captcha.jpg")
img = Image.open(BytesIO(response.content))
text = pytesseract.image_to_string(img)
print("识别结果:", text)
优化方案
● 深度学习模型:使用CNN训练专用验证码识别模型(如CRNN)。
● 第三方打码平台:如超级鹰、联众打码。

  1. 综合方案:代理IP + Selenium + OCR
    结合上述技术,完整流程如下:
  2. 使用代理IP池 轮换请求,避免封禁。
  3. 控制请求频率,降低被检测风险。
  4. 遇到验证码时,使用Selenium模拟或OCR识别。
    完整代码示例
    import requests
    from selenium import webdriver
    import time
    import random
    from selenium.webdriver.chrome.options import Options

16yun代理信息

proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

代理IP池(包含认证信息)

PROXIES = [
f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",

# 可以添加更多代理

]

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 None

def handle_captcha(url):

# 配置Chrome代理
chrome_options = Options()

# 添加代理认证
proxy_auth = f"{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
chrome_options.add_argument(f'--proxy-server=http://{proxy_auth}')

# 其他Chrome配置
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# chrome_options.add_argument("--headless")  # 无头模式

driver = webdriver.Chrome(options=chrome_options)
driver.get(url)
time.sleep(2)

# 这里添加滑块/验证码处理逻辑
# 示例:打印页面标题
print("当前页面标题:", driver.title)

page_source = driver.page_source
driver.quit()
return page_source

if name == "main":
data = get_with_proxy("https://www.ke.com")
if data:
print(data[:500]) # 打印部分内容

  1. 结论
    应对贝壳网的IP封禁和人机验证,核心策略包括:
  2. 代理IP池:避免单一IP被封。
  3. 请求频率控制:模拟人类操作节奏。
  4. Selenium自动化:处理滑块、点击验证码。
  5. OCR/打码平台:识别复杂验证码。
    未来,随着反爬技术升级,可能需要更高级的方案,如:
    ● 深度学习破解验证码
    ● 浏览器指纹伪装
    ● 分布式爬虫架构
    合理使用这些技术,可以在合规的前提下高效采集数据。
相关文章
|
5月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
6月前
|
数据采集 Web App开发 自然语言处理
新闻热点一目了然:Python爬虫数据可视化
新闻热点一目了然:Python爬虫数据可视化
|
5月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
6月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
934 19
|
5月前
|
数据采集 存储 JSON
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
|
5月前
|
数据采集 存储 JavaScript
解析Python爬虫中的Cookies和Session管理
Cookies与Session是Python爬虫中实现状态保持的核心。Cookies由服务器发送、客户端存储,用于标识用户;Session则通过唯一ID在服务端记录会话信息。二者协同实现登录模拟与数据持久化。
|
6月前
|
数据采集 Web App开发 前端开发
处理动态Token:Python爬虫应对AJAX授权请求的策略
处理动态Token:Python爬虫应对AJAX授权请求的策略
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
634 6
|
数据采集 JSON 前端开发
Python爬虫进阶:使用Scrapy库进行数据提取和处理
在我们的初级教程中,我们介绍了如何使用Scrapy创建和运行一个简单的爬虫。在这篇文章中,我们将深入了解Scrapy的强大功能,学习如何使用Scrapy提取和处理数据。
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
688 4

推荐镜像

更多