1. 项目背景与需求分析
最近帮朋友解决了一个实际需求:他需要定期获取扬州人才公寓的最新房源信息,但手动查询效率太低。作为一个有经验的开发者,我第一时间想到了用Selenium实现自动化爬取。这个方案不仅能解决他的问题,还能为其他有类似需求的人提供参考。
人才公寓信息通常发布在政府或指定平台上,这类网站有几个特点:需要登录、有动态加载内容、可能存在简单验证机制。传统requests爬虫难以应对这些情况,而Selenium能完美模拟人工操作,处理各种前端交互。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与工具准备
2.1 为什么选择Selenium
相比其他爬虫方案,Selenium的优势在于:
- 能处理JavaScript渲染的页面
- 可以模拟点击、输入等用户操作
- 支持处理简单验证码(非图形识别类)
- 调试直观,可实时观察浏览器行为
我选择了Python+Selenium组合,因为:
- Python语法简洁,适合快速开发
- Selenium的Python API文档完善
- 社区支持好,遇到问题容易找到解决方案
2.2 环境搭建步骤
- 安装Python 3.8+(推荐使用Anaconda管理环境)
- 安装Selenium包:
pip install selenium - 下载对应浏览器的WebDriver(以Chrome为例):
- 查看Chrome版本(chrome://settings/help)
- 下载匹配的ChromeDriver(https://chromedriver.chromium.org/)
- 将chromedriver.exe放在项目目录或系统PATH路径
注意:浏览器和WebDriver版本必须严格匹配,否则会报错
3. 爬虫核心实现
3.1 页面分析与元素定位
首先需要分析目标网站结构。以扬州人才服务网为例:
- 打开开发者工具(F12),切换到Elements面板
- 使用选择器工具定位关键元素:
- 登录表单的用户名、密码输入框
- 房源列表的容器元素
- 分页按钮
- 单个房源信息的CSS选择器
通过分析发现,房源信息通常包含在<div class="house-item">这样的元素中,内部有价格、面积、地址等子元素。
3.2 登录自动化实现
python复制from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# 等待元素加载
username = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "username"))
)
password = driver.find_element(By.ID, "password")
# 输入凭据并提交
username.send_keys("your_username")
password.send_keys("your_password")
driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
3.3 数据爬取与分页处理
python复制def scrape_houses():
houses = []
while True:
# 等待房源列表加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "house-list"))
)
# 获取当前页所有房源
items = driver.find_elements(By.CLASS_NAME, "house-item")
for item in items:
house = {
"title": item.find_element(By.CLASS_NAME, "title").text,
"price": item.find_element(By.CLASS_NAME, "price").text,
"area": item.find_element(By.CLASS_NAME, "area").text,
"address": item.find_element(By.CLASS_NAME, "address").text
}
houses.append(house)
# 尝试翻页
try:
next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page")
if "disabled" in next_btn.get_attribute("class"):
break
next_btn.click()
time.sleep(2) # 防止请求过快
except:
break
return houses
4. 反爬应对策略
4.1 常见反爬措施
政府类网站通常有以下防护:
- 登录验证码
- 请求频率限制
- 用户行为检测
- IP限制
4.2 解决方案
-
验证码处理:
- 简单数字验证码:可通过Selenium自动识别输入
- 复杂图形验证码:建议人工干预或使用专业识别服务
-
请求控制:
python复制import random time.sleep(random.uniform(1, 3)) # 随机延迟 -
User-Agent轮换:
python复制from fake_useragent import UserAgent ua = UserAgent() options = webdriver.ChromeOptions() options.add_argument(f'user-agent={ua.random}') -
使用代理IP(需谨慎合规):
python复制options.add_argument('--proxy-server=http://ip:port')
5. 数据存储与分析
5.1 存储方案选择
根据数据量大小可选择:
- 小规模:CSV或Excel
- 中规模:SQLite
- 大规模:MySQL/MongoDB
推荐使用Pandas处理数据:
python复制import pandas as pd
df = pd.DataFrame(houses)
df.to_csv("yangzhou_houses.csv", index=False)
5.2 数据分析示例
python复制# 价格分析
df["price_num"] = df["price"].str.extract(r'(\d+)').astype(float)
print(f"平均价格:{df['price_num'].mean()}元")
print(f"最高价格:{df['price_num'].max()}元")
# 区域分布
print(df["address"].value_counts())
6. 完整代码结构
code复制/project-root
│── /config
│ └── settings.py # 配置文件
│── /utils
│ ├── browser.py # 浏览器操作封装
│ └── anti_spider.py # 反爬应对工具
│── main.py # 主程序
│── requirements.txt # 依赖文件
└── README.md # 项目说明
7. 实际踩坑与解决方案
7.1 元素定位失败问题
现象:有时元素明明存在却定位不到
原因:页面未完全加载或元素在iframe中
解决:
python复制# 显式等待
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "element-id"))
)
# 切换到iframe
driver.switch_to.frame("iframe-name")
7.2 浏览器自动关闭问题
现象:脚本结束后浏览器立即关闭
解决:添加调试选项
python复制options = webdriver.ChromeOptions()
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=options)
7.3 验证码处理技巧
对于简单数字验证码,可以尝试:
- 截图验证码区域
- 使用OCR库识别(如pytesseract)
- 自动填入结果
python复制from PIL import Image
import pytesseract
element = driver.find_element(By.ID, "captcha-image")
element.screenshot("captcha.png")
text = pytesseract.image_to_string(Image.open("captcha.png"))
driver.find_element(By.ID, "captcha-input").send_keys(text)
8. 项目优化方向
-
定时自动执行:
- 使用Windows任务计划或Linux crontab
- 或者直接在Python中用APScheduler
-
异常通知:
- 添加邮件/SMS通知功能
- 出现异常时自动发送警报
-
可视化展示:
- 使用Pyecharts生成价格走势图
- 构建房源地图分布
-
部署为服务:
- 使用Flask/Django提供API
- 打包成可执行文件供非技术人员使用
9. 法律与道德注意事项
- 遵守robots.txt协议
- 控制请求频率,避免对服务器造成压力
- 仅爬取公开数据,不绕过登录获取隐私信息
- 数据仅用于个人学习研究
- 考虑使用官方API替代爬虫(如有提供)
我在实际项目中发现,政府类网站的数据获取需要特别注意合规性。建议先查阅网站的《数据使用协议》,必要时可以联系网站管理员咨询数据获取方式。
