在数据采集领域,爬虫工程师常常面临目标网站的反爬机制,如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)
即使使用代理IP,过高频率的请求仍可能触发反爬。因此需要:
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">time.sleep(random.uniform(1, 3))</font>**
。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
贝壳网常见的人机验证方式包括:
对于滑块验证,可通过 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()
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">move_by_offset</font>**
分阶段滑动,模拟真人操作。对于图形验证码(如文字点选),可使用 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)
结合上述技术,完整流程如下:
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]) # 打印部分内容
应对贝壳网的IP封禁和人机验证,核心策略包括:
未来,随着反爬技术升级,可能需要更高级的方案,如:
合理使用这些技术,可以在合规的前提下高效采集数据。